+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.
+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
--- /dev/null
+// { 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;
+}
}
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));
}