re PR rtl-optimization/55838 (ICE in extract_insn (unrecognizable insn) with -O -funroll-loops)

PR rtl-optimization/55838
	* loop-iv.c (iv_number_of_iterations): Call lowpart_subreg on
	iv0.step, iv1.step and step.

	* gcc.dg/pr55838.c: New test.

From-SVN: r194837
This commit is contained in:
Jakub Jelinek 2013-01-03 10:05:43 +01:00 committed by Jakub Jelinek
parent 8b5546d674
commit 3461a16e0b
4 changed files with 27 additions and 1 deletions

View file

@ -1,3 +1,9 @@
2013-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/55838
* loop-iv.c (iv_number_of_iterations): Call lowpart_subreg on
iv0.step, iv1.step and step.
2013-01-03 Jakub Jelinek <jakub@redhat.com>
Marc Glisse <marc.glisse@inria.fr>

View file

@ -1,5 +1,5 @@
/* Rtl-level induction variable analysis.
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013
Free Software Foundation, Inc.
This file is part of GCC.
@ -2406,6 +2406,9 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
iv1.step = const0_rtx;
}
iv0.step = lowpart_subreg (mode, iv0.step, comp_mode);
iv1.step = lowpart_subreg (mode, iv1.step, comp_mode);
/* This is either infinite loop or the one that ends immediately, depending
on initial values. Unswitching should remove this kind of conditions. */
if (iv0.step == const0_rtx && iv1.step == const0_rtx)
@ -2516,6 +2519,7 @@ iv_number_of_iterations (struct loop *loop, rtx insn, rtx condition,
step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
else
step = iv0.step;
step = lowpart_subreg (mode, step, comp_mode);
delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
delta = lowpart_subreg (mode, delta, comp_mode);
delta = simplify_gen_binary (UMOD, mode, delta, step);

View file

@ -1,5 +1,8 @@
2013-01-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/55838
* gcc.dg/pr55838.c: New test.
PR tree-optimization/55832
* gcc.c-torture/compile/pr55832.c: New test.

View file

@ -0,0 +1,13 @@
/* PR rtl-optimization/55838 */
/* { dg-do compile } */
/* { dg-options "-O2 -funroll-loops" } */
int a;
unsigned char c;
void
f (void)
{
while (c++ < 2)
c = a += 129;
}