mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-03 02:17:41 +00:00
[ValueTracking] Teach isSafeToSpeculativelyExecute() about the speculatable attribute
Patch by Tom Stellard git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@301688 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
649003c411
commit
ba657060a1
@ -3318,12 +3318,18 @@ bool llvm::isSafeToSpeculativelyExecute(const Value *V,
|
||||
LI->getAlignment(), DL, CtxI, DT);
|
||||
}
|
||||
case Instruction::Call: {
|
||||
auto *CI = cast<const CallInst>(Inst);
|
||||
const Function *Callee = CI->getCalledFunction();
|
||||
if (Callee && Callee->isSpeculatable())
|
||||
return true;
|
||||
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
|
||||
switch (II->getIntrinsicID()) {
|
||||
// These synthetic intrinsics have no side-effects and just mark
|
||||
// information about their operands.
|
||||
// FIXME: There are other no-op synthetic instructions that potentially
|
||||
// should be considered at least *safe* to speculate...
|
||||
// FIXME: The speculatable attribute should be added to all these
|
||||
// intrinsics and this case statement should be removed.
|
||||
case Intrinsic::dbg_declare:
|
||||
case Intrinsic::dbg_value:
|
||||
return true;
|
||||
|
23
test/Transforms/SimplifyCFG/speculate-call.ll
Normal file
23
test/Transforms/SimplifyCFG/speculate-call.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; RUN: opt -S -simplifycfg < %s | FileCheck %s
|
||||
|
||||
; CHECK-LABEL: @speculatable_attribute
|
||||
; CHECK: select
|
||||
define i32 @speculatable_attribute(i32 %a) {
|
||||
entry:
|
||||
%c = icmp sgt i32 %a, 64
|
||||
br i1 %c, label %end, label %if
|
||||
|
||||
if:
|
||||
%val = call i32 @func() #0
|
||||
br label %end
|
||||
|
||||
end:
|
||||
%ret = phi i32 [%val, %if], [0, %entry]
|
||||
ret i32 %ret
|
||||
}
|
||||
|
||||
define i32 @func() #0 {
|
||||
ret i32 1
|
||||
}
|
||||
attributes #0 = { nounwind readnone speculatable }
|
||||
|
Loading…
x
Reference in New Issue
Block a user