This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH 2/3][AArch64] Improve zero extend
- From: "Richard Earnshaw (lists)" <Richard dot Earnshaw at arm dot com>
- To: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: nd <nd at arm dot com>, James Greenhalgh <James dot Greenhalgh at arm dot com>
- Date: Wed, 20 Jul 2016 10:35:38 +0100
- Subject: Re: [PATCH 2/3][AArch64] Improve zero extend
- Authentication-results: sourceware.org; auth=none
- References: <HE1PR0801MB1482D53679CE2F587DE019D183300@HE1PR0801MB1482.eurprd08.prod.outlook.com>
On 19/07/16 16:31, Wilco Dijkstra wrote:
> When zero extending a 32-bit value to 64 bits, there should always be a
> SET operation on the outside, according to the patterns in aarch64.md.
> However, the mid-end can also ask for the cost of a made-up instruction,
> where the zero-extend is part of another operation, not SET.
>
> In this case we currently cost the zero extend operation as a uxtb/uxth.
> Instead, cost it the same way we cost "normal" 32-to-64-bit zero
> extends: as a "mov" or the cost of the inner operation.
>
> Bootstrapped and tested on aarch64-none-elf.
>
> 2016-07-19 Kristina Martsenko <kristina.martsenko@arm.com>
>
> * config/aarch64/aarch64.c (aarch64_rtx_costs): Fix cost of zero extend.
>
I'm not sure about this, while rtx_cost is called recursively as it
walks the RTL, I'd normally expect the outer levels of the recursion to
catch the cases where zero-extend is folded into a more complex
operation. Hitting a case like this suggests that something isn't doing
that correctly.
So what was the top-level RTX passed into rtx_cost? I'd like to get a
better understanding about the use case before acking this patch.
A test-case would be really useful here, even if it can't be used in the
testsuite.
R.
> ---
> gcc/config/aarch64/aarch64.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
> index bddffc3ab28cde3a996fd13c060de36227315fb5..a2621313d3278d39db0f1d5640b33201efefac21 100644
> --- a/gcc/config/aarch64/aarch64.c
> +++ b/gcc/config/aarch64/aarch64.c
> @@ -6421,12 +6421,11 @@ cost_plus:
> a 'w' register implicitly zeroes the upper bits of an 'x'
> register. However, if this is
>
> - (set (reg) (zero_extend (reg)))
> + (zero_extend (reg))
>
> we must cost the explicit register move. */
> if (mode == DImode
> - && GET_MODE (op0) == SImode
> - && outer == SET)
> + && GET_MODE (op0) == SImode)
> {
> int op_cost = rtx_cost (op0, VOIDmode, ZERO_EXTEND, 0, speed);
>
>