diff options
author | David Edelsohn <edelsohn@gnu.org> | 2005-09-17 20:17:54 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2005-09-17 16:17:54 -0400 |
commit | 53c4ca47aefe9fe454964b4db1e007044132f550 (patch) | |
tree | 85ccf25f29bce00a90b36b0428c3c68b74835ba9 /gcc | |
parent | 31043f6cfc3612e0278f2dea1a8e3ce050b72798 (diff) | |
download | gcc-53c4ca47aefe9fe454964b4db1e007044132f550.zip gcc-53c4ca47aefe9fe454964b4db1e007044132f550.tar.gz gcc-53c4ca47aefe9fe454964b4db1e007044132f550.tar.bz2 |
re PR middle-end/22067 (Inconsistent multiply by immediate)
PR middle-end/22067
* expmed.c (expand_mult): Substitute simple register for op0 when
computing max_cost.
From-SVN: r104373
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/expmed.c | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index abf9fe0..0c41cf7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-09-17 David Edelsohn <edelsohn@gnu.org> + + PR middle-end/22067 + * expmed.c (expand_mult): Substitute simple register for op0 when + computing max_cost. + 2005-09-17 Richard Henderson <rth@redhat.com> * expr.c (emit_move_via_integer): Add force argument, pass it on diff --git a/gcc/expmed.c b/gcc/expmed.c index a58ae0f..292957c 100644 --- a/gcc/expmed.c +++ b/gcc/expmed.c @@ -3022,6 +3022,7 @@ expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target, && (unsignedp || !flag_trapv)) { HOST_WIDE_INT coeff = 0; + rtx reg = gen_raw_REG (mode, LAST_VIRTUAL_REGISTER + 1); /* synth_mult does an `unsigned int' multiply. As long as the mode is less than or equal in size to `unsigned int' this doesn't matter. @@ -3040,7 +3041,7 @@ expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target, { /* Its safe to use -INTVAL (op1) even for INT_MIN, as the result is interpreted as an unsigned coefficient. */ - max_cost = rtx_cost (gen_rtx_MULT (mode, op0, op1), SET) + max_cost = rtx_cost (gen_rtx_MULT (mode, reg, op1), SET) - neg_cost[mode]; if (max_cost > 0 && choose_mult_variant (mode, -INTVAL (op1), &algorithm, @@ -3083,7 +3084,7 @@ expand_mult (enum machine_mode mode, rtx op0, rtx op1, rtx target, build_int_cst (NULL_TREE, floor_log2 (coeff)), target, unsignedp); - max_cost = rtx_cost (gen_rtx_MULT (mode, op0, op1), SET); + max_cost = rtx_cost (gen_rtx_MULT (mode, reg, op1), SET); if (choose_mult_variant (mode, coeff, &algorithm, &variant, max_cost)) return expand_mult_const (mode, op0, coeff, target, |