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.
break;
}
- case TRUTH_ANDIF_EXPR:
- case TRUTH_ORIF_EXPR:
case COMPOUND_EXPR:
/* Lowered by gimplify.c. */
gcc_unreachable ();
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 ();
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 ();
/* 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.
/* 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
case POSTDECREMENT_EXPR:
case LOOP_EXPR:
case EXIT_EXPR:
- case TRUTH_ANDIF_EXPR:
- case TRUTH_ORIF_EXPR:
/* Lowered by gimplify.c. */
gcc_unreachable ();
--- /dev/null
+/* 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);
+}