[PATCH] Fix ICE in compute_objsize (PR tree-optimization/92891)
Jakub Jelinek
jakub@redhat.com
Tue Dec 10 23:24:00 GMT 2019
Hi!
The following testcase ICEs, because gimple_call_alloc_size doesn't always
return a sizetype typed INTEGER_CST, which the callers rely on (compare
those converted to wide_int with other wide_ints with the sizetype
precision). If alloc_size attribute has two arguments,
gimple_call_alloc_size will always build a sizetype INTEGER_CST,
but if it is just one, it returns what is passed to the argument,
whatever type it has, so could be wider (e.g. __int128) or narrower
like in the testcase on lp64.
Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?
2019-12-10 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/92891
* builtins.c (gimple_call_alloc_size): Convert size to sizetype
before returning it.
* gcc.c-torture/compile/pr92891.c: New test.
--- gcc/builtins.c.jj 2019-12-09 19:50:24.733953169 +0100
+++ gcc/builtins.c 2019-12-10 20:56:53.619769947 +0100
@@ -3755,7 +3755,7 @@ gimple_call_alloc_size (gimple *stmt)
return NULL_TREE;
if (argidx2 > nargs && TREE_CODE (size) == INTEGER_CST)
- return size;
+ return fold_convert (sizetype, size);
/* To handle ranges do the math in wide_int and return the product
of the upper bounds as a constant. Ignore anti-ranges. */
--- gcc/testsuite/gcc.c-torture/compile/pr92891.c.jj 2019-12-10 21:09:14.137648344 +0100
+++ gcc/testsuite/gcc.c-torture/compile/pr92891.c 2019-12-10 21:08:56.902907013 +0100
@@ -0,0 +1,16 @@
+/* PR tree-optimization/92891 */
+
+int a, b;
+char *foo (int) __attribute__((alloc_size(1)));
+
+void
+bar (void)
+{
+ char *e = foo (2);
+ while (a)
+ {
+ if (b <= 0)
+ continue;
+ e[b] = 0;
+ }
+}
Jakub
More information about the Gcc-patches
mailing list