mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Consistent use of the noduplicate attribute.
The "noduplicate" attribute of call instructions is sometimes queried directly and sometimes through the cannotDuplicate() predicate. This patch streamlines all queries to use the cannotDuplicate() predicate. It also adds this predicate to InvokeInst, to mirror what CallInst has. llvm-svn: 204049
This commit is contained in:
parent
d507177bf9
commit
631277f3dd
@ -3026,6 +3026,12 @@ public:
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::NoUnwind);
|
||||
}
|
||||
|
||||
/// \brief Determine if the invoke cannot be duplicated.
|
||||
bool cannotDuplicate() const {return hasFnAttr(Attribute::NoDuplicate); }
|
||||
void setCannotDuplicate() {
|
||||
addAttribute(AttributeSet::FunctionIndex, Attribute::NoDuplicate);
|
||||
}
|
||||
|
||||
/// \brief Determine if the call returns a structure through first
|
||||
/// pointer argument.
|
||||
bool hasStructRetAttr() const {
|
||||
|
@ -65,11 +65,11 @@ void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB,
|
||||
++NumVectorInsts;
|
||||
|
||||
if (const CallInst *CI = dyn_cast<CallInst>(II))
|
||||
if (CI->hasFnAttr(Attribute::NoDuplicate))
|
||||
if (CI->cannotDuplicate())
|
||||
notDuplicatable = true;
|
||||
|
||||
if (const InvokeInst *InvI = dyn_cast<InvokeInst>(II))
|
||||
if (InvI->hasFnAttr(Attribute::NoDuplicate))
|
||||
if (InvI->cannotDuplicate())
|
||||
notDuplicatable = true;
|
||||
|
||||
NumInsts += TTI.getUserCost(&*II);
|
||||
|
@ -723,7 +723,7 @@ bool CallAnalyzer::visitCallSite(CallSite CS) {
|
||||
return false;
|
||||
}
|
||||
if (CS.isCall() &&
|
||||
cast<CallInst>(CS.getInstruction())->hasFnAttr(Attribute::NoDuplicate))
|
||||
cast<CallInst>(CS.getInstruction())->cannotDuplicate())
|
||||
ContainsNoDuplicateCall = true;
|
||||
|
||||
if (Function *F = CS.getCalledFunction()) {
|
||||
|
@ -218,12 +218,12 @@ bool Loop::isSafeToClone() const {
|
||||
return false;
|
||||
|
||||
if (const InvokeInst *II = dyn_cast<InvokeInst>((*I)->getTerminator()))
|
||||
if (II->hasFnAttr(Attribute::NoDuplicate))
|
||||
if (II->cannotDuplicate())
|
||||
return false;
|
||||
|
||||
for (BasicBlock::iterator BI = (*I)->begin(), BE = (*I)->end(); BI != BE; ++BI) {
|
||||
if (const CallInst *CI = dyn_cast<CallInst>(BI)) {
|
||||
if (CI->hasFnAttr(Attribute::NoDuplicate))
|
||||
if (CI->cannotDuplicate())
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -255,7 +255,7 @@ static unsigned getJumpThreadDuplicationCost(const BasicBlock *BB,
|
||||
// as having cost of 2 total, and if they are a vector intrinsic, we model
|
||||
// them as having cost 1.
|
||||
if (const CallInst *CI = dyn_cast<CallInst>(I)) {
|
||||
if (CI->hasFnAttr(Attribute::NoDuplicate))
|
||||
if (CI->cannotDuplicate())
|
||||
// Blocks with NoDuplicate are modelled as having infinite cost, so they
|
||||
// are never duplicated.
|
||||
return ~0U;
|
||||
|
Loading…
Reference in New Issue
Block a user