aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2005-09-17 20:17:54 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2005-09-17 16:17:54 -0400
commit53c4ca47aefe9fe454964b4db1e007044132f550 (patch)
tree85ccf25f29bce00a90b36b0428c3c68b74835ba9
parent31043f6cfc3612e0278f2dea1a8e3ce050b72798 (diff)
downloadgcc-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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/expmed.c5
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,