aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71503.c18
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71683.c25
-rw-r--r--gcc/tree-if-conv.c5
5 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 82a4737..0b2eac8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-07-20 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/71503
+ PR tree-optimization/71683
+ * tree-if-conv.c (gen_phi_arg_condition): Record true predicate
+ and break.
+
2016-07-20 Martin Liska <mliska@suse.cz>
* doc/invoke.texi (-fipa-ra): Document when the option is
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7f42fad..e631db9 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2016-07-20 Bin Cheng <bin.cheng@arm.com>
+
+ PR tree-optimization/71503
+ PR tree-optimization/71683
+ * gcc.dg/tree-ssa/ifc-pr71503.c: New test.
+ * gcc.dg/tree-ssa/ifc-pr71683.c: New test.
+
2016-07-20 Martin Liska <mliska@suse.cz>
* gcc.dg/plugin/plugin.exp: Remove sreal test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71503.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71503.c
new file mode 100644
index 0000000..5a90abf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71503.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast" { target *-*-* } } */
+
+int a, b;
+unsigned long d;
+void fn1() {
+ unsigned long *h = &d;
+line1 : {
+ int i = 4;
+ for (; b; i++) {
+ d = ((d + 6 ?: *h) ? a : 7) && (i &= 0 >= b);
+ b += a;
+ }
+}
+ h = 0;
+ for (; *h;)
+ goto line1;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71683.c b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71683.c
new file mode 100644
index 0000000..851be37
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/ifc-pr71683.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-Ofast" { target *-*-* } } */
+
+short unsigned int ve;
+
+void
+u1 (void)
+{
+ int oq = 0;
+
+ while (ve != 0)
+ {
+ int j4, w7 = oq;
+
+ oq = 0 / oq;
+ ve %= oq;
+ j4 = ve ^ 1;
+ ve ^= oq;
+ if (j4 != 0 ? j4 : ve)
+ oq = ve;
+ else
+ if (w7 != 0)
+ oq = ve;
+ }
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index e5a3372..4253d19 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -1687,7 +1687,10 @@ gen_phi_arg_condition (gphi *phi, vec<int> *occur,
e = gimple_phi_arg_edge (phi, (*occur)[i]);
c = bb_predicate (e->src);
if (is_true_predicate (c))
- continue;
+ {
+ cond = c;
+ break;
+ }
c = force_gimple_operand_gsi_1 (gsi, unshare_expr (c),
is_gimple_condexpr, NULL_TREE,
true, GSI_SAME_STMT);