]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/37014 (internal compiler error: in expand_expr_real_1, at expr.c...
authorJakub Jelinek <jakub@redhat.com>
Tue, 12 Aug 2008 18:05:43 +0000 (20:05 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 12 Aug 2008 18:05:43 +0000 (20:05 +0200)
PR middle-end/37014
* expr.c (expand_expr_real_1): Handle TRUTH_ANDIF_EXPR
and TRUTH_ORIF_EXPR.
* dojump.c (do_jump): Likewise.

* gcc.c-torture/compile/20080812-1.c: New test.

From-SVN: r139029

gcc/ChangeLog
gcc/dojump.c
gcc/expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20080812-1.c [new file with mode: 0644]

index f60e34b232f84d4ca63eac29499e8b8205fce5e4..a49a7bc30127cdedf85265fb4e9ecb23a7b2af65 100644 (file)
@@ -1,5 +1,10 @@
 2008-08-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/37014
+       * expr.c (expand_expr_real_1): Handle TRUTH_ANDIF_EXPR
+       and TRUTH_ORIF_EXPR.
+       * dojump.c (do_jump): Likewise.
+
        PR tree-optimization/37084
        * tree-inline.c (copy_bb): Call gimple_regimplify_operands
        if id->regimplify, don't assume stmt is a cast assignment.
index fb8d139b11168c34853dd2f1d932a07c200892b1..46aa4f2ebb831f50cfe6cef6f6d1fb7c13e68e74 100644 (file)
@@ -304,8 +304,6 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
        break;
       }
 
-    case TRUTH_ANDIF_EXPR:
-    case TRUTH_ORIF_EXPR:
     case COMPOUND_EXPR:
       /* Lowered by gimplify.c.  */
       gcc_unreachable ();
@@ -515,6 +513,7 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
       if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
        goto normal;
 
+    case TRUTH_ANDIF_EXPR:
       if (if_false_label == NULL_RTX)
         {
          drop_through_label = gen_label_rtx ();
@@ -535,6 +534,7 @@ do_jump (tree exp, rtx if_false_label, rtx if_true_label)
       if (BRANCH_COST >= 4 || TREE_SIDE_EFFECTS (TREE_OPERAND (exp, 1)))
        goto normal;
 
+    case TRUTH_ORIF_EXPR:
       if (if_true_label == NULL_RTX)
        {
           drop_through_label = gen_label_rtx ();
index 109ddebe5dc228bd04b5cf59b51a99288ff85d9e..e61dc616165094ed30022404dd801ee74814a556 100644 (file)
@@ -1,6 +1,6 @@
 /* Convert tree expression to rtl instructions, for GNU compiler.
    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
 This file is part of GCC.
@@ -8970,7 +8970,10 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
       /* If no set-flag instruction, must generate a conditional store
         into a temporary variable.  Drop through and handle this
         like && and ||.  */
-
+      /* Although TRUTH_{AND,OR}IF_EXPR aren't present in GIMPLE, they
+        are occassionally created by folding during expansion.  */
+    case TRUTH_ANDIF_EXPR:
+    case TRUTH_ORIF_EXPR:
       if (! ignore
          && (target == 0
              || modifier == EXPAND_STACK_PARM
@@ -9170,8 +9173,6 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
     case POSTDECREMENT_EXPR:
     case LOOP_EXPR:
     case EXIT_EXPR:
-    case TRUTH_ANDIF_EXPR:
-    case TRUTH_ORIF_EXPR:
       /* Lowered by gimplify.c.  */
       gcc_unreachable ();
 
index 692e83f993c81dba99213544693b80bff65cb30a..f30067d9a67647f0f98d62c7c067c5ebd67a1265 100644 (file)
@@ -1,5 +1,8 @@
 2008-08-12  Jakub Jelinek  <jakub@redhat.com>
 
+       PR middle-end/37014
+       * gcc.c-torture/compile/20080812-1.c: New test.
+
        PR tree-optimization/37084
        * g++.dg/tree-ssa/pr37084.C: New test.
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/20080812-1.c b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c
new file mode 100644 (file)
index 0000000..2e4c13a
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR middle-end/37014 */
+
+void bar (signed char *);
+
+void
+foo (int x, int y)
+{
+  int i;
+  signed char a[123], b[123], c;
+  for (i = 0; i < 123; i++)
+    {
+      int e = y - x;
+      int d = e < 0 ? -e : e;
+      c = d < 75;
+      a[y] = c;
+      b[y] = c;
+      y--;
+    }
+  bar (b);
+  bar (a);
+}