aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2016-08-15 09:56:00 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2016-08-15 09:56:00 +0000
commite4969090b68ff266b29c86b6aebec25812666fc4 (patch)
treec23c379cf6e756837d03ce0db535edbb68acd4cc /gcc
parent980bd53780025944008dbcd89caeed8d6e782715 (diff)
downloadgcc-e4969090b68ff266b29c86b6aebec25812666fc4.zip
gcc-e4969090b68ff266b29c86b6aebec25812666fc4.tar.gz
gcc-e4969090b68ff266b29c86b6aebec25812666fc4.tar.bz2
re PR tree-optimization/73434 (Wrong code with casting, branches and aliasing)
2016-08-15 Richard Biener <rguenther@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. From-SVN: r239471
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr73434.c19
-rw-r--r--gcc/tree-ssa-sccvn.c12
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 32e9439..4e6ffb4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-08-15 Richard Biener <rguenther@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.
+
2016-08-15 Jakub Jelinek <jakub@redhat.com>
* dwarf2out.c (struct checksum_attributes): Add
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6fa7c1f..fc25482 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-08-15 Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/73434
+ * gcc.dg/torture/pr73434.c: New testcase.
+
2016-08-15 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/72824
diff --git a/gcc/testsuite/gcc.dg/torture/pr73434.c b/gcc/testsuite/gcc.dg/torture/pr73434.c
new file mode 100644
index 0000000..624e0c6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr73434.c
@@ -0,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;
+}
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
index e889d60..21b3d56 100644
--- a/gcc/tree-ssa-sccvn.c
+++ b/gcc/tree-ssa-sccvn.c
@@ -1225,6 +1225,18 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
{
auto_vec<vn_reference_op_s, 32> tem;
copy_reference_ops_from_ref (TREE_OPERAND (addr, 0), &tem);
+ /* Make sure to preserve TBAA info. The only objects not
+ wrapped in MEM_REFs that can have their address taken are
+ STRING_CSTs. */
+ if (tem.length () >= 2
+ && tem[tem.length () - 2].opcode == MEM_REF)
+ {
+ vn_reference_op_t new_mem_op = &tem[tem.length () - 2];
+ new_mem_op->op0 = fold_convert (TREE_TYPE (mem_op->op0),
+ new_mem_op->op0);
+ }
+ else
+ gcc_assert (tem.last ().opcode == STRING_CST);
ops->pop ();
ops->pop ();
ops->safe_splice (tem);