This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR79186
- From: Richard Biener <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 23 Jan 2017 14:04:01 +0100 (CET)
- Subject: [PATCH] Fix PR79186
- Authentication-results: sourceware.org; auth=none
Bootstrapped / tested on x86_64-unknown-linux-gnu, applied.
Richard.
2017-01-23 Richard Biener <rguenther@suse.de>
PR tree-optimization/79186
* tree-vrp.c (register_new_assert_for): Make sure we've seen
both incoming edges before moving an assert.
* gcc.dg/torture/pr79186.c: New testcase.
* gcc.dg/torture/pr79187.c: Likewise.
Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c (revision 244771)
+++ gcc/tree-vrp.c (working copy)
@@ -5035,6 +5035,7 @@ register_new_assert_for (tree name, tree
/* If we have the same assertion on all incoming edges of a BB
instead insert it at the beginning of it. */
if (e && loc->e
+ && e != loc->e
&& dest_bb == loc->e->dest
&& EDGE_COUNT (dest_bb->preds) == 2)
{
Index: gcc/testsuite/gcc.dg/torture/pr79186.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr79186.c (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr79186.c (working copy)
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+
+int a, b;
+unsigned char c, d, e;
+
+int main ()
+{
+ if (b || !a)
+ {
+ c = a;
+ if (!c && !a)
+ d = 0;
+ e = -a;
+ }
+ return 0;
+}
Index: gcc/testsuite/gcc.dg/torture/pr79187.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr79187.c (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr79187.c (working copy)
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+int printf (const char *, ...);
+
+int a, b = -600, c, d[] = { 0 }, e, f, g = -1, h;
+unsigned i = ~0;
+
+int main ()
+{
+ for (; h < 2; h++)
+ {
+ if (a > 0)
+ printf ("%d\n", d[b]);
+ f = ~(b % i);
+ c = g | (f && g) && e | b;
+ a = ~(~g & b);
+ }
+ return 0;
+}