This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix ICE in predicate_mem_writes (PR tree-optimization/70725)


While predicate_mem_writes has a check to skip conditions that were evaluated
to true, it's lacking the same check for false, so we hit an assert later on.
So I'm adding is_false_predicate.  Maybe it should be added to other spots as
well, but I'm not sure about that.

Bootstrapped/regtested on x86_64-linux, ok for trunk?

2016-04-19  Marek Polacek  <polacek@redhat.com>

	PR tree-optimization/70725
	* tree-if-conv.c (is_false_predicate): New function.
	(predicate_mem_writes): Use it.

	* gcc.dg/pr70725.c: New test.

diff --git gcc/testsuite/gcc.dg/pr70725.c gcc/testsuite/gcc.dg/pr70725.c
index e69de29..fc7b674 100644
--- gcc/testsuite/gcc.dg/pr70725.c
+++ 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 gcc/tree-if-conv.c gcc/tree-if-conv.c
index 9e305c7..a9fbab9 100644
--- gcc/tree-if-conv.c
+++ 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;

	Marek


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]