diff options
author | Richard Biener <rguenther@suse.de> | 2018-03-12 12:32:28 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2018-03-12 12:32:28 +0000 |
commit | 8f1a73b2bb0d399fa6784a2f365fa8dd3ae007f5 (patch) | |
tree | 015fba0e40c3335857cbad4936a92ccef81dd21c | |
parent | b270a5215a4ed5a99efa93ed34a98eab75fe13c7 (diff) | |
download | gcc-8f1a73b2bb0d399fa6784a2f365fa8dd3ae007f5.zip gcc-8f1a73b2bb0d399fa6784a2f365fa8dd3ae007f5.tar.gz gcc-8f1a73b2bb0d399fa6784a2f365fa8dd3ae007f5.tar.bz2 |
re PR tree-optimization/84803 (ICE from ifcvt_memrefs_wont_trap with -O3)
2018-03-12 Richard Biener <rguenther@suse.de>
PR tree-optimization/84803
* tree-if-conv.c (ifcvt_memrefs_wont_trap): Don't do anything
for refs DR analysis didn't process.
* gcc.dg/torture/pr84803.c: New testcase.
From-SVN: r258446
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr84803.c | 30 | ||||
-rw-r--r-- | gcc/tree-if-conv.c | 5 |
4 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc08bae..548de75 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2018-03-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/84803 + * tree-if-conv.c (ifcvt_memrefs_wont_trap): Don't do anything + for refs DR analysis didn't process. + +2018-03-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/84777 * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): For force-vectorize loops ignore whether we are optimizing for size. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69c00d1..c13747ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-12 Richard Biener <rguenther@suse.de> + + PR tree-optimization/84803 + * gcc.dg/torture/pr84803.c: New testcase. + 2018-03-12 Jakub Jelinek <jakub@redhat.com> PR c++/84813 diff --git a/gcc/testsuite/gcc.dg/torture/pr84803.c b/gcc/testsuite/gcc.dg/torture/pr84803.c new file mode 100644 index 0000000..81aad62 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr84803.c @@ -0,0 +1,30 @@ +/* { dg-do compile } */ + +long a; +long *b; +void c (); +void d (); +void +e (long f) +{ + if (a) + *b = f; +} +void +g () +{ + c (g, e); +} +void +c (int f, int h ()) +{ + d (f, h, ""); +} +void +d (int f, int h (), char *i, char *k) +{ + int j; + d (f, h, i + 1, k); + while (--j) + h (*i); +} diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index c68a0c7..71dac4f 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -864,6 +864,11 @@ base_object_writable (tree ref) static bool ifcvt_memrefs_wont_trap (gimple *stmt, vec<data_reference_p> drs) { + /* If DR didn't see a reference here we can't use it to tell + whether the ref traps or not. */ + if (gimple_uid (stmt) == 0) + return false; + data_reference_p *master_dr, *base_master_dr; data_reference_p a = drs[gimple_uid (stmt) - 1]; |