mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-03 10:27:09 +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);
|
LI->getAlignment(), DL, CtxI, DT);
|
||||||
}
|
}
|
||||||
case Instruction::Call: {
|
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)) {
|
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(Inst)) {
|
||||||
switch (II->getIntrinsicID()) {
|
switch (II->getIntrinsicID()) {
|
||||||
// These synthetic intrinsics have no side-effects and just mark
|
// These synthetic intrinsics have no side-effects and just mark
|
||||||
// information about their operands.
|
// information about their operands.
|
||||||
// FIXME: There are other no-op synthetic instructions that potentially
|
// FIXME: There are other no-op synthetic instructions that potentially
|
||||||
// should be considered at least *safe* to speculate...
|
// 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_declare:
|
||||||
case Intrinsic::dbg_value:
|
case Intrinsic::dbg_value:
|
||||||
return true;
|
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