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.
Martin
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