re PR middle-end/70526 (GCC 6 miscompiles Firefox JIT compiler)
authorRichard Biener <rguenther@suse.de>
Tue, 5 Apr 2016 14:26:59 +0000 (14:26 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 5 Apr 2016 14:26:59 +0000 (14:26 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr70526.C [new file with mode: 0644]
gcc/tree-sra.c

index abd195dc4df00c2b6a7720a44c5584009f1dfc2d..b7fc0cd9d06593d4bb77d249b2c894d7d01be710 100644 (file)
@@ -1,3 +1,9 @@
+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.
index f3d1a6e69198cad9f9a1072c1a054a07602a3806..fcb5222a1edcc53df6f4e437c8f68f5db1b41e25 100644 (file)
@@ -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 (file)
index 0000000..37a3e5f
--- /dev/null
@@ -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;
+}
index a3fb59ce5a4c3f58560dd749bc69d57c286e53bf..738c1a77bda5894e92e37259eb04b28f2f8bfa37 100644 (file)
@@ -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));
     }