aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorJim Wilson <wilson@redhat.com>2002-10-10 19:40:34 +0000
committerJim Wilson <wilson@gcc.gnu.org>2002-10-10 12:40:34 -0700
commitf930bfd067f2cfb739d544a5decec4bc860de28c (patch)
tree654cc2d25b2b6e08c5b5f9f8bf645624b16c5bab /gcc/cse.c
parent61fdde38f06b62cacc760427871ec6efd35749a2 (diff)
downloadgcc-f930bfd067f2cfb739d544a5decec4bc860de28c.zip
gcc-f930bfd067f2cfb739d544a5decec4bc860de28c.tar.gz
gcc-f930bfd067f2cfb739d544a5decec4bc860de28c.tar.bz2
Fix miscompilation of testcase 20021010-1.c for v850 target with -O -mv850e.
* cse.c (fold_rtx): Don't perform associative optimization for DIV and UDIV. From-SVN: r58026
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index 75182d8..378a912 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -4212,7 +4212,7 @@ fold_rtx (x, insn)
from_plus:
case SMIN: case SMAX: case UMIN: case UMAX:
case IOR: case AND: case XOR:
- case MULT: case DIV: case UDIV:
+ case MULT:
case ASHIFT: case LSHIFTRT: case ASHIFTRT:
/* If we have (<op> <reg> <const_int>) for an associative OP and REG
is known to be of similar form, we may be able to replace the
@@ -4260,11 +4260,9 @@ fold_rtx (x, insn)
break;
/* Compute the code used to compose the constants. For example,
- A/C1/C2 is A/(C1 * C2), so if CODE == DIV, we want MULT. */
+ A-C1-C2 is A-(C1 + C2), so if CODE == MINUS, we want PLUS. */
- associate_code
- = (code == MULT || code == DIV || code == UDIV ? MULT
- : is_shift || code == PLUS || code == MINUS ? PLUS : code);
+ associate_code = (is_shift || code == MINUS ? PLUS : code);
new_const = simplify_binary_operation (associate_code, mode,
const_arg1, inner_const);
@@ -4302,6 +4300,14 @@ fold_rtx (x, insn)
}
break;
+ case DIV: case UDIV:
+ /* ??? The associative optimization performed immediately above is
+ also possible for DIV and UDIV using associate_code of MULT.
+ However, we would need extra code to verify that the
+ multiplication does not overflow, that is, there is no overflow
+ in the calculation of new_const. */
+ break;
+
default:
break;
}