Commit c0285905 by Jakub Jelinek Committed by Jakub Jelinek

re PR middle-end/37014 (internal compiler error: in expand_expr_real_1, at expr.c:8760)

	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
parent 4c29307d
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.
......
......@@ -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 ();
......
/* 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 ();
......
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.
......
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment