[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:
Matt Arsenault 2017-04-28 21:13:09 +00:00
parent 649003c411
commit ba657060a1
2 changed files with 29 additions and 0 deletions

View File

@ -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;

View 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 }