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
This commit is contained in:
Jakub Jelinek 2008-08-12 20:05:43 +02:00 committed by Jakub Jelinek
parent 4c29307df9
commit c028590539
5 changed files with 36 additions and 6 deletions

View 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.

View 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 ();

View 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 ();

View 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.

View file

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