From: Kaz Kojima Date: Wed, 8 Jun 2011 04:10:26 +0000 (+0000) Subject: re PR target/49238 ([SH] ICE in extract_insn, at recog.c:2113) X-Git-Tag: releases/gcc-4.5.4~600 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3c024d3133efc647f54fde7284370e7ef5b0f165;p=thirdparty%2Fgcc.git re PR target/49238 ([SH] ICE in extract_insn, at recog.c:2113) PR target/49238 * config/sh/sh.c (expand_cbranchdi4): Use a scratch register if needed when original operands are used for msw_skip comparison. * gcc.c-torture/compile/pr49238.c: New. From-SVN: r174794 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6493443e2c90..a6047dab3656 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-06-08 Kaz Kojima + + Backport from mainline + 2011-06-01 Kaz Kojima + + PR target/49238 + * config/sh/sh.c (expand_cbranchdi4): Use a scratch register if + needed when original operands are used for msw_skip comparison. + 2011-06-05 Eric Botcazou * config/sparc/sparc.c (output_return): Fix thinko in the output of an diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 5ee090c192f2..31a8ad645af7 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -2001,6 +2001,13 @@ expand_cbranchdi4 (rtx *operands, enum rtx_code comparison) { operands[1] = op1h; operands[2] = op2h; + if (reload_completed + && ! arith_reg_or_0_operand (op2h, SImode) + && (true_regnum (op1h) || (comparison != EQ && comparison != NE))) + { + emit_move_insn (scratch, operands[2]); + operands[2] = scratch; + } } operands[3] = skip_label = gen_label_rtx (); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0a88d93b8cc..78cce68b97e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2011-06-08 Kaz Kojima + + Backport from mainline + 2011-06-01 Kaz Kojima + + PR target/49238 + * gcc.c-torture/compile/pr49238.c: New. + 2011-06-05 Kaz Kojima Backport from mainline diff --git a/gcc/testsuite/gcc.c-torture/compile/pr49238.c b/gcc/testsuite/gcc.c-torture/compile/pr49238.c new file mode 100644 index 000000000000..fd8443a8f086 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr49238.c @@ -0,0 +1,18 @@ +/* PR target/49238 */ +extern int bar (void); + +void +foo (unsigned long long a, int b) +{ + int i; + + if (b) + for (a = -12; a >= 10; a = bar ()) + break; + else + return; + + for (i = 0; i < 10; i += 10) + if ((i == bar ()) | (bar () >= a)) + bar (); +}