diff --git a/llvm/lib/Target/X86/X86SpeculativeExecutionSideEffectSuppression.cpp b/llvm/lib/Target/X86/X86SpeculativeExecutionSideEffectSuppression.cpp --- a/llvm/lib/Target/X86/X86SpeculativeExecutionSideEffectSuppression.cpp +++ b/llvm/lib/Target/X86/X86SpeculativeExecutionSideEffectSuppression.cpp @@ -50,6 +50,12 @@ cl::desc("Omit all lfences before branch instructions."), cl::init(false), cl::Hidden); +static cl::opt OmitLFENCEInBasicBlocksWithoutLoads( + "x86-seses-omit-lfence-in-bb-without-loads", + cl::desc("Omit LFENCE in basic blocks without any loads even if there are " + "stores."), + cl::init(false), cl::Hidden); + static bool hasConstantAddressingMode(const MachineInstr &MI); namespace { @@ -81,6 +87,19 @@ const X86Subtarget &Subtarget = MF.getSubtarget(); const X86InstrInfo *TII = Subtarget.getInstrInfo(); for (MachineBasicBlock &MBB : MF) { + if (OmitLFENCEInBasicBlocksWithoutLoads) { + bool FoundLoad = false; + for (const MachineInstr &MI : MBB) { + if (MI.mayLoad()) { + FoundLoad = true; + break; + } + } + if (!FoundLoad) { + continue; + } + } + MachineInstr *FirstTerminator = nullptr; for (auto &MI : MBB) { diff --git a/llvm/test/CodeGen/X86/speculative-execution-side-effect-suppression-omit-lfence-in-bb-without-loads.ll b/llvm/test/CodeGen/X86/speculative-execution-side-effect-suppression-omit-lfence-in-bb-without-loads.ll new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/speculative-execution-side-effect-suppression-omit-lfence-in-bb-without-loads.ll @@ -0,0 +1,31 @@ +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable -x86-seses-omit-lfence-in-bb-without-loads %s -o - | FileCheck %s --check-prefix=CHECK-FLAGGED +; RUN: llc -mtriple=x86_64-unknown-linux-gnu -x86-seses-enable %s -o - | FileCheck %s --check-prefix=CHECK-FULL + +define dso_local void @_Z4buzzv() { +entry: + %a = alloca i32, align 4 + store i32 10, i32* %a, align 4 + ret void +} + +; CHECK-FLAGGED: .globl _Z4buzzv # -- Begin function _Z4buzzv +; CHECK-FLAGGED-NEXT: .p2align 4, 0x90 +; CHECK-FLAGGED-NEXT: .type _Z4buzzv,@function +; CHECK-FLAGGED-NEXT:_Z4buzzv: # @_Z4buzzv +; CHECK-FLAGGED-NEXT:.L_Z4buzzv$local: +; CHECK-FLAGGED-NEXT: .cfi_startproc +; CHECK-FLAGGED-NEXT:# %bb.0: # %entry +; CHECK-FLAGGED-NEXT: movl $10, -4(%rsp) +; CHECK-FLAGGED-NEXT: retq + + +; CHECK-FULL: .globl _Z4buzzv # -- Begin function _Z4buzzv +; CHECK-FULL-NEXT: .p2align 4, 0x90 +; CHECK-FULL-NEXT: .type _Z4buzzv,@function +; CHECK-FULL-NEXT:_Z4buzzv: # @_Z4buzzv +; CHECK-FULL-NEXT:.L_Z4buzzv$local: +; CHECK-FULL-NEXT: .cfi_startproc +; CHECK-FULL-NEXT:# %bb.0: # %entry +; CHECK-FULL-NEXT: lfence +; CHECK-FULL-NEXT: movl $10, -4(%rsp) +; CHECK-FULL-NEXT: retq