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