aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorToon Moene <toon@moene.indiv.nluug.nl>2000-07-09 00:29:17 +0200
committerToon Moene <toon@gcc.gnu.org>2000-07-08 22:29:17 +0000
commit12644a9a4012a7f4ace9e450f9789ce516bae239 (patch)
tree4e8a395bcb26470d8d7782b47aa3d952357f7d74 /gcc/fold-const.c
parent0ac76ad9eb17dd98b6008d083aa31442cbfa0410 (diff)
downloadgcc-12644a9a4012a7f4ace9e450f9789ce516bae239.zip
gcc-12644a9a4012a7f4ace9e450f9789ce516bae239.tar.gz
gcc-12644a9a4012a7f4ace9e450f9789ce516bae239.tar.bz2
fold-const.c (extract_muldiv): Check whether c divides op1 exactly if operation is not multiplication.
2000-07-08 Toon Moene <toon@moene.indiv.nluug.nl> * fold-const.c (extract_muldiv) case PLUS_EXPR, MINUS_EXPR: Check whether c divides op1 exactly if operation is not multiplication. From-SVN: r34928
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 5cf688f..26ac5d2 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4501,10 +4501,17 @@ extract_muldiv (t, c, code, wide_type)
break;
}
- /* Now do the operation and verify it doesn't overflow. */
- op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0);
- if (op1 == 0 || TREE_OVERFLOW (op1))
- break;
+ /* If it's a multiply or a division/modulus operation of a multiple
+ of our constant, do the operation and verify it doesn't overflow. */
+ if (code == MULT_EXPR
+ || integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
+ {
+ op1 = const_binop (code, convert (ctype, op1), convert (ctype, c), 0);
+ if (op1 == 0 || TREE_OVERFLOW (op1))
+ break;
+ }
+ else
+ break;
/* If we have an unsigned type is not a sizetype, we cannot widen
the operation since it will change the result if the original