From: Luis Machado <luis.machado@linaro.org>
To: Kyrill Tkachov <kyrylo.tkachov@foss.arm.com>, gcc-patches@gcc.gnu.org
Cc: james.greenhalgh@arm.com, Richard.Earnshaw@arm.com
Subject: Re: [PATCH, v2] Recognize a missed usage of a sbfiz instruction
Date: Thu, 10 May 2018 10:56:00 -0000 [thread overview]
Message-ID: <0a63c9d8-f515-0aee-176b-927f36c1d3f7@linaro.org> (raw)
In-Reply-To: <5AF2FB3A.4040205@foss.arm.com>
[-- Attachment #1: Type: text/plain, Size: 4894 bytes --]
On 05/09/2018 10:44 AM, Kyrill Tkachov wrote:
>
> On 09/05/18 13:30, Luis Machado wrote:
>> Hi Kyrill,
>>
>> On 05/08/2018 11:09 AM, Kyrill Tkachov wrote:
>>> Hi Luis,
>>>
>>> On 07/05/18 15:28, Luis Machado wrote:
>>>> Hi,
>>>>
>>>> On 02/08/2018 10:45 AM, Luis Machado wrote:
>>>>> Hi Kyrill,
>>>>>
>>>>> On 02/08/2018 09:48 AM, Kyrill Tkachov wrote:
>>>>>> Hi Luis,
>>>>>>
>>>>>> On 06/02/18 15:04, Luis Machado wrote:
>>>>>>> Thanks for the feedback Kyrill. I've adjusted the v2 patch based
>>>>>>> on your
>>>>>>> suggestions and re-tested the changes. Everything is still sane.
>>>>>>
>>>>>> Thanks! This looks pretty good to me.
>>>>>>
>>>>>>> Since this is ARM-specific and fairly specific, i wonder if it
>>>>>>> would be
>>>>>>> reasonable to consider it for inclusion at the current stage.
>>>>>>
>>>>>> It is true that the target maintainers can choose to take
>>>>>> such patches at any stage. However, any patch at this stage increases
>>>>>> the risk of regressions being introduced and these regressions
>>>>>> can come bite us in ways that are very hard to anticipate.
>>>>>>
>>>>>> Have a look at some of the bugs in bugzilla (or a quick scan of
>>>>>> the gcc-bugs list)
>>>>>> for examples of the ways that things can go wrong with any of the
>>>>>> myriad of GCC components
>>>>>> and the unexpected ways in which they can interact.
>>>>>>
>>>>>> For example, I am now working on what I initially thought was a
>>>>>> one-liner fix for
>>>>>> PR 84164 but it has expanded into a 3-patch series with a midend
>>>>>> component and
>>>>>> target-specific changes for 2 ports.
>>>>>>
>>>>>> These issues are very hard to catch during review and normal
>>>>>> testing, and can sometimes take months of deep testing by
>>>>>> fuzzing and massive codebase rebuilds to expose, so the closer the
>>>>>> commit is to a release
>>>>>> the higher the risk is that an obscure edge case will be unnoticed
>>>>>> and unfixed in the release.
>>>>>>
>>>>>> So the priority at this stage is to minimise the risk of
>>>>>> destabilising the codebase,
>>>>>> as opposed to taking in new features and desirable performance
>>>>>> improvements (like your patch!)
>>>>>>
>>>>>> That is the rationale for delaying committing such changes until
>>>>>> the start
>>>>>> of GCC 9 development. But again, this is up to the aarch64
>>>>>> maintainers.
>>>>>> I'm sure the patch will be a perfectly fine and desirable commit
>>>>>> for GCC 9.
>>>>>> This is just my perspective as maintainer of the arm port.
>>>>>
>>>>> Thanks. Your explanation makes the situation pretty clear and it
>>>>> sounds very reasonable. I'll put the patch on hold until
>>>>> development is open again.
>>>>>
>>>>> Regards,
>>>>> Luis
>>>>
>>>> With GCC 9 development open, i take it this patch is worth
>>>> considering again?
>>>>
>>>
>>> Yes, I believe the latest version is at:
>>> https://gcc.gnu.org/ml/gcc-patches/2018-02/msg00239.html ?
>>>
>>> +(define_insn "*ashift<mode>_extv_bfiz"
>>> +Â [(set (match_operand:GPI 0 "register_operand" "=r")
>>> +Â Â Â (ashift:GPI (sign_extract:GPI (match_operand:GPI 1
>>> "register_operand" "r")
>>> +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (match_operand 2
>>> "aarch64_simd_shift_imm_offset_<mode>" "n")
>>> +Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â (match_operand 3
>>> "aarch64_simd_shift_imm_<mode>" "n"))
>>> +Â Â Â Â Â Â Â Â Â Â Â Â (match_operand 4 "aarch64_simd_shift_imm_<mode>" "n")))]
>>> +Â ""
>>> +Â "sbfiz\\t%<w>0, %<w>1, %4, %2"
>>> +Â [(set_attr "type" "bfx")]
>>> +)
>>> +
>>
>> Indeed.
>>
>>>
>>> Can you give a bit more information about what are the values for
>>> operands 2,3 and 4 in your example testcases?
>>
>> For sbfiz32 we have 3, 0 and 19 respectively. For sbfiz64 we have 6, 0
>> and 38.
>>
>>> I'm trying to understand why the value of operand 3 (the bit position
>>> the sign-extract starts from) doesn't get validated
>>> in any way and doesn't play any role in the output...
>>
>> This may be an oversight. It seems operand 3 will always be 0 in this
>> particular case i'm covering. It starts from 0, gets shifted x bits to
>> the left and then y < x bits to the right). The operation is
>> essentially an ashift of the bitfield followed by a sign-extension of
>> the msb of the bitfield being extracted.
>>
>> Having a non-zero operand 3 from RTL means the shift amount won't
>> translate directly to operand 3 of sbfiz (the position). Then we'd
>> need to do a calculation where we take into account operand 3 from RTL.
>>
>> I'm wondering when such a RTL pattern, with a non-zero operand 3,
>> would be generated though.
>
> I think it's best to enforce that operand 3 is a zero. Maybe just match
> const_int 0 here directly.
> Better safe than sorry with these things.
Indeed. I've updated the original patch with that change now.
Bootstrapped and regtested on aarch64-linux.
Thanks,
Luis
[-- Attachment #2: sbfiz.diff --]
[-- Type: text/x-patch, Size: 2017 bytes --]
2018-05-10 Luis Machado <luis.machado@linaro.org>
gcc/
* config/aarch64/aarch64.md (*ashift<mode>_extv_bfiz): New pattern.
gcc/testsuite/
* gcc.target/aarch64/lsl_asr_sbfiz.c: New test.
---
gcc/config/aarch64/aarch64.md | 13 +++++++++++++
gcc/testsuite/gcc.target/aarch64/lsl_asr_sbfiz.c | 24 ++++++++++++++++++++++++
2 files changed, 37 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/aarch64/lsl_asr_sbfiz.c
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 32a0e1f..1f943e6 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -4851,6 +4851,19 @@
[(set_attr "type" "bfx")]
)
+;; Match sbfiz pattern in a shift left + shift right operation.
+
+(define_insn "*ashift<mode>_extv_bfiz"
+ [(set (match_operand:GPI 0 "register_operand" "=r")
+ (ashift:GPI (sign_extract:GPI (match_operand:GPI 1 "register_operand" "r")
+ (match_operand 2 "aarch64_simd_shift_imm_offset_<mode>" "n")
+ (const_int 0))
+ (match_operand 3 "aarch64_simd_shift_imm_<mode>" "n")))]
+ ""
+ "sbfiz\\t%<w>0, %<w>1, %3, %2"
+ [(set_attr "type" "bfx")]
+)
+
;; When the bit position and width of the equivalent extraction add up to 32
;; we can use a W-reg LSL instruction taking advantage of the implicit
;; zero-extension of the X-reg.
diff --git a/gcc/testsuite/gcc.target/aarch64/lsl_asr_sbfiz.c b/gcc/testsuite/gcc.target/aarch64/lsl_asr_sbfiz.c
new file mode 100644
index 0000000..106433d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/lsl_asr_sbfiz.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+/* Check that a LSL followed by an ASR can be combined into a single SBFIZ
+ instruction. */
+
+/* Using W-reg */
+
+int
+sbfiz32 (int x)
+{
+ return x << 29 >> 10;
+}
+
+/* Using X-reg */
+
+long long
+sbfiz64 (long long x)
+{
+ return x << 58 >> 20;
+}
+
+/* { dg-final { scan-assembler "sbfiz\tw" } } */
+/* { dg-final { scan-assembler "sbfiz\tx" } } */
--
2.7.4
next prev parent reply other threads:[~2018-05-10 10:31 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-02 14:38 [PATCH] " Luis Machado
2018-02-02 14:57 ` Kyrill Tkachov
2018-02-06 15:04 ` [PATCH, v2] " Luis Machado
2018-02-08 11:48 ` Kyrill Tkachov
2018-02-08 12:45 ` Luis Machado
2018-05-07 14:28 ` Luis Machado
2018-05-08 14:09 ` Kyrill Tkachov
2018-05-09 12:46 ` Luis Machado
2018-05-09 13:55 ` Kyrill Tkachov
2018-05-10 10:56 ` Luis Machado [this message]
2018-05-11 10:29 ` Kyrill Tkachov
2018-05-14 20:50 ` Luis Machado
2018-05-15 8:17 ` Kyrill Tkachov
2018-05-15 16:58 ` James Greenhalgh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0a63c9d8-f515-0aee-176b-927f36c1d3f7@linaro.org \
--to=luis.machado@linaro.org \
--cc=Richard.Earnshaw@arm.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=james.greenhalgh@arm.com \
--cc=kyrylo.tkachov@foss.arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).