diff options
author | Toon Moene <toon@moene.indiv.nluug.nl> | 2000-07-09 00:29:17 +0200 |
---|---|---|
committer | Toon Moene <toon@gcc.gnu.org> | 2000-07-08 22:29:17 +0000 |
commit | 12644a9a4012a7f4ace9e450f9789ce516bae239 (patch) | |
tree | 4e8a395bcb26470d8d7782b47aa3d952357f7d74 /gcc/fold-const.c | |
parent | 0ac76ad9eb17dd98b6008d083aa31442cbfa0410 (diff) | |
download | gcc-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.c | 15 |
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 |