This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[committed] Fix lower-subreg cost calculation
- From: Richard Sandiford <rdsandiford at googlemail dot com>
- To: Georg-Johann Lay <avr at gjlay dot de>
- Cc: Mike Stump <mikestump at comcast dot net>, gcc-patches <gcc-patches at gcc dot gnu dot org>, Ian Lance Taylor <iant at google dot com>, Kenneth Zadeck <zadeck at naturalbridge dot com>, Kenneth Zadeck <Kenneth dot Zadeck at NaturalBridge dot com>, ramana dot radhakrishnan at linaro dot org
- Date: Sun, 06 May 2012 19:55:40 +0100
- Subject: [committed] Fix lower-subreg cost calculation
- References: <4F67D595.9030700@naturalbridge.com> <mcrd387n9bf.fsf@dhcp-172-18-216-180.mtv.corp.google.com> <4F6881EA.9080306@naturalbridge.com> <mcrvclzl7b7.fsf@dhcp-172-18-216-180.mtv.corp.google.com> <4F6889CC.8080302@naturalbridge.com> <mcrr4wnl6lb.fsf@dhcp-172-18-216-180.mtv.corp.google.com> <4F74CFB3.5090308@naturalbridge.com> <g47gy2e6z8.fsf@richards-thinkpad.stglab.manchester.uk.ibm.com> <4F75D041.4070206@naturalbridge.com> <g4zkaycd0v.fsf@richards-thinkpad.stglab.manchester.uk.ibm.com> <4F772EF0.8080509@naturalbridge.com> <g4iphgdir9.fsf@richards-thinkpad.stglab.manchester.uk.ibm.com> <4F7B183A.8090903@naturalbridge.com> <87r4w4y647.fsf@talisman.home> <mcriphgy2md.fsf@dhcp-172-18-216-180.mtv.corp.google.com> <g4lilcez75.fsf@richards-thinkpad.stglab.manchester.uk.ibm.com> <4FA2E181.3010302@gjlay.de> <CDDCF324-E6AE-4759-8FA3-AC519DA0F63D@comcast.net> <4FA45FB2.8060307@gjlay.de>
Georg-Johann Lay <avr@gjlay.de> writes:
> TARGET_RTX_COSTS gets called with x = (const_int 1) and outer = SET
> for example. How do I get SET_DEST from that information?
>
> I don't now if lower-subreg.s ever emits such cost requests, but several
> passes definitely do.
Gah! I really should have remembered that insn_rtx_cost happily ignores
both SETs and SET_DESTs, and skips straight to the SET_SRC. This caught
me out when looking at the auto-inc-dec rewrite last year too. (The problem
in that case was that insn_rtx_cost ignored the cost of MEMs in stores,
and only took into account the cost of MEMs in loads.)
While that probably ought to change, I felt like I was going down a
rathole last time I looked at it, so this patch does what I should
have done originally.
For the record: I wondered whether rtlanal.c should base the default
register-to-register copy cost for mode M on the lowest move_cost[M][c][c].
The problem is that move_cost has traditionally been used to choose
between difference classes in the same mode, rather than between modes,
with 2 as the base cost. So I don't think it's suitable.
Tested on x86_64-linux-gnu and with the upcoming MIPS costs. Installed.
Sorry for the breakage.
Richard
gcc/
* lower-subreg.c (shift_cost): Use set_src_cost, avoiding the SET.
(compute_costs): Likewise for the zero extension. Use set_rtx_cost
to compute the cost of moves. Set the mode of the target register.
Index: gcc/lower-subreg.c
===================================================================
--- gcc/lower-subreg.c 2012-05-06 13:47:49.000000000 +0100
+++ gcc/lower-subreg.c 2012-05-06 14:56:47.851024108 +0100
@@ -135,13 +135,11 @@ struct cost_rtxes {
shift_cost (bool speed_p, struct cost_rtxes *rtxes, enum rtx_code code,
enum machine_mode mode, int op1)
{
- PUT_MODE (rtxes->target, mode);
PUT_CODE (rtxes->shift, code);
PUT_MODE (rtxes->shift, mode);
PUT_MODE (rtxes->source, mode);
XEXP (rtxes->shift, 1) = GEN_INT (op1);
- SET_SRC (rtxes->set) = rtxes->shift;
- return insn_rtx_cost (rtxes->set, speed_p);
+ return set_src_cost (rtxes->shift, speed_p);
}
/* For each X in the range [0, BITS_PER_WORD), set SPLITTING[X]
@@ -189,11 +187,12 @@ compute_costs (bool speed_p, struct cost
unsigned int i;
int word_move_zero_cost, word_move_cost;
+ PUT_MODE (rtxes->target, word_mode);
SET_SRC (rtxes->set) = CONST0_RTX (word_mode);
- word_move_zero_cost = insn_rtx_cost (rtxes->set, speed_p);
+ word_move_zero_cost = set_rtx_cost (rtxes->set, speed_p);
SET_SRC (rtxes->set) = rtxes->source;
- word_move_cost = insn_rtx_cost (rtxes->set, speed_p);
+ word_move_cost = set_rtx_cost (rtxes->set, speed_p);
if (LOG_COSTS)
fprintf (stderr, "%s move: from zero cost %d, from reg cost %d\n",
@@ -209,7 +208,7 @@ compute_costs (bool speed_p, struct cost
PUT_MODE (rtxes->target, mode);
PUT_MODE (rtxes->source, mode);
- mode_move_cost = insn_rtx_cost (rtxes->set, speed_p);
+ mode_move_cost = set_rtx_cost (rtxes->set, speed_p);
if (LOG_COSTS)
fprintf (stderr, "%s move: original cost %d, split cost %d * %d\n",
@@ -236,10 +235,8 @@ compute_costs (bool speed_p, struct cost
/* The only case here to check to see if moving the upper part with a
zero is cheaper than doing the zext itself. */
- PUT_MODE (rtxes->target, twice_word_mode);
PUT_MODE (rtxes->source, word_mode);
- SET_SRC (rtxes->set) = rtxes->zext;
- zext_cost = insn_rtx_cost (rtxes->set, speed_p);
+ zext_cost = set_src_cost (rtxes->zext, speed_p);
if (LOG_COSTS)
fprintf (stderr, "%s %s: original cost %d, split cost %d + %d\n",