This allows MachineCopyPropagation to eliminate copies of constant registers
such as zero registers. They were previously not being eliminated as the
check for MO.clobbersPhysReg(AvailSrc) would return true for constant
registers such as MIPS $zero.
To avoid having to manually add the zero registers to all CalleeSavedRegs
instantiations in tablegen, I instead added a new isConstant bit to the
Register and set this for MIPS, RISC-V, and AArch64 zero registers.
RegisterInfoEmitter.cpp looks at this flag and adds all constant registers
to the preserved register mask.
This may also benefit other passes but so far I have only seen differences
in MachineCopyPropagation. In the future it might make sense to generate
`isConstantPhysReg()` from this information.
Original source: 8588d8b814
Reviewed By: arsenm
Differential Revision: https://reviews.llvm.org/D131958
39 lines
1.5 KiB
YAML
39 lines
1.5 KiB
YAML
# Check that we can remove the redundant save of constant registers such as $wzr
|
|
# RUN: llc -mtriple=aarch64-unknown-linux %s -verify-machineinstrs -start-before=machine-cp -o - | FileCheck %s --check-prefix ASM
|
|
# RUN: llc -mtriple=aarch64-unknown-linux %s -verify-machineinstrs -run-pass=machine-cp -o - | FileCheck %s
|
|
--- |
|
|
target triple = "aarch64-unknown-linux"
|
|
declare i32 @bar(i32) nounwind
|
|
define i32 @foo() nounwind {
|
|
; ASM-LABEL: foo:
|
|
; ASM: // %bb.0:
|
|
; ASM-NEXT: str x30, [sp, #-16]! // 8-byte Folded Spill
|
|
; ASM-NEXT: mov w0, wzr
|
|
; ASM-NEXT: bl bar
|
|
; ASM-NEXT: mov w0, wzr
|
|
; ASM-NEXT: ldr x30, [sp], #16 // 8-byte Folded Reload
|
|
; ASM-NEXT: ret
|
|
call i32 @bar(i32 0)
|
|
ret i32 0
|
|
}
|
|
...
|
|
---
|
|
name: foo
|
|
body: |
|
|
bb.0 (%ir-block.0):
|
|
; CHECK-LABEL: name: foo
|
|
; CHECK: ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
|
|
; CHECK-NEXT: $w0 = COPY $wzr
|
|
; CHECK-NEXT: BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0
|
|
; CHECK-NEXT: ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
|
|
; CHECK-NEXT: $w0 = COPY $wzr
|
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
|
ADJCALLSTACKDOWN 0, 0, implicit-def dead $sp, implicit $sp
|
|
renamable $w19 = COPY $wzr
|
|
$w0 = COPY renamable $w19
|
|
BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit $w0, implicit-def $sp, implicit-def $w0
|
|
ADJCALLSTACKUP 0, 0, implicit-def dead $sp, implicit $sp
|
|
$w0 = COPY killed renamable $w19
|
|
RET_ReallyLR implicit $w0
|
|
...
|