From: Richard Biener Date: Mon, 12 Mar 2018 12:32:28 +0000 (+0000) Subject: re PR tree-optimization/84803 (ICE from ifcvt_memrefs_wont_trap with -O3) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8f1a73b2bb0d399fa6784a2f365fa8dd3ae007f5;p=gcc.git re PR tree-optimization/84803 (ICE from ifcvt_memrefs_wont_trap with -O3) 2018-03-12 Richard Biener 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bc08bae91fe..548de755bb7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-03-12 Richard Biener + + 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 PR tree-optimization/84777 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 69c00d1b23e..c13747ad1b6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-03-12 Richard Biener + + PR tree-optimization/84803 + * gcc.dg/torture/pr84803.c: New testcase. + 2018-03-12 Jakub Jelinek 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 00000000000..81aad626d6c --- /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 c68a0c72d98..71dac4fb48a 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 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];