aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Arsenault <Matthew.Arsenault@amd.com>2020-06-28 10:46:56 -0400
committerMatt Arsenault <Matthew.Arsenault@amd.com>2020-06-29 14:45:20 -0400
commit2790516418f4763b5846cd6dd7760a0986ccfa3c (patch)
tree14f0e34910934026f6d6ed66e6c9dd48e22ce98b
parent6d01a9419351b8ff63b520fd86148795e0d9f381 (diff)
downloadllvm-2790516418f4763b5846cd6dd7760a0986ccfa3c.zip
llvm-2790516418f4763b5846cd6dd7760a0986ccfa3c.tar.gz
llvm-2790516418f4763b5846cd6dd7760a0986ccfa3c.tar.bz2
X86: Use MOV32r0 pseudo instead of directly emitting xor
This was producing reg = xor undef reg, undef reg. This looks similar to a use of a value to define itself, and I want to disallow undef uses for SSA virtual registers. If this were to use implicit_def, there's no guarantee the two operands end up using the same register (I think no guarantee exists even if the two operands start out as the same register, but this was violated when I switched this to use an explicit implicit_def). The MOV32r0 pseudo evidently exists to handle this case, so use it instead. This was more work than I expected for the 64-bit case, but I didn't see any helper for materializing a 64-bit 0.
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp17
-rw-r--r--llvm/test/CodeGen/X86/shadow-stack.ll2
2 files changed, 12 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index ebb8656..f24dfb0 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -32469,12 +32469,17 @@ X86TargetLowering::emitLongJmpShadowStackFix(MachineInstr &MI,
MBB->addSuccessor(checkSspMBB);
// Initialize a register with zero.
- Register ZReg = MRI.createVirtualRegister(PtrRC);
- unsigned XorRROpc = (PVT == MVT::i64) ? X86::XOR64rr : X86::XOR32rr;
- BuildMI(checkSspMBB, DL, TII->get(XorRROpc))
- .addDef(ZReg)
- .addReg(ZReg, RegState::Undef)
- .addReg(ZReg, RegState::Undef);
+ Register ZReg = MRI.createVirtualRegister(&X86::GR32RegClass);
+ BuildMI(checkSspMBB, DL, TII->get(X86::MOV32r0), ZReg);
+
+ if (PVT == MVT::i64) {
+ Register TmpZReg = MRI.createVirtualRegister(PtrRC);
+ BuildMI(checkSspMBB, DL, TII->get(X86::SUBREG_TO_REG), TmpZReg)
+ .addImm(0)
+ .addReg(ZReg)
+ .addImm(X86::sub_32bit);
+ ZReg = TmpZReg;
+ }
// Read the current SSP Register value to the zeroed register.
Register SSPCopyReg = MRI.createVirtualRegister(PtrRC);
diff --git a/llvm/test/CodeGen/X86/shadow-stack.ll b/llvm/test/CodeGen/X86/shadow-stack.ll
index bb54610..7316ad8 100644
--- a/llvm/test/CodeGen/X86/shadow-stack.ll
+++ b/llvm/test/CodeGen/X86/shadow-stack.ll
@@ -38,7 +38,7 @@ define i32 @bar(i32 %i) local_unnamed_addr {
; X86_64-NEXT: .cfi_offset %rbp, -16
; X86_64-NEXT: movq _buf@{{.*}}(%rip), %rax
; X86_64-NEXT: movq (%rax), %rax
-; X86_64-NEXT: xorq %rdx, %rdx
+; X86_64-NEXT: xorl %edx, %edx
; X86_64-NEXT: rdsspq %rdx
; X86_64-NEXT: testq %rdx, %rdx
; X86_64-NEXT: je LBB0_5