[Bug tree-optimization/21021] [4.1 Regression] ICE in tree-vrp building glibc
kazu at cs dot umass dot edu
gcc-bugzilla@gcc.gnu.org
Thu Apr 14 15:52:00 GMT 2005
------- Additional Comments From kazu at cs dot umass dot edu 2005-04-14 15:51 -------
Before VRP (even before ASSERT_EXPR insertion), we have
const void * r;
unsigned int D.1157;
void * D.1156;
:
:
if (r_3 >= D.1157_5) goto <L0>; else goto <L5>;
Note that we already have a type-mismatched comparison - an integer
v.s. a pointer.
tree-vrp.c:maybe_add_assert_expr inserts the following ASSERT_EXPR in
the "else" branch of the "if" statement.
r_14 = ASSERT_EXPR <r_3, r_3 < D.1157_5>;
Eventually the propagation engine visits this ASSERT_EXPR with a call
tree like so.
simulate_stmt
vrp_visit_stmt
vrp_visit_assignment
extract_range_from_expr
extract_range_from_assert (ASSERT_EXPR <r_3, r_3 < D.1157_5>)
value_ranges_intersect_p ([D.1156_2, D.1156_2], [0, D.1157_5 - 1])
value_inside_range (D.1157_5 - 1, [D.1156_2, D.1156_2])
compare_values (D.1157_5 - 1, D.1156_2)
compare_values does some limited symbolic comparisons. In this case,
it checks whether D.1156_2 == INF so that if that's the case, we can
deduce that
D.1157_5 - 1 < D.1156_2
But we cannot compute TYPE_MAX_VALUE (TREE_TYPE (D.1156_2)) because
D.1156_2 is of a pointer type, causing the ICE.
The root cause of the problem is that we have a type-mismatched
comparison.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21021
More information about the Gcc-bugs
mailing list