re PR rtl-optimization/58997 (ICE on valid code at -O3 on x86_64-linux-gnu (affecting gcc trunk and 4.8.2))

PR rtl-optimization/58997
	* loop-iv.c (iv_subreg): For IV_UNKNOWN_EXTEND, expect
	get_iv_value to be in iv->mode rather than iv->extend_mode.
	(iv_extend): Likewise.  Otherwise, if iv->extend != extend,
	use lowpart_subreg on get_iv_value before calling simplify_gen_unary.
	* loop-unswitch.c (may_unswitch_on): Make sure op[i] is in the right
	mode.

	* gcc.c-torture/compile/pr58997.c: New test.

From-SVN: r204413
This commit is contained in:
Jakub Jelinek 2013-11-05 20:37:51 +01:00 committed by Jakub Jelinek
parent 2a0603f189
commit 50fae5a679
5 changed files with 52 additions and 5 deletions

View File

@ -1,3 +1,13 @@
2013-11-05 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58997
* loop-iv.c (iv_subreg): For IV_UNKNOWN_EXTEND, expect
get_iv_value to be in iv->mode rather than iv->extend_mode.
(iv_extend): Likewise. Otherwise, if iv->extend != extend,
use lowpart_subreg on get_iv_value before calling simplify_gen_unary.
* loop-unswitch.c (may_unswitch_on): Make sure op[i] is in the right
mode.
2013-11-05 Andrew MacLeod <amacleod@redhat.com>
* gimple.h: Move some prototypes to gimple-expr.h and add to include

View File

@ -436,7 +436,9 @@ iv_subreg (struct rtx_iv *iv, enum machine_mode mode)
&& !iv->first_special)
{
rtx val = get_iv_value (iv, const0_rtx);
val = lowpart_subreg (mode, val, iv->extend_mode);
val = lowpart_subreg (mode, val,
iv->extend == IV_UNKNOWN_EXTEND
? iv->mode : iv->extend_mode);
iv->base = val;
iv->extend = IV_UNKNOWN_EXTEND;
@ -476,8 +478,14 @@ iv_extend (struct rtx_iv *iv, enum iv_extend_code extend, enum machine_mode mode
&& !iv->first_special)
{
rtx val = get_iv_value (iv, const0_rtx);
if (iv->extend_mode != iv->mode
&& iv->extend != IV_UNKNOWN_EXTEND
&& iv->extend != extend)
val = lowpart_subreg (iv->mode, val, iv->extend_mode);
val = simplify_gen_unary (iv_extend_to_rtx_code (extend), mode,
val, iv->extend_mode);
val,
iv->extend == extend
? iv->extend_mode : iv->mode);
iv->base = val;
iv->extend = IV_UNKNOWN_EXTEND;
iv->mode = iv->extend_mode = mode;

View File

@ -191,6 +191,7 @@ may_unswitch_on (basic_block bb, struct loop *loop, rtx *cinsn)
if (!test)
return NULL_RTX;
mode = VOIDmode;
for (i = 0; i < 2; i++)
{
op[i] = XEXP (test, i);
@ -205,11 +206,15 @@ may_unswitch_on (basic_block bb, struct loop *loop, rtx *cinsn)
return NULL_RTX;
op[i] = get_iv_value (&iv, const0_rtx);
if (iv.extend != IV_UNKNOWN_EXTEND
&& iv.mode != iv.extend_mode)
op[i] = lowpart_subreg (iv.mode, op[i], iv.extend_mode);
if (mode == VOIDmode)
mode = iv.mode;
else
gcc_assert (mode == iv.mode);
}
mode = GET_MODE (op[0]);
if (mode == VOIDmode)
mode = GET_MODE (op[1]);
if (GET_MODE_CLASS (mode) == MODE_CC)
{
if (at != BB_END (bb))

View File

@ -1,3 +1,8 @@
2013-11-05 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58997
* gcc.c-torture/compile/pr58997.c: New test.
2013-11-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/58724

View File

@ -0,0 +1,19 @@
/* PR rtl-optimization/58997 */
int a, b, c, e;
short d;
char h;
void
foo ()
{
while (b)
{
d = a ? c : 1 % a;
c = d;
h = d;
if (!h)
while (e)
;
}
}