[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 12:01:34 PDT 2022
joaomoreira updated this revision to Diff 464350.
joaomoreira retitled this revision from "Do not emit JCC to __x86_indirect_thunk" to "[X86] Do not emit JCC to __x86_indirect_thunk".
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,28 @@
+; RUN: llc < %s -O2 --code-model=kernel | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define dso_local void @foo(void()** %something) #0 {
+; CHECK-LABEL: foo:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: movq (%rdi), %r11
+; CHECK-NEXT: testq %r11, %r11
+; 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 void()*, void()** %something, align 8
+ %tobool.not = icmp eq void()* %0, null
+ br i1 %tobool.not, label %if.end, label %if.then
+
+if.then:
+ tail call void %0() #1
+ ret void
+
+if.end:
+ ret void
+}
+
+attributes #0 = { optsize "target-features"="+retpoline-indirect-calls,+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.464350.patch
Type: text/x-patch
Size: 2238 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220930/4ee6cb35/attachment.bin>
More information about the llvm-commits
mailing list