aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-04-05 14:26:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-04-05 14:26:59 +0000
commit3022186ac4da434ab341bd0e1cf2c4056e47833a (patch)
tree9f0f85e0f7095feb96e07a72efcf3caeca142c5d /gcc
parentac6929b5677230de8f6d3a3223a46bcce3f47144 (diff)
downloadgcc-3022186ac4da434ab341bd0e1cf2c4056e47833a.zip
gcc-3022186ac4da434ab341bd0e1cf2c4056e47833a.tar.gz
gcc-3022186ac4da434ab341bd0e1cf2c4056e47833a.tar.bz2
re PR middle-end/70526 (GCC 6 miscompiles Firefox JIT compiler)
2016-04-05 Richard Biener <rguenther@suse.de> PR tree-optimization/70526 * tree-sra.c (build_ref_for_offset): Use prev_base to extract the alias pointer type. * g++.dg/torture/pr70526.C: New testcase. From-SVN: r234749
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr70526.C35
-rw-r--r--gcc/tree-sra.c2
4 files changed, 47 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index abd195d..b7fc0cd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-04-05 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/70526
+ * tree-sra.c (build_ref_for_offset): Use prev_base to
+ extract the alias pointer type.
+
+2016-04-05 Richard Biener <rguenther@suse.de>
+
* dse.c (struct store_info): Remove alias_set member.
(struct read_info_type): Likewise.
(clear_alias_group, clear_alias_mode_table, clear_alias_mode_holder,
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f3d1a6e..fcb5222 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-05 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/70526
+ * g++.dg/torture/pr70526.C: New testcase.
+
2016-04-05 Jakub Jelinek <jakub@redhat.com>
PR target/70525
diff --git a/gcc/testsuite/g++.dg/torture/pr70526.C b/gcc/testsuite/g++.dg/torture/pr70526.C
new file mode 100644
index 0000000..37a3e5f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr70526.C
@@ -0,0 +1,35 @@
+// { dg-do run }
+
+typedef unsigned uint32_t;
+
+template<typename T>
+struct AlignedStorage2
+{
+ char mBytes[sizeof(T)];
+
+ const T* addr() const { return reinterpret_cast<const T*>(mBytes); }
+ T* addr() { return reinterpret_cast<T*>(mBytes); }
+};
+
+struct Register {
+ uint32_t reg_;
+};
+
+class TypedOrValueRegister
+{
+ AlignedStorage2<Register> typed;
+ __attribute__((noinline)) Register& dataTyped() { return *typed.addr(); }
+public:
+ TypedOrValueRegister(Register reg)
+ {
+ dataTyped() = reg;
+ }
+ Register typedReg() const { return *typed.addr(); }
+};
+
+int main() {
+ Register reg = { 10u };
+ if (TypedOrValueRegister(reg).typedReg().reg_ != 10)
+ __builtin_abort();
+ return 0;
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index a3fb59c..738c1a7 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1673,7 +1673,7 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset,
}
else
{
- off = build_int_cst (reference_alias_ptr_type (base),
+ off = build_int_cst (reference_alias_ptr_type (prev_base),
base_offset + offset / BITS_PER_UNIT);
base = build_fold_addr_expr (unshare_expr (base));
}