typedef long unsigned int size_t; size_t __attribute__((noinline)) choose_block (char *d, size_t dlen, int col, size_t *wlen) { size_t n, nn; n = dlen; for (;;) { ((void) ((d + n > d) ? 0 : (__assert_fail ("d + n > d", "rfc2047.c", 346, __PRETTY_FUNCTION__), 0))); if (!nn && (col + *wlen <= 75 + 1 || n <= 1)) break; } return n; } --> compile with -O2 t.c: In function ?choose_block?: t.c:6: internal compiler error: in compare_values, at tree-vrp.c:415 Breakpoint 1, fancy_abort (file=0xbd5846 "../../mainline/gcc/tree-vrp.c", line=415, function=0xbd58b6 "compare_values") at diagnostic.c:590 590 internal_error ("in %s, at %s:%d", function, trim_filename (file), line); (gdb) up #1 0x000000000094c645 in compare_values (val1=0x2a95a5a000, val2=0x2a95a4fe70) at tree-vrp.c:414 414 gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1)) (gdb) l 409 if (val1 == val2) 410 return 0; 411 412 /* Below we rely on the fact that VAL1 and VAL2 are both pointers or 413 both integers. */ 414 gcc_assert (POINTER_TYPE_P (TREE_TYPE (val1)) 415 == POINTER_TYPE_P (TREE_TYPE (val2))); 416 417 /* Do some limited symbolic comparisons. */ 418 if (!POINTER_TYPE_P (TREE_TYPE (val1))) (gdb) p debug_tree_cfg (0) choose_block (d, dlen, col, wlen) { static const char __PRETTY_FUNCTION__[13] = "choose_block"; size_t nn; size_t n; size_t D.1627; _Bool D.1626; _Bool D.1625; _Bool D.1624; size_t D.1623; size_t D.1622; size_t D.1621; int iftmp.0; # BLOCK 0 # PRED: ENTRY (fallthru,exec) n_2 = dlen_1; goto <bb 7> (<L10>); # SUCC: 7 (fallthru,exec) # BLOCK 1 # PRED: 3 (false,exec) 4 (false,exec) <L0>:; # SUCC: 7 [100.0%] (fallthru,exec) # BLOCK 7 # PRED: 1 [100.0%] (fallthru,exec) 0 (fallthru,exec) <L10>:; if (dlen_1 == 0B) goto <L1>; else goto <L9>; # SUCC: 2 (true,exec) 6 (false,exec) # BLOCK 6 # PRED: 7 (false,exec) <L9>:; dlen_14 = ASSERT_EXPR <dlen_1, dlen_1 != 0B>; goto <bb 3> (<L3>); # SUCC: 3 [100.0%] (fallthru,exec) # BLOCK 2 # PRED: 7 (true,exec) <L1>:; __assert_fail (&"d + n > d"[0], &"rfc2047.c"[0], 346, &__PRETTY_FUNCTION__); # SUCC: 3 (fallthru,exec) # BLOCK 3 # PRED: 2 (fallthru,exec) 6 [100.0%] (fallthru,exec) <L3>:; if (nn_3 == 0) goto <L4>; else goto <L0>; # SUCC: 4 (true,exec) 1 (false,exec) # BLOCK 4 # PRED: 3 (true,exec) <L4>:; D.1621_5 = (size_t) col_4; D.1622_7 = *wlen_6; D.1623_8 = D.1621_5 + D.1622_7; D.1624_9 = D.1623_8 <= 76; D.1625_10 = dlen_1 <= 1; D.1626_11 = D.1624_9 || D.1625_10; if (D.1626_11) goto <L7>; else goto <L0>; # SUCC: 5 (true,exec) 1 (false,exec) # BLOCK 5 # PRED: 4 (true,exec) <L7>:; n_12 = dlen_1; return dlen_1; # SUCC: EXIT } $1 = void (gdb) p debug_generic_expr (val1) dlenD.1609_1 $2 = void (gdb) p debug_generic_expr (val2) 0B (gdb) This bug shows up when building mutt.
-- Summary: [4.1 regression] ICE in compare_values in VRP Product: gcc Version: 4.1.0 Status: UNCONFIRMED Keywords: ice-on-valid-code Severity: normal Priority: P2 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: steven at gcc dot gnu dot org CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23960