[llvm-dev] Sink redundant spill after RA

via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 22 08:39:16 PST 2018


On 2018-02-22 11:14, gberry at codeaurora.org wrote:
> FROM: llvm-dev [mailto:llvm-dev-bounces at lists.llvm.org] ON BEHALF OF
> Jun Lim via llvm-dev
> SENT: Thursday, February 22, 2018 11:05 AM
> 
> Hi All,
> 
> I found some cases where a spill of a live range in a block is
> reloaded only in one of its successors, and there is no reload in
> other paths through other successors. Since the spill is reloaded only
> in a certain path, it must be okay to sink such spill close to its
> reloads. In the AArch64 code below, there is a spill(x2) in the entry,
>  but this value is reloaded only in %bb.1, not in .LBB2_32. If we sink
> the spill (str x2, [sp, #120]) from the entry to its successor
> (%bb.1), the load-from-store promotion might catch this and replace
> the ldr in %bb.1 with a mov instruction. As we move such spill down to
> its successor, we can also encourage more shrink-wrapping as well.
> 
> .globl  _mytest
> 
> // %bb.0:                               // %entry
> 
>         sub     sp, sp, #224            // =224
> 
>         stp     x28, x27, [sp, #128]    // 8-byte Folded Spill
> 
>         stp     x26, x25, [sp, #144]    // 8-byte Folded Spill
> 
>         stp     x24, x23, [sp, #160]    // 8-byte Folded Spill
> 
>         stp     x22, x21, [sp, #176]    // 8-byte Folded Spill
> 
>         stp     x20, x19, [sp, #192]    // 8-byte Folded Spill
> 
>         stp     x29, x30, [sp, #208]    // 8-byte Folded Spill
> 
>         ldrsw   x8, [x0, #4424]
> 
>         sxtw    x10, w2                    <------------- w2 is the
> use of spilled value  before spill.
> 
>         sxtw    x12, w1
> 
>         madd    x8, x8, x10, x12
> 
>         ldr     x9, [x0, #8]
> 
>         add     x9, x9, x8, lsl #2
> 
>         ldrh    w11, [x9]
> 
>         ldrh    w10, [x0, #16]
> 
>         str     x2, [sp, #120]          // 8-byte Folded Spill
> <------------- spill !!!
> 
>         cmp     w11, w10
> 
>         b.eq    .LBB2_32
> 
> // %bb.1:                               // %if.end
> 
> Presumably there is a redefinition of x2 somewhere in here, otherwise
> it wouldn't need to be spilled at all?
> 


In the test case I’m looking at, x2 is redefined in later blocks, but no 
redefinition of x2 before reloading in %bb.1.



>         ldr     x13, [sp, #120]         // 8-byte Folded Reload
> <-------------- reload !!
> 
>        < omitted >
> 
>          :
> 
> .LBB2_32:                               // %cleanup
> <----- no reload from [sp, #120]
> 
>         ldp     x29, x30, [sp, #208]    // 8-byte Folded Reload
> 
>         ldp     x20, x19, [sp, #192]    // 8-byte Folded Reload
> 
>         ldp     x22, x21, [sp, #176]    // 8-byte Folded Reload
> 
>         ldp     x24, x23, [sp, #160]    // 8-byte Folded Reload
> 
>         ldp     x26, x25, [sp, #144]    // 8-byte Folded Reload
> 
>         ldp     x28, x27, [sp, #128]    // 8-byte Folded Reload
> 
>         add     sp, sp, #224            // =224
> 
>         ret
> 
> Unless there is hidden issues that prevent it from being sunk, I think
> such sinking should be done after RA because sinking it down during RA
> will extend the live range of the spilled value. Please let me know if
> there any hidden issue that I miss here? I may happy to hear any
> opinion about it.
> 
> Thanks,
> 
> Jun
> 
> --
> 
> Geoff Berry
> 
> Employee of Qualcomm Datacenter Technologies, Inc.
> 
>  Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
> Technologies, Inc.  Qualcomm Technologies, Inc. is a member of the
> Code Aurora Forum, a Linux Foundation Collaborative Project.

-- 
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm 
Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a 
Linux Foundation Collaborative Project.


More information about the llvm-dev mailing list