diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-09 10:00:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-09 10:00:22 +0100 |
commit | 2aa579ad9bb668a696c31088907a79a845feca3b (patch) | |
tree | 0062efccf829343f841ef19cff0256321501ad8c /gcc/predict.c | |
parent | f6f94d948b86797d83dbb05a454c24227af83378 (diff) | |
download | gcc-2aa579ad9bb668a696c31088907a79a845feca3b.zip gcc-2aa579ad9bb668a696c31088907a79a845feca3b.tar.gz gcc-2aa579ad9bb668a696c31088907a79a845feca3b.tar.bz2 |
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
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 0c16b53..67a5f74 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -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); } |