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 <pola...@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