File nov494022.diff of Package gcc41

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 middle-end/37014
	* gcc.c-torture/compile/20080812-1.c: New test.

Index: gcc/dojump.c
===================================================================
--- gcc/dojump.c.orig	2005-10-28 16:17:39.000000000 +0200
+++ gcc/dojump.c	2009-11-20 13:42:34.000000000 +0100
@@ -306,8 +306,6 @@ do_jump (tree exp, rtx if_false_label, r
 	break;
       }
 
-    case TRUTH_ANDIF_EXPR:
-    case TRUTH_ORIF_EXPR:
     case COMPOUND_EXPR:
       /* Lowered by gimplify.c.  */
       gcc_unreachable ();
@@ -517,6 +515,7 @@ do_jump (tree exp, rtx if_false_label, r
       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 ();
@@ -537,6 +536,7 @@ do_jump (tree exp, rtx if_false_label, r
       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: gcc/expr.c
===================================================================
--- gcc/expr.c.orig	2009-11-20 13:41:34.000000000 +0100
+++ gcc/expr.c	2009-11-20 13:42:34.000000000 +0100
@@ -8283,7 +8283,10 @@ expand_expr_real_1 (tree exp, rtx target
       /* 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
@@ -8484,8 +8487,6 @@ expand_expr_real_1 (tree exp, rtx target
     case POSTDECREMENT_EXPR:
     case LOOP_EXPR:
     case EXIT_EXPR:
-    case TRUTH_ANDIF_EXPR:
-    case TRUTH_ORIF_EXPR:
       /* Lowered by gimplify.c.  */
       gcc_unreachable ();
 
Index: gcc/testsuite/gcc.c-torture/compile/20080812-1.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gcc/testsuite/gcc.c-torture/compile/20080812-1.c	2009-11-20 13:42:34.000000000 +0100
@@ -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);
+}
openSUSE Build Service is sponsored by