diff options
author | wilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-10 19:40:34 +0000 |
---|---|---|
committer | wilson <wilson@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-10 19:40:34 +0000 |
commit | 7a4fa2a11409c1ee75e543791f8e21ace9a0829e (patch) | |
tree | 654cc2d25b2b6e08c5b5f9f8bf645624b16c5bab /gcc/cse.c | |
parent | a8a6348a8558a023523f656fbbaf6e53e6d05f57 (diff) | |
download | gcc-7a4fa2a11409c1ee75e543791f8e21ace9a0829e.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58026 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/cse.c b/gcc/cse.c index 75182d8670f..378a91292b3 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; } |