diff options
author | mpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-20 09:32:45 +0000 |
---|---|---|
committer | mpolacek <mpolacek@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-04-20 09:32:45 +0000 |
commit | 97efb92e8af234972bfd0fe545f3c2ccf8cce94c (patch) | |
tree | 3b40c48a012b1dabf014a48b312fe99ac30a3f9a | |
parent | acd4c1ed02193d95458699900f352becde5de342 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr70725.c | 22 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 12 |
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; |