re PR tree-optimization/48189 (ICE: SIGFPE (division by zero) in in predict_loops () at predict.c:991 with --param max-predicted-iterations=0)

PR tree-optimization/48189
	* predict.c (predict_loops): If max is 0, don't call compare_tree_int.
	If nitercst is 0, don't predict the exit edge.

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

From-SVN: r195046
This commit is contained in:
Jakub Jelinek 2013-01-09 10:00:22 +01:00
parent f6f94d948b
commit 2aa579ad9b
4 changed files with 33 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2013-01-09 Steven Bosscher <steven@gcc.gnu.org>
Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/48189
* predict.c (predict_loops): If max is 0, don't call compare_tree_int.
If nitercst is 0, don't predict the exit edge.
2013-01-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* config/pa/pa.h (VAL_U6_BITS_P): Define.

View File

@ -1,6 +1,6 @@
/* Branch prediction routines for the GNU compiler.
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010,
2011, 2012 Free Software Foundation, Inc.
2011, 2012, 2013 Free Software Foundation, Inc.
This file is part of GCC.
@ -1434,7 +1434,8 @@ predict_loops (void)
if (TREE_CODE (niter) == INTEGER_CST)
{
if (host_integerp (niter, 1)
&& compare_tree_int (niter, max-1) == -1)
&& max
&& compare_tree_int (niter, max - 1) == -1)
nitercst = tree_low_cst (niter, 1) + 1;
else
nitercst = max;
@ -1456,6 +1457,11 @@ predict_loops (void)
else
continue;
/* If the prediction for number of iterations is zero, do not
predict the exit edges. */
if (nitercst == 0)
continue;
probability = ((REG_BR_PROB_BASE + nitercst / 2) / nitercst);
predict_edge (ex, predictor, probability);
}

View File

@ -1,3 +1,8 @@
2013-01-09 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/48189
* gcc.dg/pr48189.c: New test.
2013-01-04 Jan Hubicka <jh@suse.cz>
PR tree-optimization/55823

View File

@ -0,0 +1,13 @@
/* PR tree-optimization/48189 */
/* { dg-do compile } */
/* { dg-options "-O --param max-predicted-iterations=0" } */
struct S { int s[8]; };
void
foo (int *x, struct S *y)
{
int i;
for (i = 0; y[i].s[i]; i++)
*x++ = y[i].s[i];
}