[PATCH] D112073: [PowerPC] Emit warning when SP is clobbered by asm
Quinn Pham via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 30 06:43:11 PST 2021
quinnp updated this revision to Diff 390695.
quinnp added a comment.
Addressing review comments. Added a comment about why we are not using getReservedRegs(). Added implementation for PPC64.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112073/new/
https://reviews.llvm.org/D112073
Files:
llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
llvm/lib/Target/PowerPC/PPCRegisterInfo.h
llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning-64.ll
llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning.ll
Index: llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning.ll
@@ -0,0 +1,10 @@
+; RUN: llc < %s -verify-machineinstrs -mtriple=powerpc-unknown-unkown \
+; RUN: -mcpu=pwr7 2>&1 | FileCheck %s
+
+; CHECK: warning: inline asm clobber list contains reserved registers: R1
+; CHECK-NEXT: note: Reserved registers on the clobber list may not be preserved across the asm statement, and clobbering them may lead to undefined behaviour.
+define void @test_r1_clobber() {
+entry:
+ call void asm sideeffect "nop", "~{r1}"()
+ ret void
+}
Index: llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning-64.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/PowerPC/inline-asm-clobber-warning-64.ll
@@ -0,0 +1,10 @@
+; RUN: llc < %s -verify-machineinstrs -mtriple=powerpc64-unknown-unkown \
+; RUN: -mcpu=pwr7 2>&1 | FileCheck %s
+
+; CHECK: warning: inline asm clobber list contains reserved registers: X1
+; CHECK-NEXT: note: Reserved registers on the clobber list may not be preserved across the asm statement, and clobbering them may lead to undefined behaviour.
+define void @test_r1_clobber() {
+entry:
+ call void asm sideeffect "nop", "~{x1}"()
+ ret void
+}
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.h
===================================================================
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.h
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.h
@@ -91,6 +91,8 @@
void adjustStackMapLiveOutMask(uint32_t *Mask) const override;
BitVector getReservedRegs(const MachineFunction &MF) const override;
+ bool isAsmClobberable(const MachineFunction &MF,
+ MCRegister PhysReg) const override;
bool isCallerPreservedPhysReg(MCRegister PhysReg,
const MachineFunction &MF) const override;
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
===================================================================
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
@@ -390,6 +390,18 @@
return Reserved;
}
+bool PPCRegisterInfo::isAsmClobberable(const MachineFunction &MF,
+ MCRegister PhysReg) const {
+ // We cannot use getReservedRegs() to find the registers that are not asm
+ // clobberable because there are some reserved registers which can be
+ // clobbered by inline asm. For example, when LR is clobbered, the register is
+ // saved and restored. We will harcode the registers that are not asm
+ // cloberable in this function.
+
+ // The stack pointer (X1/R1) is not clobberable by inline asm
+ return PhysReg != (TM.isPPC64() ? PPC::X1 : PPC::R1);
+}
+
bool PPCRegisterInfo::requiresFrameIndexScavenging(const MachineFunction &MF) const {
const PPCSubtarget &Subtarget = MF.getSubtarget<PPCSubtarget>();
const PPCInstrInfo *InstrInfo = Subtarget.getInstrInfo();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112073.390695.patch
Type: text/x-patch
Size: 3051 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211130/44f1a51a/attachment.bin>
More information about the llvm-commits
mailing list