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> 2013-01-03 Jakub Jelinek <jakub@redhat.com>
Marc Glisse <marc.glisse@inria.fr> Marc Glisse <marc.glisse@inria.fr>

View File

@ -1,5 +1,5 @@
/* Rtl-level induction variable analysis. /* 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. Free Software Foundation, Inc.
This file is part of GCC. 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; 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 /* This is either infinite loop or the one that ends immediately, depending
on initial values. Unswitching should remove this kind of conditions. */ on initial values. Unswitching should remove this kind of conditions. */
if (iv0.step == const0_rtx && iv1.step == const0_rtx) 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); step = simplify_gen_unary (NEG, comp_mode, iv1.step, comp_mode);
else else
step = iv0.step; step = iv0.step;
step = lowpart_subreg (mode, step, comp_mode);
delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base); delta = simplify_gen_binary (MINUS, comp_mode, iv1.base, iv0.base);
delta = lowpart_subreg (mode, delta, comp_mode); delta = lowpart_subreg (mode, delta, comp_mode);
delta = simplify_gen_binary (UMOD, mode, delta, step); delta = simplify_gen_binary (UMOD, mode, delta, step);

View File

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