I am testing the following patch fixing a TBAA related miscompile. Bootstrap / regtest running on x86_64-unknown-linux-gnu.
Richard. 2016-08-12 Richard Biener <rguent...@suse.de> PR tree-optimization/73434 * tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address): Preserve TBAA info on the base when forwarding a non-invariant address. * gcc.dg/torture/pr73434.c: New testcase. Index: gcc/tree-ssa-sccvn.c =================================================================== *** gcc/tree-ssa-sccvn.c (revision 239406) --- gcc/tree-ssa-sccvn.c (working copy) *************** vn_reference_maybe_forwprop_address (vec *** 1225,1230 **** --- 1225,1235 ---- { auto_vec<vn_reference_op_s, 32> tem; copy_reference_ops_from_ref (TREE_OPERAND (addr, 0), &tem); + /* Make sure to preserve TBAA info. */ + vn_reference_op_t new_mem_op = &tem[tem.length () - 2]; + gcc_assert (new_mem_op->opcode == MEM_REF); + new_mem_op->op0 = fold_convert (TREE_TYPE (mem_op->op0), + new_mem_op->op0); ops->pop (); ops->pop (); ops->safe_splice (tem); Index: gcc/testsuite/gcc.dg/torture/pr73434.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr73434.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr73434.c (working copy) *************** *** 0 **** --- 1,19 ---- + /* { dg-do run } */ + + typedef struct { unsigned char x; } A; + typedef struct { unsigned char x; } B; + + int idx = 0; + + A objs[1] = {{0}}; + + int main() + { + B *b = (B*)&objs[idx]; + b->x++; + if (b->x) + b->x = 0; + if (b->x) + __builtin_abort (); + return 0; + }