From: Jakub Jelinek Date: Tue, 12 Aug 2008 18:05:43 +0000 (+0200) Subject: re PR middle-end/37014 (internal compiler error: in expand_expr_real_1, at expr.c... X-Git-Tag: releases/gcc-4.4.0~3172 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0285905394bb04acd7650f5ac1079c798ed1487;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f60e34b232f8..a49a7bc30127 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2008-08-12 Jakub Jelinek + 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. diff --git a/gcc/dojump.c b/gcc/dojump.c index fb8d139b1116..46aa4f2ebb83 100644 --- a/gcc/dojump.c +++ b/gcc/dojump.c @@ -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 (); diff --git a/gcc/expr.c b/gcc/expr.c index 109ddebe5dc2..e61dc6161650 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -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 (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 692e83f993c8..f30067d9a676 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2008-08-12 Jakub Jelinek + 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. diff --git a/gcc/testsuite/gcc.c-torture/compile/20080812-1.c b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c new file mode 100644 index 000000000000..2e4c13a70c85 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20080812-1.c @@ -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); +}