[PATCH] D134915: [X86] Do not emit JCC to __x86_indirect_thunk
Joao Moreira via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 30 14:49:06 PDT 2022
joaomoreira updated this revision to Diff 464411.
joaomoreira marked 3 inline comments as done.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D134915/new/
https://reviews.llvm.org/D134915
Files:
llvm/lib/Target/X86/X86InstrInfo.cpp
llvm/test/CodeGen/X86/jcc-indirect-thunk-kernel.ll
Index: llvm/test/CodeGen/X86/jcc-indirect-thunk-kernel.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/X86/jcc-indirect-thunk-kernel.ll
@@ -0,0 +1,32 @@
+; RUN: llc < %s -O2 --code-model=kernel | FileCheck %s
+; The intent of the test is that we do not generate conditional
+; tail calls to the thunk.
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define dso_local void @foo(ptr %something) #0 {
+; CHECK-LABEL: foo:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movq (%rdi), %r11
+; CHECK-NEXT: testq %r11, %r11
+; Make sure that a JNE was not generated instead of a JE + JMP sequence
+; CHECK-NOT: jne
+; CHECK-NEXT: je .LBB0_1
+; CHECK-NEXT: bb.2: # %if.then
+; CHECK-NEXT: jmp __x86_indirect_thunk_r11
+; CHECK-NEXT: LBB0_1:
+; CHECK-NEXT: retq
+entry:
+ %0 = load ptr, ptr %something, align 8
+ %tobool.not = icmp eq ptr %0, null
+ br i1 %tobool.not, label %if.end, label %if.then
+
+if.then:
+ tail call void %0()
+ br label %if.end
+
+if.end:
+ ret void
+}
+
+attributes #0 = { optsize "target-features"="+retpoline-external-thunk" }
Index: llvm/lib/Target/X86/X86InstrInfo.cpp
===================================================================
--- llvm/lib/Target/X86/X86InstrInfo.cpp
+++ llvm/lib/Target/X86/X86InstrInfo.cpp
@@ -2942,13 +2942,26 @@
bool X86InstrInfo::canMakeTailCallConditional(
SmallVectorImpl<MachineOperand> &BranchCond,
const MachineInstr &TailCall) const {
+
+ const MachineFunction *MF = TailCall.getMF();
+
+ if (MF->getTarget().getCodeModel() == CodeModel::Kernel) {
+ // Kernel patches thunk calls in runtime, these should never be conditional.
+ const MachineOperand &Target = TailCall.getOperand(0);
+ if (Target.isSymbol()) {
+ StringRef Symbol(Target.getSymbolName());
+ // this is currently only relevant to r11/kernel indirect thunk.
+ if (Symbol.equals("__x86_indirect_thunk_r11"))
+ return false;
+ }
+ }
+
if (TailCall.getOpcode() != X86::TCRETURNdi &&
TailCall.getOpcode() != X86::TCRETURNdi64) {
// Only direct calls can be done with a conditional branch.
return false;
}
- const MachineFunction *MF = TailCall.getParent()->getParent();
if (Subtarget.isTargetWin64() && MF->hasWinCFI()) {
// Conditional tail calls confuse the Win64 unwinder.
return false;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134915.464411.patch
Type: text/x-patch
Size: 2387 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220930/ca931491/attachment.bin>
More information about the llvm-commits
mailing list