[backport gcc-4.9/trunk r198175, fixes PR57026 regression from PR56982 fix ] gcc/ 2013-04-23 Richard Biener PR tree-optimization/57026 * tree-vrp.c (simplify_conversion_using_ranges): Do not propagate from SSA names occuring in abnormal PHI nodes. gcc/testsuite/ 2013-04-23 Richard Biener PR tree-optimization/57026 * gcc.dg/torture/pr57026.c: New testcase. --- gcc-4.8.0/gcc/testsuite/gcc.dg/torture/pr57026.c.~1~ 1970-01-01 01:00:00.000000000 +0100 +++ gcc-4.8.0/gcc/testsuite/gcc.dg/torture/pr57026.c 2013-04-27 13:20:07.468871227 +0200 @@ -0,0 +1,22 @@ +/* { dg-do compile } */ + +typedef struct __jmp_buf_tag { char buf[1024]; } jmp_buf[1]; +extern int setjmp (jmp_buf); +extern int bar (unsigned int *); +extern jmp_buf *baz (void); +struct C { int c1; unsigned int c2, c3, c4; }; + +void +foo (struct C *x, const int *y, unsigned int *z, unsigned int e, unsigned int g) +{ + unsigned int d = 0; + unsigned long f; + setjmp (*baz ()); + f = d; + if ((x->c1 || x->c2) && g && (!e || d >= 8)) + d = 16; + else + d = 8; + if ((!x->c3 && !x->c4 || *y == 0) && !e && bar (z)) + *z = f; +} --- gcc-4.8.0/gcc/tree-vrp.c.~1~ 2013-02-21 11:52:39.000000000 +0100 +++ gcc-4.8.0/gcc/tree-vrp.c 2013-04-27 13:20:07.468871227 +0200 @@ -8707,7 +8707,8 @@ simplify_conversion_using_ranges (gimple || !CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt))) return false; innerop = gimple_assign_rhs1 (def_stmt); - if (TREE_CODE (innerop) != SSA_NAME) + if (TREE_CODE (innerop) != SSA_NAME + || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (innerop)) return false; /* Get the value-range of the inner operand. */