mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[LICM] hoisting/sinking legality - bail early for unsupported instructions
Originally, this was part of a larger refactoring I'd planned, but had to abandoned. I figured the minor improvement in readability was worthwhile. llvm-svn: 338663
This commit is contained in:
parent
4b8c550e74
commit
68eaba6f0a
@ -575,10 +575,29 @@ static bool isLoadInvariantInLoop(LoadInst *LI, DominatorTree *DT,
|
||||
return false;
|
||||
}
|
||||
|
||||
namespace {
|
||||
/// Return true if-and-only-if we know how to (mechanically) both hoist and
|
||||
/// sink a given instruction out of a loop. Does not address legality
|
||||
/// concerns such as aliasing or speculation safety.
|
||||
bool isHoistableAndSinkableInst(Instruction &I) {
|
||||
// Only these instructions are hoistable/sinkable.
|
||||
return (isa<LoadInst>(I) || isa<CallInst>(I) ||
|
||||
isa<BinaryOperator>(I) || isa<CastInst>(I) ||
|
||||
isa<SelectInst>(I) || isa<GetElementPtrInst>(I) ||
|
||||
isa<CmpInst>(I) || isa<InsertElementInst>(I) ||
|
||||
isa<ExtractElementInst>(I) || isa<ShuffleVectorInst>(I) ||
|
||||
isa<ExtractValueInst>(I) || isa<InsertValueInst>(I));
|
||||
}
|
||||
}
|
||||
|
||||
bool llvm::canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT,
|
||||
Loop *CurLoop, AliasSetTracker *CurAST,
|
||||
LoopSafetyInfo *SafetyInfo,
|
||||
OptimizationRemarkEmitter *ORE) {
|
||||
// If we don't understand the instruction, bail early.
|
||||
if (!isHoistableAndSinkableInst(I))
|
||||
return false;
|
||||
|
||||
// SafetyInfo is nullptr if we are checking for sinking from preheader to
|
||||
// loop body.
|
||||
const bool SinkingToLoopBody = !SafetyInfo;
|
||||
@ -666,14 +685,6 @@ bool llvm::canSinkOrHoistInst(Instruction &I, AAResults *AA, DominatorTree *DT,
|
||||
return false;
|
||||
}
|
||||
|
||||
// Only these instructions are hoistable/sinkable.
|
||||
if (!isa<BinaryOperator>(I) && !isa<CastInst>(I) && !isa<SelectInst>(I) &&
|
||||
!isa<GetElementPtrInst>(I) && !isa<CmpInst>(I) &&
|
||||
!isa<InsertElementInst>(I) && !isa<ExtractElementInst>(I) &&
|
||||
!isa<ShuffleVectorInst>(I) && !isa<ExtractValueInst>(I) &&
|
||||
!isa<InsertValueInst>(I))
|
||||
return false;
|
||||
|
||||
// If we are checking for sinking from preheader to loop body it will be
|
||||
// always safe as there is no speculative execution.
|
||||
if (SinkingToLoopBody)
|
||||
|
Loading…
Reference in New Issue
Block a user