Message ID | 2ff077c9-e41e-16ae-c551-b8798c23c2d0@gmail.com |
---|---|
State | New |
Headers | show |
Series | avoid assuming calloc return value is used (PR 93683) | expand |
On Tue, 2020-02-11 at 16:01 -0700, Martin Sebor wrote: > Along with some special handling of calloc calls, r272717 introduced > the assumption into stmt_kills_ref_p that the value returned from > the call is used. The code triggers an ICE when invoked during DCE > in an attempt to determine whether a calloc call can be eliminated. > > To avoid the ICE the attached patch avoids using the return value if > it's not set. > > Tested on x86_64-linux. > > PR tree-optimization/93683 - ICE on calloc with unused return value in ao_ref_init_from_ptr_and_size > > gcc/testsuite/ChangeLog: > > PR tree-optimization/93683 > * gcc.dg/tree-ssa/ssa-dse-39.c: New test. > > gcc/ChangeLog: > > PR tree-optimization/93683 > * tree-ssa-alias.c (stmt_kills_ref_p): Avoid using LHS when not set. OK jeff
PR tree-optimization/93683 - ICE on calloc with unused return value in ao_ref_init_from_ptr_and_size gcc/testsuite/ChangeLog: PR tree-optimization/93683 * gcc.dg/tree-ssa/ssa-dse-39.c: New test. gcc/ChangeLog: PR tree-optimization/93683 * tree-ssa-alias.c (stmt_kills_ref_p): Avoid using LHS when not set. diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-39.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-39.c new file mode 100644 index 00000000000..29b1a480ecd --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-dse-39.c @@ -0,0 +1,18 @@ +/* PR tree-optimization/93683 - ICE on calloc with unused return value + in ao_ref_init_from_ptr_and_size + { dg-do compile } + { dg-options "-O2 -Wall -Wno-unused-result -fdump-tree-cddce1" } */ + +void f0 (int *a) +{ + *a = 0; + __builtin_calloc (1, 1); +} + +void f1 (int *a, unsigned n) +{ + *a = n; + __builtin_calloc (n, n); +} + +/* { dg-final { scan-tree-dump-not "calloc" "cddce1" } } */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index c7e6679f990..fd781050668 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -3265,6 +3265,8 @@ stmt_kills_ref_p (gimple *stmt, ao_ref *ref) return false; dest = gimple_call_lhs (stmt); + if (!dest) + return false; len = fold_build2 (MULT_EXPR, TREE_TYPE (arg0), arg0, arg1); } else