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;
+       }
+     }
+ }

Reply via email to