[PATCH] Fix ICE in get_range_info (PR tree-optimization/80612)

Marek Polacek polacek@redhat.com
Thu May 4 09:22:00 GMT 2017


We need to check that the SSA_NAME we're passing down to get_range_info
is of INTEGRAL_TYPE_P; on pointers we'd crash on an assert.

Bootstrapped/regtested on x86_64-linux, ok for trunk and 7.2?

2017-05-04  Marek Polacek  <polacek@redhat.com>

	PR tree-optimization/80612
	* calls.c (get_size_range): Check for INTEGRAL_TYPE_P.

	* gcc.dg/torture/pr80612.c: New test.

diff --git gcc/calls.c gcc/calls.c
index c26f157..bd081cc 100644
--- gcc/calls.c
+++ gcc/calls.c
@@ -1270,7 +1270,7 @@ get_size_range (tree exp, tree range[2])
 
   wide_int min, max;
   enum value_range_type range_type
-    = (TREE_CODE (exp) == SSA_NAME
+    = ((TREE_CODE (exp) == SSA_NAME && INTEGRAL_TYPE_P (TREE_TYPE (exp)))
        ? get_range_info (exp, &min, &max) : VR_VARYING);
 
   if (range_type == VR_VARYING)
diff --git gcc/testsuite/gcc.dg/torture/pr80612.c gcc/testsuite/gcc.dg/torture/pr80612.c
index e69de29..225b811 100644
--- gcc/testsuite/gcc.dg/torture/pr80612.c
+++ gcc/testsuite/gcc.dg/torture/pr80612.c
@@ -0,0 +1,15 @@
+/* PR tree-optimization/80612 */
+/* { dg-do compile } */
+
+struct obstack *a;
+struct obstack {
+  union {
+    void *plain;
+    void (*extra)();
+  } chunkfun;
+} fn1(void p4()) {
+  a->chunkfun.plain = p4;
+  a->chunkfun.extra(a);
+}
+void fn2(int) __attribute__((__alloc_size__(1)));
+void fn3() { fn1(fn2); }

	Marek



More information about the Gcc-patches mailing list