aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2003-12-07 12:57:13 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2003-12-07 12:57:13 +0000
commitfd25e9579d7d7c3c97f0158d0b0b58845deaf7d5 (patch)
treec7a279fc1d15b2c2928f94eb4317e4a017ab688b /gcc/loop.c
parent5c6ef9bee008cc943f4387f405e8211cdd58c9e0 (diff)
downloadgcc-fd25e9579d7d7c3c97f0158d0b0b58845deaf7d5.zip
gcc-fd25e9579d7d7c3c97f0158d0b0b58845deaf7d5.tar.gz
gcc-fd25e9579d7d7c3c97f0158d0b0b58845deaf7d5.tar.bz2
re PR rtl-optimization/13318 (ICE: floating point exception in the loop optimizer)
PR optimization/13318 * loop.c (express_from): Protect integer division from overflow. From-SVN: r74387
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index 77567f8..373ff14 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -7196,6 +7196,9 @@ express_from (struct induction *g1, struct induction *g2)
&& GET_CODE (g2->mult_val) == CONST_INT)
{
if (g1->mult_val == const0_rtx
+ || (g1->mult_val == constm1_rtx
+ && INTVAL (g2->mult_val)
+ == (HOST_WIDE_INT) 1 << (HOST_BITS_PER_WIDE_INT - 1))
|| INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
return NULL_RTX;
mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));