summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-20 09:32:45 +0000
committermpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-20 09:32:45 +0000
commit97efb92e8af234972bfd0fe545f3c2ccf8cce94c (patch)
tree3b40c48a012b1dabf014a48b312fe99ac30a3f9a
parentacd4c1ed02193d95458699900f352becde5de342 (diff)
downloadgcc-97efb92e8af234972bfd0fe545f3c2ccf8cce94c.tar.gz
PR tree-optimization/70725
* tree-if-conv.c (is_false_predicate): New function. (predicate_mem_writes): Use it. * gcc.dg/pr70725.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@235250 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr70725.c22
-rw-r--r--gcc/tree-if-conv.c12
4 files changed, 44 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6e92dde027e..576560a817a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-04-20 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/70725
+ * tree-if-conv.c (is_false_predicate): New function.
+ (predicate_mem_writes): Use it.
+
2016-04-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/70726
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index db98dd3f9d5..b73790e1832 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-04-20 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/70725
+ * gcc.dg/pr70725.c: New test.
+
2016-04-20 Richard Biener <rguenther@suse.de>
PR tree-optimization/70726
diff --git a/gcc/testsuite/gcc.dg/pr70725.c b/gcc/testsuite/gcc.dg/pr70725.c
new file mode 100644
index 00000000000..fc7b674d756
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr70725.c
@@ -0,0 +1,22 @@
+/* PR tree-optimization/70725 */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+/* { dg-additional-options "-march=skylake-avx512" { target { i?86-*-* x86_64-*-* } } } */
+
+extern short a;
+extern int b, d;
+extern int c[100];
+extern int e;
+extern int f;
+
+void
+fn1 ()
+{
+ for (; e < 2; e = e + 1)
+ d = a;
+ for (;;)
+ for (int g = 0; g < 5; g = g + 1)
+ for (int h = 0; h < 2; h = h + 1)
+ for (int i = 0; i < 3; i = i + 1)
+ c[f + i] = a && b;
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index 9e305c7ccae..a9fbab94a19 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -262,6 +262,16 @@ ifc_temp_var (tree type, tree expr, gimple_stmt_iterator *gsi)
return new_name;
}
+/* Return true when COND is a false predicate. */
+
+static inline bool
+is_false_predicate (tree cond)
+{
+ return (cond == NULL_TREE
+ || cond == boolean_false_node
+ || integer_zerop (cond));
+}
+
/* Return true when COND is a true predicate. */
static inline bool
@@ -1988,7 +1998,7 @@ predicate_mem_writes (loop_p loop)
gimple *stmt;
int index;
- if (is_true_predicate (cond))
+ if (is_true_predicate (cond) || is_false_predicate (cond))
continue;
swap = false;