------- Comment #3 from rguenth at gcc dot gnu dot org 2008-09-13 14:06 ------- Confirmed.
Also we fail to see that the return value cannot be zero in the following cases: struct foo1 { int i:1; }; struct foo2 { unsigned i:1; }; int test1 (struct foo1 *x) { if (x->i == 0) return 1; else if (x->i == -1) return 1; return 0; } int test2 (struct foo2 *x) { if (x->i == 0) return 1; else if (x->i == -1) return 1; return 0; } int test3 (struct foo1 *x) { if (x->i == 0) return 1; else if (x->i == 1) return 1; return 0; } int test4 (struct foo2 *x) { if (x->i == 0) return 1; else if (x->i == 1) return 1; return 0; } which is because we insert in the else-if D.1237_5 = ASSERT_EXPR <D.1237_3, D.1237_3 != 0>; from which we conclude D.1237_5: ~[0, 0] in the signed case. In the unsigned case the comparison is promoted to (int) x->i == -1 where the value range is also unhelpful, ~[0, 0] promoted to ~[0, 0]. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Component|c |tree-optimization Ever Confirmed|0 |1 Keywords| |ice-on-valid-code, missed- | |optimization Last reconfirmed|0000-00-00 00:00:00 |2008-09-13 14:06:51 date| | Summary|ICE in in |[4.4 Regression] ICE in in |simplify_truth_ops_using_ran|simplify_truth_ops_using_ran |ges, at tree-vrp.c:6334 |ges, at tree-vrp.c:6334 Target Milestone|--- |4.4.0 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37508