mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-10 13:51:37 +00:00
ADT/STLExtras: Introduce llvm::empty; NFC
This is modeled after C++17 std::empty(). Differential Revision: https://reviews.llvm.org/D53909 llvm-svn: 345679
This commit is contained in:
parent
42974890e1
commit
36f7755491
@ -195,6 +195,12 @@ void adl_swap(T &&lhs, T &&rhs) noexcept(
|
|||||||
adl_detail::adl_swap(std::forward<T>(lhs), std::forward<T>(rhs));
|
adl_detail::adl_swap(std::forward<T>(lhs), std::forward<T>(rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Test whether \p RangeOrContainer is empty. Similar to C++17 std::empty.
|
||||||
|
template <typename T>
|
||||||
|
constexpr bool empty(const T &RangeOrContainer) {
|
||||||
|
return adl_begin(RangeOrContainer) == adl_end(RangeOrContainer);
|
||||||
|
}
|
||||||
|
|
||||||
// mapped_iterator - This is a simple iterator adapter that causes a function to
|
// mapped_iterator - This is a simple iterator adapter that causes a function to
|
||||||
// be applied whenever operator* is invoked on the iterator.
|
// be applied whenever operator* is invoked on the iterator.
|
||||||
|
|
||||||
|
@ -619,7 +619,7 @@ LazyCallGraph::RefSCC::switchInternalEdgeToCall(
|
|||||||
|
|
||||||
// If the merge range is empty, then adding the edge didn't actually form any
|
// If the merge range is empty, then adding the edge didn't actually form any
|
||||||
// new cycles. We're done.
|
// new cycles. We're done.
|
||||||
if (MergeRange.begin() == MergeRange.end()) {
|
if (empty(MergeRange)) {
|
||||||
// Now that the SCC structure is finalized, flip the kind to call.
|
// Now that the SCC structure is finalized, flip the kind to call.
|
||||||
SourceN->setEdgeKind(TargetN, Edge::Call);
|
SourceN->setEdgeKind(TargetN, Edge::Call);
|
||||||
return false; // No new cycle.
|
return false; // No new cycle.
|
||||||
|
@ -80,5 +80,5 @@ bool InstructionSelector::isObviouslySafeToFold(MachineInstr &MI,
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
return !MI.mayLoadOrStore() && !MI.hasUnmodeledSideEffects() &&
|
return !MI.mayLoadOrStore() && !MI.hasUnmodeledSideEffects() &&
|
||||||
MI.implicit_operands().begin() == MI.implicit_operands().end();
|
empty(MI.implicit_operands());
|
||||||
}
|
}
|
||||||
|
@ -298,8 +298,7 @@ LegalizeRuleSet &LegalizerInfo::getActionDefinitionsBuilder(
|
|||||||
std::initializer_list<unsigned> Opcodes) {
|
std::initializer_list<unsigned> Opcodes) {
|
||||||
unsigned Representative = *Opcodes.begin();
|
unsigned Representative = *Opcodes.begin();
|
||||||
|
|
||||||
assert(Opcodes.begin() != Opcodes.end() &&
|
assert(!empty(Opcodes) && Opcodes.begin() + 1 != Opcodes.end() &&
|
||||||
Opcodes.begin() + 1 != Opcodes.end() &&
|
|
||||||
"Initializer list must have at least two opcodes");
|
"Initializer list must have at least two opcodes");
|
||||||
|
|
||||||
for (auto I = Opcodes.begin() + 1, E = Opcodes.end(); I != E; ++I)
|
for (auto I = Opcodes.begin() + 1, E = Opcodes.end(); I != E; ++I)
|
||||||
|
@ -140,7 +140,7 @@ bool RegBankSelect::repairReg(
|
|||||||
return false;
|
return false;
|
||||||
assert(ValMapping.NumBreakDowns == 1 && "Not yet implemented");
|
assert(ValMapping.NumBreakDowns == 1 && "Not yet implemented");
|
||||||
// An empty range of new register means no repairing.
|
// An empty range of new register means no repairing.
|
||||||
assert(NewVRegs.begin() != NewVRegs.end() && "We should not have to repair");
|
assert(!empty(NewVRegs) && "We should not have to repair");
|
||||||
|
|
||||||
// Assume we are repairing a use and thus, the original reg will be
|
// Assume we are repairing a use and thus, the original reg will be
|
||||||
// the source of the repairing.
|
// the source of the repairing.
|
||||||
|
@ -426,7 +426,7 @@ void RegisterBankInfo::applyDefaultMapping(const OperandsMapper &OpdMapper) {
|
|||||||
"This mapping is too complex for this function");
|
"This mapping is too complex for this function");
|
||||||
iterator_range<SmallVectorImpl<unsigned>::const_iterator> NewRegs =
|
iterator_range<SmallVectorImpl<unsigned>::const_iterator> NewRegs =
|
||||||
OpdMapper.getVRegs(OpIdx);
|
OpdMapper.getVRegs(OpIdx);
|
||||||
if (NewRegs.begin() == NewRegs.end()) {
|
if (empty(NewRegs)) {
|
||||||
LLVM_DEBUG(dbgs() << " has not been repaired, nothing to be done\n");
|
LLVM_DEBUG(dbgs() << " has not been repaired, nothing to be done\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -88,7 +88,7 @@ iterator_range<CtorDtorIterator> getDestructors(const Module &M) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CtorDtorRunner::add(iterator_range<CtorDtorIterator> CtorDtors) {
|
void CtorDtorRunner::add(iterator_range<CtorDtorIterator> CtorDtors) {
|
||||||
if (CtorDtors.begin() == CtorDtors.end())
|
if (empty(CtorDtors))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
MangleAndInterner Mangle(
|
MangleAndInterner Mangle(
|
||||||
|
@ -280,7 +280,7 @@ bool DebugInfoFinder::addScope(DIScope *Scope) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static MDNode *stripDebugLocFromLoopID(MDNode *N) {
|
static MDNode *stripDebugLocFromLoopID(MDNode *N) {
|
||||||
assert(N->op_begin() != N->op_end() && "Missing self reference?");
|
assert(!empty(N->operands()) && "Missing self reference?");
|
||||||
|
|
||||||
// if there is no debug location, we do not have to rewrite this MDNode.
|
// if there is no debug location, we do not have to rewrite this MDNode.
|
||||||
if (std::none_of(N->op_begin() + 1, N->op_end(), [](const MDOperand &Op) {
|
if (std::none_of(N->op_begin() + 1, N->op_end(), [](const MDOperand &Op) {
|
||||||
|
@ -1251,7 +1251,7 @@ std::pair<bool, Function *> PartialInlinerImpl::unswitchFunction(Function *F) {
|
|||||||
if (PSI->isFunctionEntryCold(F))
|
if (PSI->isFunctionEntryCold(F))
|
||||||
return {false, nullptr};
|
return {false, nullptr};
|
||||||
|
|
||||||
if (F->user_begin() == F->user_end())
|
if (empty(F->users()))
|
||||||
return {false, nullptr};
|
return {false, nullptr};
|
||||||
|
|
||||||
OptimizationRemarkEmitter ORE(F);
|
OptimizationRemarkEmitter ORE(F);
|
||||||
@ -1357,7 +1357,7 @@ bool PartialInlinerImpl::tryPartialInline(FunctionCloner &Cloner) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(Cloner.OrigFunc->user_begin() == Cloner.OrigFunc->user_end() &&
|
assert(empty(Cloner.OrigFunc->users()) &&
|
||||||
"F's users should all be replaced!");
|
"F's users should all be replaced!");
|
||||||
|
|
||||||
std::vector<User *> Users(Cloner.ClonedFunc->user_begin(),
|
std::vector<User *> Users(Cloner.ClonedFunc->user_begin(),
|
||||||
|
@ -1751,7 +1751,7 @@ NewGVN::performSymbolicPHIEvaluation(ArrayRef<ValPair> PHIOps,
|
|||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
// If we are left with no operands, it's dead.
|
// If we are left with no operands, it's dead.
|
||||||
if (Filtered.begin() == Filtered.end()) {
|
if (empty(Filtered)) {
|
||||||
// If it has undef at this point, it means there are no-non-undef arguments,
|
// If it has undef at this point, it means there are no-non-undef arguments,
|
||||||
// and thus, the value of the phi node must be undef.
|
// and thus, the value of the phi node must be undef.
|
||||||
if (HasUndef) {
|
if (HasUndef) {
|
||||||
|
@ -522,7 +522,7 @@ Value *PredicateInfo::materializeStack(unsigned int &Counter,
|
|||||||
if (isa<PredicateWithEdge>(ValInfo)) {
|
if (isa<PredicateWithEdge>(ValInfo)) {
|
||||||
IRBuilder<> B(getBranchTerminator(ValInfo));
|
IRBuilder<> B(getBranchTerminator(ValInfo));
|
||||||
Function *IF = getCopyDeclaration(F.getParent(), Op->getType());
|
Function *IF = getCopyDeclaration(F.getParent(), Op->getType());
|
||||||
if (IF->user_begin() == IF->user_end())
|
if (empty(IF->users()))
|
||||||
CreatedDeclarations.insert(IF);
|
CreatedDeclarations.insert(IF);
|
||||||
CallInst *PIC =
|
CallInst *PIC =
|
||||||
B.CreateCall(IF, Op, Op->getName() + "." + Twine(Counter++));
|
B.CreateCall(IF, Op, Op->getName() + "." + Twine(Counter++));
|
||||||
@ -534,7 +534,7 @@ Value *PredicateInfo::materializeStack(unsigned int &Counter,
|
|||||||
"Should not have gotten here without it being an assume");
|
"Should not have gotten here without it being an assume");
|
||||||
IRBuilder<> B(PAssume->AssumeInst);
|
IRBuilder<> B(PAssume->AssumeInst);
|
||||||
Function *IF = getCopyDeclaration(F.getParent(), Op->getType());
|
Function *IF = getCopyDeclaration(F.getParent(), Op->getType());
|
||||||
if (IF->user_begin() == IF->user_end())
|
if (empty(IF->users()))
|
||||||
CreatedDeclarations.insert(IF);
|
CreatedDeclarations.insert(IF);
|
||||||
CallInst *PIC = B.CreateCall(IF, Op);
|
CallInst *PIC = B.CreateCall(IF, Op);
|
||||||
PredicateMap.insert({PIC, ValInfo});
|
PredicateMap.insert({PIC, ValInfo});
|
||||||
|
@ -5260,7 +5260,7 @@ static bool SwitchToLookupTable(SwitchInst *SI, IRBuilder<> &Builder,
|
|||||||
|
|
||||||
// Figure out the corresponding result for each case value and phi node in the
|
// Figure out the corresponding result for each case value and phi node in the
|
||||||
// common destination, as well as the min and max case values.
|
// common destination, as well as the min and max case values.
|
||||||
assert(SI->case_begin() != SI->case_end());
|
assert(!empty(SI->cases()));
|
||||||
SwitchInst::CaseIt CI = SI->case_begin();
|
SwitchInst::CaseIt CI = SI->case_begin();
|
||||||
ConstantInt *MinCaseVal = CI->getCaseValue();
|
ConstantInt *MinCaseVal = CI->getCaseValue();
|
||||||
ConstantInt *MaxCaseVal = CI->getCaseValue();
|
ConstantInt *MaxCaseVal = CI->getCaseValue();
|
||||||
|
@ -364,6 +364,23 @@ TEST(STLExtrasTest, ADLTest) {
|
|||||||
EXPECT_EQ(5, count);
|
EXPECT_EQ(5, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(STLExtrasTest, EmptyTest) {
|
||||||
|
std::vector<void*> V;
|
||||||
|
EXPECT_TRUE(empty(V));
|
||||||
|
V.push_back(nullptr);
|
||||||
|
EXPECT_FALSE(empty(V));
|
||||||
|
|
||||||
|
std::initializer_list<int> E = {};
|
||||||
|
std::initializer_list<int> NotE = {7, 13, 42};
|
||||||
|
EXPECT_TRUE(empty(E));
|
||||||
|
EXPECT_FALSE(empty(NotE));
|
||||||
|
|
||||||
|
auto R0 = make_range(V.begin(), V.begin());
|
||||||
|
EXPECT_TRUE(empty(R0));
|
||||||
|
auto R1 = make_range(V.begin(), V.end());
|
||||||
|
EXPECT_FALSE(empty(R1));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(STLExtrasTest, EarlyIncrementTest) {
|
TEST(STLExtrasTest, EarlyIncrementTest) {
|
||||||
std::list<int> L = {1, 2, 3, 4};
|
std::list<int> L = {1, 2, 3, 4};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user