aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>2002-11-25 19:04:57 +0000
committerRichard Henderson <rth@gcc.gnu.org>2002-11-25 11:04:57 -0800
commitb77f37445e014f2423fc2359b426384adec4b89c (patch)
tree4e94d5151ec5acc085330dd79d49753135c2b16a
parentf815521c75452a0fa9e36f0b5980a5b959f5e4c3 (diff)
downloadgcc-b77f37445e014f2423fc2359b426384adec4b89c.zip
gcc-b77f37445e014f2423fc2359b426384adec4b89c.tar.gz
gcc-b77f37445e014f2423fc2359b426384adec4b89c.tar.bz2
re PR c/8639 (simple integer arithmetic expression broken)
PR c/8639 * fold-const.c (extract_muldiv): Don't propagate division unless both arguments are multiples of C. * gcc.c-torture/execute/20021119-1.c: New. From-SVN: r59466
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c8
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20021119-1.c17
3 files changed, 27 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dd51dfd..967ba8d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-11-25 Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
+
+ PR c/8639
+ * fold-const.c (extract_muldiv): Don't propagate division unless
+ both arguments are multiples of C.
+
2002-11-25 Andrew Haley <aph@redhat.com>
* libgcc-std.ver (_Unwind_Find_Enclosing_Function): Add.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index c4095e4..a7556f4 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -4178,10 +4178,10 @@ extract_muldiv (t, c, code, wide_type)
t2 = extract_muldiv (op1, c, code, wide_type);
if (t1 != 0 && t2 != 0
&& (code == MULT_EXPR
- /* If not multiplication, we can only do this if either operand
- is divisible by c. */
- || multiple_of_p (ctype, op0, c)
- || multiple_of_p (ctype, op1, c)))
+ /* If not multiplication, we can only do this if both operands
+ are divisible by c. */
+ || (multiple_of_p (ctype, op0, c)
+ && multiple_of_p (ctype, op1, c))))
return fold (build (tcode, ctype, convert (ctype, t1),
convert (ctype, t2)));
diff --git a/gcc/testsuite/gcc.c-torture/execute/20021119-1.c b/gcc/testsuite/gcc.c-torture/execute/20021119-1.c
new file mode 100644
index 0000000..c4ef460
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20021119-1.c
@@ -0,0 +1,17 @@
+/* PR 8639. */
+
+extern void abort(void);
+
+int foo (int i)
+{
+ int r;
+ r = (80 - 4 * i) / 20;
+ return r;
+}
+
+int main ()
+{
+ if (foo (1) != 3)
+ abort ();
+ return 0;
+}