[PATCH] D116397: [RISCV] Add an MIR pass to replace redundant sext.w instructions with copies.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 30 10:38:16 PST 2021
craig.topper added a comment.
In D116397#3214150 <https://reviews.llvm.org/D116397#3214150>, @craig.topper wrote:
> In D116397#3213615 <https://reviews.llvm.org/D116397#3213615>, @asb wrote:
>
>> This is a nice improvement. I'm seeing a few cases where additional moves are generated when this pass is enabled. Presumably this is exposing a problem elsewhere (or just a case where the register allocator is slightly less good) - but I'm wondering if you have looked at this at all?
>>
>> e.g. 20020529-1.c from the GCC torture suite:
>>
>> --- a/output_rv64imafdc_lp64_O3/20020529-1.s
>> +++ b/output_rv64imafdc_lp64_O3/20020529-1.s
>> @@ -39,9 +39,10 @@ foo: # @foo
>> bnez a0, .LBB0_5
>> # %bb.9: # %if.end8.us.us
>> # in Loop: Header=BB0_8 Depth=1
>> - sext.w a2, a4
>> - addiw a4, a4, 1
>> - bne a2, a1, .LBB0_8
>> + addiw a2, a4, 1
>> + mv a3, a4
>> + mv a4, a2
>> + bne a3, a1, .LBB0_8
>> .LBB0_10: # %if.then
>> lui a0, %hi(f1.beenhere)
>> li a1, 2
>
> This looks like a bad scheduling decision. The NoSchedModel gave a latency of 1 for the sext.w, but a latency of 0 for the COPY that replaced it. With the latency of 1 the sext.w got scheduled before the addiw, with the latency of 0 the copy got scheduled after.
>
> With -mcpu=rocket-rv64 the COPY gets scheduled before.
This is also caused by loop strength reduce not converting the loop exit condition to use the post inc value. This may be related to i32 not being a native type in datalayout. See also https://lists.llvm.org/pipermail/llvm-dev/2021-December/154474.html
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D116397/new/
https://reviews.llvm.org/D116397
More information about the llvm-commits
mailing list