]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/59139 (internal compiler error: in get_val_for, at tree-ssa...
authorRichard Biener <rguenther@suse.de>
Mon, 2 Dec 2013 15:43:01 +0000 (15:43 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 2 Dec 2013 15:43:01 +0000 (15:43 +0000)
2013-12-02  Richard Biener  <rguenther@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.

From-SVN: r205588

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr59139.c [new file with mode: 0644]
gcc/tree-ssa-loop-niter.c

index 8126621d73bb88dba266c5bd071471636ea41b73..38af5b76455822f118fe21d29c04d063e8c340f8 100644 (file)
@@ -1,5 +1,13 @@
 2013-12-02  Richard Biener  <rguenther@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.
+
+2013-12-02  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/59199
        * tree-ssa-operands.c (opf_implicit): Remove.
        (opf_address_taken): New flag.
        (get_expr_operands): Remove early out, pass down
index c688c80232ef05bcf7ce97e5ab0ea8fe7a908012..59c0b5b8846e027eeaaf285aca02d4ec34e2cc7d 100644 (file)
@@ -1,3 +1,8 @@
+2013-12-02  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/59139
+       * gcc.dg/torture/pr59139.c: New testcase.
+
 2013-12-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/opt30.adb: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr59139.c b/gcc/testsuite/gcc.dg/torture/pr59139.c
new file mode 100644 (file)
index 0000000..4ec9177
--- /dev/null
@@ -0,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;
+       }
+    }
+}
index 05c3facd0e80e786ec5fb9dcf8ae06486b540d4c..08c8541b490c0634015d30f4f8e4870ec5857c55 100644 (file)
@@ -2167,7 +2167,8 @@ chain_of_csts_start (struct loop *loop, tree x)
       return NULL;
     }
 
-  if (gimple_code (stmt) != GIMPLE_ASSIGN)
+  if (gimple_code (stmt) != GIMPLE_ASSIGN
+      || gimple_assign_rhs_class (stmt) == GIMPLE_TERNARY_RHS)
     return NULL;
 
   code = gimple_assign_rhs_code (stmt);
@@ -2235,7 +2236,7 @@ get_val_for (tree x, tree base)
 {
   gimple stmt;
 
-  gcc_assert (is_gimple_min_invariant (base));
+  gcc_checking_assert (is_gimple_min_invariant (base));
 
   if (!x)
     return base;
@@ -2244,7 +2245,7 @@ get_val_for (tree x, tree base)
   if (gimple_code (stmt) == GIMPLE_PHI)
     return base;
 
-  gcc_assert (is_gimple_assign (stmt));
+  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