This fixes PR59139, ternary support was missing from get_val_for. Instead of supporting it I simply chose to properly disable its support.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2013-12-02 Richard Biener <rguent...@suse.de> PR tree-optimization/59139 * tree-ssa-loop-niter.c (chain_of_csts_start): Properly match code in get_val_for. (get_val_for): Use gcc_checking_asserts. * gcc.dg/torture/pr59139.c: New testcase. Index: gcc/tree-ssa-loop-niter.c =================================================================== *** gcc/tree-ssa-loop-niter.c (revision 205585) --- gcc/tree-ssa-loop-niter.c (working copy) *************** chain_of_csts_start (struct loop *loop, *** 2075,2081 **** return NULL; } ! if (gimple_code (stmt) != GIMPLE_ASSIGN) return NULL; code = gimple_assign_rhs_code (stmt); --- 2075,2082 ---- return NULL; } ! if (gimple_code (stmt) != GIMPLE_ASSIGN ! || gimple_assign_rhs_class (stmt) == GIMPLE_TERNARY_RHS) return NULL; code = gimple_assign_rhs_code (stmt); *************** get_val_for (tree x, tree base) *** 2143,2149 **** { gimple stmt; ! gcc_assert (is_gimple_min_invariant (base)); if (!x) return base; --- 2144,2150 ---- { gimple stmt; ! gcc_checking_assert (is_gimple_min_invariant (base)); if (!x) return base; *************** get_val_for (tree x, tree base) *** 2152,2158 **** if (gimple_code (stmt) == GIMPLE_PHI) return base; ! gcc_assert (is_gimple_assign (stmt)); /* STMT must be either an assignment of a single SSA name or an expression involving an SSA name and a constant. Try to fold that --- 2153,2159 ---- if (gimple_code (stmt) == GIMPLE_PHI) return base; ! gcc_checking_assert (is_gimple_assign (stmt)); /* STMT must be either an assignment of a single SSA name or an expression involving an SSA name and a constant. Try to fold that Index: gcc/testsuite/gcc.dg/torture/pr59139.c =================================================================== *** gcc/testsuite/gcc.dg/torture/pr59139.c (revision 0) --- gcc/testsuite/gcc.dg/torture/pr59139.c (working copy) *************** *** 0 **** --- 1,20 ---- + /* { dg-do compile } */ + + int a, b, c, d, e; + int fn1(p1, p2) { return p2 == 0 ? p1 : 1 % p2; } + + void fn2() + { + c = 0; + for (;; c = (unsigned short)c) + { + b = 2; + for (; b; b = a) + { + e = fn1(2, c && 1); + d = c == 0 ? e : c; + if (d) + return; + } + } + }