Commit 3461a16e by Jakub Jelinek Committed by Jakub Jelinek

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
parent 8b5546d6
2013-01-03 Jakub Jelinek <jakub@redhat.com> 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> Marc Glisse <marc.glisse@inria.fr>
PR tree-optimization/55832 PR tree-optimization/55832
/* 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, ...@@ -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, ...@@ -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);
......
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.
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment