mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
[Attributor] Fold "TrackDependence" into the DepClassTy enum
We don't need a bool and an enum to express the three options we currently have. This makes the interface nicer and much easier to use optional dependencies. Also avoids mistakes where the bool is false and enum ignored.
This commit is contained in:
parent
45e74bf95c
commit
fa902e7024
@ -145,8 +145,9 @@ ChangeStatus operator|(ChangeStatus l, ChangeStatus r);
|
||||
ChangeStatus operator&(ChangeStatus l, ChangeStatus r);
|
||||
|
||||
enum class DepClassTy {
|
||||
REQUIRED,
|
||||
OPTIONAL,
|
||||
REQUIRED, ///< The target cannot be valid if the source is not.
|
||||
OPTIONAL, ///< The target may be valid if the source is not.
|
||||
NONE, ///< Do not track a dependence between source and target.
|
||||
};
|
||||
///}
|
||||
|
||||
@ -1047,7 +1048,7 @@ struct Attributor {
|
||||
/// the one reasoning about the "captured" state for the argument or the one
|
||||
/// reasoning on the memory access behavior of the function as a whole.
|
||||
///
|
||||
/// If the flag \p TrackDependence is set to false the dependence from
|
||||
/// If the DepClass enum is set to `DepClassTy::None` the dependence from
|
||||
/// \p QueryingAA to the return abstract attribute is not automatically
|
||||
/// recorded. This should only be used if the caller will record the
|
||||
/// dependence explicitly if necessary, thus if it the returned abstract
|
||||
@ -1055,9 +1056,9 @@ struct Attributor {
|
||||
/// the `Attributor::recordDependence` method.
|
||||
template <typename AAType>
|
||||
const AAType &getAAFor(const AbstractAttribute &QueryingAA,
|
||||
const IRPosition &IRP, bool TrackDependence = true,
|
||||
const IRPosition &IRP,
|
||||
DepClassTy DepClass = DepClassTy::REQUIRED) {
|
||||
return getOrCreateAAFor<AAType>(IRP, &QueryingAA, TrackDependence, DepClass,
|
||||
return getOrCreateAAFor<AAType>(IRP, &QueryingAA, DepClass,
|
||||
/* ForceUpdate */ false);
|
||||
}
|
||||
|
||||
@ -1069,9 +1070,8 @@ struct Attributor {
|
||||
template <typename AAType>
|
||||
const AAType &getAndUpdateAAFor(const AbstractAttribute &QueryingAA,
|
||||
const IRPosition &IRP,
|
||||
bool TrackDependence = true,
|
||||
DepClassTy DepClass = DepClassTy::REQUIRED) {
|
||||
return getOrCreateAAFor<AAType>(IRP, &QueryingAA, TrackDependence, DepClass,
|
||||
return getOrCreateAAFor<AAType>(IRP, &QueryingAA, DepClass,
|
||||
/* ForceUpdate */ true);
|
||||
}
|
||||
|
||||
@ -1083,10 +1083,9 @@ struct Attributor {
|
||||
template <typename AAType>
|
||||
const AAType &getOrCreateAAFor(const IRPosition &IRP,
|
||||
const AbstractAttribute *QueryingAA = nullptr,
|
||||
bool TrackDependence = false,
|
||||
DepClassTy DepClass = DepClassTy::OPTIONAL,
|
||||
DepClassTy DepClass = DepClassTy::REQUIRED,
|
||||
bool ForceUpdate = false) {
|
||||
if (AAType *AAPtr = lookupAAFor<AAType>(IRP, QueryingAA, TrackDependence)) {
|
||||
if (AAType *AAPtr = lookupAAFor<AAType>(IRP, QueryingAA, DepClass)) {
|
||||
if (ForceUpdate && Phase == AttributorPhase::UPDATE)
|
||||
updateAA(*AAPtr);
|
||||
return *AAPtr;
|
||||
@ -1156,7 +1155,7 @@ struct Attributor {
|
||||
|
||||
Phase = OldPhase;
|
||||
|
||||
if (TrackDependence && AA.getState().isValidState())
|
||||
if (QueryingAA && AA.getState().isValidState())
|
||||
recordDependence(AA, const_cast<AbstractAttribute &>(*QueryingAA),
|
||||
DepClass);
|
||||
return AA;
|
||||
@ -1167,14 +1166,10 @@ struct Attributor {
|
||||
template <typename AAType>
|
||||
AAType *lookupAAFor(const IRPosition &IRP,
|
||||
const AbstractAttribute *QueryingAA = nullptr,
|
||||
bool TrackDependence = false,
|
||||
DepClassTy DepClass = DepClassTy::OPTIONAL) {
|
||||
static_assert(std::is_base_of<AbstractAttribute, AAType>::value,
|
||||
"Cannot query an attribute with a type not derived from "
|
||||
"'AbstractAttribute'!");
|
||||
assert((QueryingAA || !TrackDependence) &&
|
||||
"Cannot track dependences without a QueryingAA!");
|
||||
|
||||
// Lookup the abstract attribute of type AAType. If found, return it after
|
||||
// registering a dependence of QueryingAA on the one returned attribute.
|
||||
AbstractAttribute *AAPtr = AAMap.lookup({&AAType::ID, IRP});
|
||||
@ -1184,7 +1179,8 @@ struct Attributor {
|
||||
AAType *AA = static_cast<AAType *>(AAPtr);
|
||||
|
||||
// Do not register a dependence on an attribute with an invalid state.
|
||||
if (TrackDependence && AA->getState().isValidState())
|
||||
if (DepClass != DepClassTy::NONE && QueryingAA &&
|
||||
AA->getState().isValidState())
|
||||
recordDependence(*AA, const_cast<AbstractAttribute &>(*QueryingAA),
|
||||
DepClass);
|
||||
return AA;
|
||||
@ -1194,7 +1190,7 @@ struct Attributor {
|
||||
/// \p FromAA changes \p ToAA should be updated as well.
|
||||
///
|
||||
/// This method should be used in conjunction with the `getAAFor` method and
|
||||
/// with the TrackDependence flag passed to the method set to false. This can
|
||||
/// with the DepClass enum passed to the method set to None. This can
|
||||
/// be beneficial to avoid false dependences but it requires the users of
|
||||
/// `getAAFor` to explicitly record true dependences through this method.
|
||||
/// The \p DepClass flag indicates if the dependence is striclty necessary.
|
||||
|
@ -535,8 +535,8 @@ void IRPosition::verify() {
|
||||
Optional<Constant *>
|
||||
Attributor::getAssumedConstant(const Value &V, const AbstractAttribute &AA,
|
||||
bool &UsedAssumedInformation) {
|
||||
const auto &ValueSimplifyAA = getAAFor<AAValueSimplify>(
|
||||
AA, IRPosition::value(V), /* TrackDependence */ false);
|
||||
const auto &ValueSimplifyAA =
|
||||
getAAFor<AAValueSimplify>(AA, IRPosition::value(V), DepClassTy::NONE);
|
||||
Optional<Value *> SimplifiedV =
|
||||
ValueSimplifyAA.getAssumedSimplifiedValue(*this);
|
||||
bool IsKnown = ValueSimplifyAA.isKnown();
|
||||
@ -615,8 +615,7 @@ bool Attributor::isAssumedDead(const Instruction &I,
|
||||
bool CheckBBLivenessOnly, DepClassTy DepClass) {
|
||||
if (!FnLivenessAA)
|
||||
FnLivenessAA = lookupAAFor<AAIsDead>(IRPosition::function(*I.getFunction()),
|
||||
QueryingAA,
|
||||
/* TrackDependence */ false);
|
||||
QueryingAA, DepClassTy::NONE);
|
||||
|
||||
// If we have a context instruction and a liveness AA we use it.
|
||||
if (FnLivenessAA &&
|
||||
@ -631,7 +630,7 @@ bool Attributor::isAssumedDead(const Instruction &I,
|
||||
return false;
|
||||
|
||||
const AAIsDead &IsDeadAA = getOrCreateAAFor<AAIsDead>(
|
||||
IRPosition::value(I), QueryingAA, /* TrackDependence */ false);
|
||||
IRPosition::value(I), QueryingAA, DepClassTy::NONE);
|
||||
// Don't check liveness for AAIsDead.
|
||||
if (QueryingAA == &IsDeadAA)
|
||||
return false;
|
||||
@ -664,10 +663,9 @@ bool Attributor::isAssumedDead(const IRPosition &IRP,
|
||||
if (IRP.getPositionKind() == IRPosition::IRP_CALL_SITE)
|
||||
IsDeadAA = &getOrCreateAAFor<AAIsDead>(
|
||||
IRPosition::callsite_returned(cast<CallBase>(IRP.getAssociatedValue())),
|
||||
QueryingAA, /* TrackDependence */ false);
|
||||
QueryingAA, DepClassTy::NONE);
|
||||
else
|
||||
IsDeadAA = &getOrCreateAAFor<AAIsDead>(IRP, QueryingAA,
|
||||
/* TrackDependence */ false);
|
||||
IsDeadAA = &getOrCreateAAFor<AAIsDead>(IRP, QueryingAA, DepClassTy::NONE);
|
||||
// Don't check liveness for AAIsDead.
|
||||
if (QueryingAA == IsDeadAA)
|
||||
return false;
|
||||
@ -715,7 +713,7 @@ bool Attributor::checkForAllUses(function_ref<bool(const Use &, bool &)> Pred,
|
||||
const Function *ScopeFn = IRP.getAnchorScope();
|
||||
const auto *LivenessAA =
|
||||
ScopeFn ? &getAAFor<AAIsDead>(QueryingAA, IRPosition::function(*ScopeFn),
|
||||
/* TrackDependence */ false)
|
||||
DepClassTy::NONE)
|
||||
: nullptr;
|
||||
|
||||
while (!Worklist.empty()) {
|
||||
@ -931,9 +929,9 @@ bool Attributor::checkForAllInstructions(function_ref<bool(Instruction &)> Pred,
|
||||
// TODO: use the function scope once we have call site AAReturnedValues.
|
||||
const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
|
||||
const auto *LivenessAA =
|
||||
CheckBBLivenessOnly ? nullptr
|
||||
: &(getAAFor<AAIsDead>(QueryingAA, QueryIRP,
|
||||
/* TrackDependence */ false));
|
||||
CheckBBLivenessOnly
|
||||
? nullptr
|
||||
: &(getAAFor<AAIsDead>(QueryingAA, QueryIRP, DepClassTy::NONE));
|
||||
|
||||
auto &OpcodeInstMap =
|
||||
InfoCache.getOpcodeInstMapForFunction(*AssociatedFunction);
|
||||
@ -955,7 +953,7 @@ bool Attributor::checkForAllReadWriteInstructions(
|
||||
// TODO: use the function scope once we have call site AAReturnedValues.
|
||||
const IRPosition &QueryIRP = IRPosition::function(*AssociatedFunction);
|
||||
const auto &LivenessAA =
|
||||
getAAFor<AAIsDead>(QueryingAA, QueryIRP, /* TrackDependence */ false);
|
||||
getAAFor<AAIsDead>(QueryingAA, QueryIRP, DepClassTy::NONE);
|
||||
|
||||
for (Instruction *I :
|
||||
InfoCache.getReadOrWriteInstsForFunction(*AssociatedFunction)) {
|
||||
@ -1940,6 +1938,8 @@ InformationCache::FunctionInfo::~FunctionInfo() {
|
||||
void Attributor::recordDependence(const AbstractAttribute &FromAA,
|
||||
const AbstractAttribute &ToAA,
|
||||
DepClassTy DepClass) {
|
||||
if (DepClass == DepClassTy::NONE)
|
||||
return;
|
||||
// If we are outside of an update, thus before the actual fixpoint iteration
|
||||
// started (= when we create AAs), we do not track dependences because we will
|
||||
// put all AAs into the initial worklist anyway.
|
||||
@ -1954,6 +1954,9 @@ void Attributor::rememberDependences() {
|
||||
assert(!DependenceStack.empty() && "No dependences to remember!");
|
||||
|
||||
for (DepInfo &DI : *DependenceStack.back()) {
|
||||
assert((DI.DepClass == DepClassTy::REQUIRED ||
|
||||
DI.DepClass == DepClassTy::OPTIONAL) &&
|
||||
"Expected required or optional dependence (1 bit)!");
|
||||
auto &DepAAs = const_cast<AbstractAttribute &>(*DI.FromAA).Deps;
|
||||
DepAAs.push_back(AbstractAttribute::DepTy(
|
||||
const_cast<AbstractAttribute *>(DI.ToAA), unsigned(DI.DepClass)));
|
||||
|
@ -272,7 +272,7 @@ static bool genericValueTraversal(
|
||||
if (IRP.getAnchorScope())
|
||||
LivenessAA = &A.getAAFor<AAIsDead>(
|
||||
QueryingAA, IRPosition::function(*IRP.getAnchorScope()),
|
||||
/* TrackDependence */ false);
|
||||
DepClassTy::NONE);
|
||||
bool AnyDead = false;
|
||||
|
||||
using Item = std::pair<Value *, const Instruction *>;
|
||||
@ -377,7 +377,8 @@ const Value *stripAndAccumulateMinimalOffsets(
|
||||
// Only track dependence if we are going to use the assumed info.
|
||||
const AAValueConstantRange &ValueConstantRangeAA =
|
||||
A.getAAFor<AAValueConstantRange>(QueryingAA, Pos,
|
||||
/* TrackDependence */ UseAssumed);
|
||||
UseAssumed ? DepClassTy::OPTIONAL
|
||||
: DepClassTy::NONE);
|
||||
ConstantRange Range = UseAssumed ? ValueConstantRangeAA.getAssumed()
|
||||
: ValueConstantRangeAA.getKnown();
|
||||
// We can only use the lower part of the range because the upper part can
|
||||
@ -1487,8 +1488,8 @@ struct AANoFreeFloating : AANoFreeImpl {
|
||||
ChangeStatus updateImpl(Attributor &A) override {
|
||||
const IRPosition &IRP = getIRPosition();
|
||||
|
||||
const auto &NoFreeAA =
|
||||
A.getAAFor<AANoFree>(*this, IRPosition::function_scope(IRP));
|
||||
const auto &NoFreeAA = A.getAAFor<AANoFree>(
|
||||
*this, IRPosition::function_scope(IRP), DepClassTy::OPTIONAL);
|
||||
if (NoFreeAA.isAssumedNoFree())
|
||||
return ChangeStatus::UNCHANGED;
|
||||
|
||||
@ -1638,8 +1639,8 @@ static int64_t getKnownNonNullAndDerefBytesForUse(
|
||||
IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
|
||||
// As long as we only use known information there is no need to track
|
||||
// dependences here.
|
||||
auto &DerefAA = A.getAAFor<AADereferenceable>(QueryingAA, IRP,
|
||||
/* TrackDependence */ false);
|
||||
auto &DerefAA =
|
||||
A.getAAFor<AADereferenceable>(QueryingAA, IRP, DepClassTy::NONE);
|
||||
IsNonNull |= DerefAA.isKnownNonNull();
|
||||
return DerefAA.getKnownDereferenceableBytes();
|
||||
}
|
||||
@ -1852,7 +1853,7 @@ struct AANoRecurseFunction final : AANoRecurseImpl {
|
||||
auto CallSitePred = [&](AbstractCallSite ACS) {
|
||||
const auto &NoRecurseAA = A.getAAFor<AANoRecurse>(
|
||||
*this, IRPosition::function(*ACS.getInstruction()->getFunction()),
|
||||
/* TrackDependence */ false, DepClassTy::OPTIONAL);
|
||||
DepClassTy::NONE);
|
||||
return NoRecurseAA.isKnownNoRecurse();
|
||||
};
|
||||
bool AllCallSitesKnown;
|
||||
@ -2031,12 +2032,12 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
|
||||
// (3) Simplified to null pointer where known to be nonnull.
|
||||
// The argument is a poison value and violate noundef attribute.
|
||||
IRPosition CalleeArgumentIRP = IRPosition::callsite_argument(CB, idx);
|
||||
auto &NoUndefAA = A.getAAFor<AANoUndef>(*this, CalleeArgumentIRP,
|
||||
/* TrackDependence */ false);
|
||||
auto &NoUndefAA =
|
||||
A.getAAFor<AANoUndef>(*this, CalleeArgumentIRP, DepClassTy::NONE);
|
||||
if (!NoUndefAA.isKnownNoUndef())
|
||||
continue;
|
||||
auto &ValueSimplifyAA = A.getAAFor<AAValueSimplify>(
|
||||
*this, IRPosition::value(*ArgVal), /* TrackDependence */ false);
|
||||
*this, IRPosition::value(*ArgVal), DepClassTy::NONE);
|
||||
if (!ValueSimplifyAA.isKnown())
|
||||
continue;
|
||||
Optional<Value *> SimplifiedVal =
|
||||
@ -2049,8 +2050,8 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
|
||||
if (!ArgVal->getType()->isPointerTy() ||
|
||||
!isa<ConstantPointerNull>(*SimplifiedVal.getValue()))
|
||||
continue;
|
||||
auto &NonNullAA = A.getAAFor<AANonNull>(*this, CalleeArgumentIRP,
|
||||
/* TrackDependence */ false);
|
||||
auto &NonNullAA =
|
||||
A.getAAFor<AANonNull>(*this, CalleeArgumentIRP, DepClassTy::NONE);
|
||||
if (NonNullAA.isKnownNonNull())
|
||||
KnownUBInsts.insert(&I);
|
||||
}
|
||||
@ -2080,7 +2081,7 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
|
||||
if (isa<ConstantPointerNull>(V)) {
|
||||
auto &NonNullAA = A.getAAFor<AANonNull>(
|
||||
*this, IRPosition::returned(*getAnchorScope()),
|
||||
/* TrackDependence */ false);
|
||||
DepClassTy::NONE);
|
||||
if (NonNullAA.isKnownNonNull())
|
||||
FoundUB = true;
|
||||
}
|
||||
@ -2107,8 +2108,7 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
|
||||
const IRPosition &ReturnIRP = IRPosition::returned(*getAnchorScope());
|
||||
if (!A.isAssumedDead(ReturnIRP, this, nullptr)) {
|
||||
auto &RetPosNoUndefAA =
|
||||
A.getAAFor<AANoUndef>(*this, ReturnIRP,
|
||||
/* TrackDependence */ false);
|
||||
A.getAAFor<AANoUndef>(*this, ReturnIRP, DepClassTy::NONE);
|
||||
if (RetPosNoUndefAA.isKnownNoUndef())
|
||||
A.checkForAllReturnedValuesAndReturnInsts(InspectReturnInstForUB,
|
||||
*this);
|
||||
@ -2525,8 +2525,7 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
||||
return false;
|
||||
|
||||
auto &CBArgMemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
|
||||
*this, IRPosition::callsite_argument(CB, OtherArgNo),
|
||||
/* TrackDependence */ false);
|
||||
*this, IRPosition::callsite_argument(CB, OtherArgNo), DepClassTy::NONE);
|
||||
|
||||
// If the argument is readnone, there is no read-write aliasing.
|
||||
if (CBArgMemBehaviorAA.isAssumedReadNone()) {
|
||||
@ -2579,8 +2578,7 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
||||
|
||||
const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
|
||||
const Function *ScopeFn = VIRP.getAnchorScope();
|
||||
auto &NoCaptureAA =
|
||||
A.getAAFor<AANoCapture>(*this, VIRP, /* TrackDependence */ false);
|
||||
auto &NoCaptureAA = A.getAAFor<AANoCapture>(*this, VIRP, DepClassTy::NONE);
|
||||
// Check whether the value is captured in the scope using AANoCapture.
|
||||
// Look at CFG and check only uses possibly executed before this
|
||||
// callsite.
|
||||
@ -2653,16 +2651,15 @@ struct AANoAliasCallSiteArgument final : AANoAliasImpl {
|
||||
// If the argument is readnone we are done as there are no accesses via the
|
||||
// argument.
|
||||
auto &MemBehaviorAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(),
|
||||
/* TrackDependence */ false);
|
||||
A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
|
||||
if (MemBehaviorAA.isAssumedReadNone()) {
|
||||
A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
|
||||
return ChangeStatus::UNCHANGED;
|
||||
}
|
||||
|
||||
const IRPosition &VIRP = IRPosition::value(getAssociatedValue());
|
||||
const auto &NoAliasAA = A.getAAFor<AANoAlias>(*this, VIRP,
|
||||
/* TrackDependence */ false);
|
||||
const auto &NoAliasAA =
|
||||
A.getAAFor<AANoAlias>(*this, VIRP, DepClassTy::NONE);
|
||||
|
||||
AAResults *AAR = nullptr;
|
||||
if (isKnownNoAliasDueToNoAliasPreservation(A, AAR, MemBehaviorAA,
|
||||
@ -2805,15 +2802,15 @@ struct AAIsDeadValueImpl : public AAIsDead {
|
||||
return false;
|
||||
|
||||
const IRPosition &CallIRP = IRPosition::callsite_function(*CB);
|
||||
const auto &NoUnwindAA = A.getAndUpdateAAFor<AANoUnwind>(
|
||||
*this, CallIRP, /* TrackDependence */ false);
|
||||
const auto &NoUnwindAA =
|
||||
A.getAndUpdateAAFor<AANoUnwind>(*this, CallIRP, DepClassTy::NONE);
|
||||
if (!NoUnwindAA.isAssumedNoUnwind())
|
||||
return false;
|
||||
if (!NoUnwindAA.isKnownNoUnwind())
|
||||
A.recordDependence(NoUnwindAA, *this, DepClassTy::OPTIONAL);
|
||||
|
||||
const auto &MemBehaviorAA = A.getAndUpdateAAFor<AAMemoryBehavior>(
|
||||
*this, CallIRP, /* TrackDependence */ false);
|
||||
const auto &MemBehaviorAA =
|
||||
A.getAndUpdateAAFor<AAMemoryBehavior>(*this, CallIRP, DepClassTy::NONE);
|
||||
if (MemBehaviorAA.isAssumedReadOnly()) {
|
||||
if (!MemBehaviorAA.isKnownReadOnly())
|
||||
A.recordDependence(MemBehaviorAA, *this, DepClassTy::OPTIONAL);
|
||||
@ -3100,8 +3097,7 @@ struct AAIsDeadFunction : public AAIsDead {
|
||||
if (!CB)
|
||||
continue;
|
||||
const auto &NoReturnAA = A.getAndUpdateAAFor<AANoReturn>(
|
||||
*this, IRPosition::callsite_function(*CB), /* TrackDependence */ true,
|
||||
DepClassTy::OPTIONAL);
|
||||
*this, IRPosition::callsite_function(*CB), DepClassTy::OPTIONAL);
|
||||
bool MayReturn = !NoReturnAA.isAssumedNoReturn();
|
||||
if (MayReturn && (!Invoke2CallAllowed || !isa<InvokeInst>(CB)))
|
||||
continue;
|
||||
@ -3221,8 +3217,8 @@ identifyAliveSuccessors(Attributor &A, const CallBase &CB,
|
||||
SmallVectorImpl<const Instruction *> &AliveSuccessors) {
|
||||
const IRPosition &IPos = IRPosition::callsite_function(CB);
|
||||
|
||||
const auto &NoReturnAA = A.getAndUpdateAAFor<AANoReturn>(
|
||||
AA, IPos, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &NoReturnAA =
|
||||
A.getAndUpdateAAFor<AANoReturn>(AA, IPos, DepClassTy::OPTIONAL);
|
||||
if (NoReturnAA.isAssumedNoReturn())
|
||||
return !NoReturnAA.isKnownNoReturn();
|
||||
if (CB.isTerminator())
|
||||
@ -3246,8 +3242,8 @@ identifyAliveSuccessors(Attributor &A, const InvokeInst &II,
|
||||
AliveSuccessors.push_back(&II.getUnwindDest()->front());
|
||||
} else {
|
||||
const IRPosition &IPos = IRPosition::callsite_function(II);
|
||||
const auto &AANoUnw = A.getAndUpdateAAFor<AANoUnwind>(
|
||||
AA, IPos, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &AANoUnw =
|
||||
A.getAndUpdateAAFor<AANoUnwind>(AA, IPos, DepClassTy::OPTIONAL);
|
||||
if (AANoUnw.isAssumedNoUnwind()) {
|
||||
UsedAssumedInformation |= !AANoUnw.isKnownNoUnwind();
|
||||
} else {
|
||||
@ -3456,8 +3452,7 @@ struct AADereferenceableImpl : AADereferenceable {
|
||||
takeKnownDerefBytesMaximum(Attr.getValueAsInt());
|
||||
|
||||
const IRPosition &IRP = this->getIRPosition();
|
||||
NonNullAA = &A.getAAFor<AANonNull>(*this, IRP,
|
||||
/* TrackDependence */ false);
|
||||
NonNullAA = &A.getAAFor<AANonNull>(*this, IRP, DepClassTy::NONE);
|
||||
|
||||
bool CanBeNull;
|
||||
takeKnownDerefBytesMaximum(
|
||||
@ -3704,8 +3699,7 @@ static unsigned getKnownAlignForUse(Attributor &A, AAAlign &QueryingAA,
|
||||
IRPosition IRP = IRPosition::callsite_argument(*CB, ArgNo);
|
||||
// As long as we only use known information there is no need to track
|
||||
// dependences here.
|
||||
auto &AlignAA = A.getAAFor<AAAlign>(QueryingAA, IRP,
|
||||
/* TrackDependence */ false);
|
||||
auto &AlignAA = A.getAAFor<AAAlign>(QueryingAA, IRP, DepClassTy::NONE);
|
||||
MA = MaybeAlign(AlignAA.getKnownAlign());
|
||||
}
|
||||
|
||||
@ -3955,7 +3949,7 @@ struct AAAlignCallSiteArgument final : AAAlignFloating {
|
||||
// We only take known information from the argument
|
||||
// so we do not need to track a dependence.
|
||||
const auto &ArgAlignAA = A.getAAFor<AAAlign>(
|
||||
*this, IRPosition::argument(*Arg), /* TrackDependence */ false);
|
||||
*this, IRPosition::argument(*Arg), DepClassTy::NONE);
|
||||
takeKnownMaximum(ArgAlignAA.getKnownAlign());
|
||||
}
|
||||
return Changed;
|
||||
@ -4205,8 +4199,7 @@ struct AACaptureUseTracker final : public CaptureTracker {
|
||||
if (CaptureTracker::isDereferenceableOrNull(O, DL))
|
||||
return true;
|
||||
const auto &DerefAA = A.getAAFor<AADereferenceable>(
|
||||
NoCaptureAA, IRPosition::value(*O), /* TrackDependence */ true,
|
||||
DepClassTy::OPTIONAL);
|
||||
NoCaptureAA, IRPosition::value(*O), DepClassTy::OPTIONAL);
|
||||
return DerefAA.getAssumedDereferenceableBytes();
|
||||
}
|
||||
|
||||
@ -4318,14 +4311,13 @@ ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) {
|
||||
isArgumentPosition() ? IRP.getAssociatedFunction() : IRP.getAnchorScope();
|
||||
assert(F && "Expected a function!");
|
||||
const IRPosition &FnPos = IRPosition::function(*F);
|
||||
const auto &IsDeadAA =
|
||||
A.getAAFor<AAIsDead>(*this, FnPos, /* TrackDependence */ false);
|
||||
const auto &IsDeadAA = A.getAAFor<AAIsDead>(*this, FnPos, DepClassTy::NONE);
|
||||
|
||||
AANoCapture::StateType T;
|
||||
|
||||
// Readonly means we cannot capture through memory.
|
||||
const auto &FnMemAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, FnPos, /* TrackDependence */ false);
|
||||
A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::NONE);
|
||||
if (FnMemAA.isAssumedReadOnly()) {
|
||||
T.addKnownBits(NOT_CAPTURED_IN_MEM);
|
||||
if (FnMemAA.isKnownReadOnly())
|
||||
@ -4352,14 +4344,14 @@ ChangeStatus AANoCaptureImpl::updateImpl(Attributor &A) {
|
||||
return true;
|
||||
};
|
||||
|
||||
const auto &NoUnwindAA = A.getAAFor<AANoUnwind>(
|
||||
*this, FnPos, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &NoUnwindAA =
|
||||
A.getAAFor<AANoUnwind>(*this, FnPos, DepClassTy::OPTIONAL);
|
||||
if (NoUnwindAA.isAssumedNoUnwind()) {
|
||||
bool IsVoidTy = F->getReturnType()->isVoidTy();
|
||||
const AAReturnedValues *RVAA =
|
||||
IsVoidTy ? nullptr
|
||||
: &A.getAAFor<AAReturnedValues>(*this, FnPos,
|
||||
/* TrackDependence */ true,
|
||||
|
||||
DepClassTy::OPTIONAL);
|
||||
if (IsVoidTy || CheckReturnedArgs(*RVAA)) {
|
||||
T.addKnownBits(NOT_CAPTURED_IN_RET);
|
||||
@ -4561,7 +4553,7 @@ struct AAValueSimplifyImpl : AAValueSimplify {
|
||||
return false;
|
||||
|
||||
const auto &AA =
|
||||
A.getAAFor<AAType>(*this, getIRPosition(), /* TrackDependence */ false);
|
||||
A.getAAFor<AAType>(*this, getIRPosition(), DepClassTy::NONE);
|
||||
|
||||
Optional<ConstantInt *> COpt = AA.getAssumedConstantInt(A);
|
||||
|
||||
@ -5330,7 +5322,7 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
|
||||
// The dependence is optional so we don't give up once we give up on the
|
||||
// alignment.
|
||||
A.getAAFor<AAAlign>(*this, IRPosition::value(getAssociatedValue()),
|
||||
/* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
DepClassTy::OPTIONAL);
|
||||
|
||||
// Avoid arguments with padding for now.
|
||||
if (!getIRPosition().hasAttr(Attribute::ByVal) &&
|
||||
@ -6171,8 +6163,8 @@ ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) {
|
||||
AAMemoryBehavior::base_t FnMemAssumedState =
|
||||
AAMemoryBehavior::StateType::getWorstState();
|
||||
if (!Arg || !Arg->hasByValAttr()) {
|
||||
const auto &FnMemAA = A.getAAFor<AAMemoryBehavior>(
|
||||
*this, FnPos, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &FnMemAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, FnPos, DepClassTy::OPTIONAL);
|
||||
FnMemAssumedState = FnMemAA.getAssumed();
|
||||
S.addKnownBits(FnMemAA.getKnown());
|
||||
if ((S.getAssumed() & FnMemAA.getAssumed()) == S.getAssumed())
|
||||
@ -6183,8 +6175,8 @@ ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) {
|
||||
// it is, any information derived would be irrelevant anyway as we cannot
|
||||
// check the potential aliases introduced by the capture. However, no need
|
||||
// to fall back to anythign less optimistic than the function state.
|
||||
const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(
|
||||
*this, IRP, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &ArgNoCaptureAA =
|
||||
A.getAAFor<AANoCapture>(*this, IRP, DepClassTy::OPTIONAL);
|
||||
if (!ArgNoCaptureAA.isAssumedNoCaptureMaybeReturned()) {
|
||||
S.intersectAssumedBits(FnMemAssumedState);
|
||||
return ChangeStatus::CHANGED;
|
||||
@ -6197,7 +6189,7 @@ ChangeStatus AAMemoryBehaviorFloating::updateImpl(Attributor &A) {
|
||||
// TODO: Take the FnPos once we have call site specific liveness information.
|
||||
const auto &LivenessAA = A.getAAFor<AAIsDead>(
|
||||
*this, IRPosition::function(*IRP.getAssociatedFunction()),
|
||||
/* TrackDependence */ false);
|
||||
DepClassTy::NONE);
|
||||
|
||||
// Visit and expand uses until all are analyzed or a fixpoint is reached.
|
||||
for (unsigned i = 0; i < Uses.size() && !isAtFixpoint(); i++) {
|
||||
@ -6270,8 +6262,7 @@ bool AAMemoryBehaviorFloating::followUsersOfUseIn(Attributor &A, const Use *U,
|
||||
if (U->get()->getType()->isPointerTy()) {
|
||||
unsigned ArgNo = CB->getArgOperandNo(U);
|
||||
const auto &ArgNoCaptureAA = A.getAAFor<AANoCapture>(
|
||||
*this, IRPosition::callsite_argument(*CB, ArgNo),
|
||||
/* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
*this, IRPosition::callsite_argument(*CB, ArgNo), DepClassTy::OPTIONAL);
|
||||
return !ArgNoCaptureAA.isAssumedNoCapture();
|
||||
}
|
||||
|
||||
@ -6326,9 +6317,8 @@ void AAMemoryBehaviorFloating::analyzeUseIn(Attributor &A, const Use *U,
|
||||
Pos = IRPosition::callsite_argument(*CB, CB->getArgOperandNo(U));
|
||||
else
|
||||
Pos = IRPosition::callsite_function(*CB);
|
||||
const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
|
||||
*this, Pos,
|
||||
/* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &MemBehaviorAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, Pos, DepClassTy::OPTIONAL);
|
||||
// "assumed" has at most the same bits as the MemBehaviorAA assumed
|
||||
// and at least "known".
|
||||
intersectAssumedBits(MemBehaviorAA.getAssumed());
|
||||
@ -6710,8 +6700,8 @@ void AAMemoryLocationImpl::categorizeArgumentPointerLocations(
|
||||
|
||||
// Skip readnone arguments.
|
||||
const IRPosition &ArgOpIRP = IRPosition::callsite_argument(CB, ArgNo);
|
||||
const auto &ArgOpMemLocationAA = A.getAAFor<AAMemoryBehavior>(
|
||||
*this, ArgOpIRP, /* TrackDependence */ true, DepClassTy::OPTIONAL);
|
||||
const auto &ArgOpMemLocationAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, ArgOpIRP, DepClassTy::OPTIONAL);
|
||||
|
||||
if (ArgOpMemLocationAA.isAssumedReadNone())
|
||||
continue;
|
||||
@ -6816,8 +6806,8 @@ struct AAMemoryLocationFunction final : public AAMemoryLocationImpl {
|
||||
/// See AbstractAttribute::updateImpl(Attributor &A).
|
||||
virtual ChangeStatus updateImpl(Attributor &A) override {
|
||||
|
||||
const auto &MemBehaviorAA = A.getAAFor<AAMemoryBehavior>(
|
||||
*this, getIRPosition(), /* TrackDependence */ false);
|
||||
const auto &MemBehaviorAA =
|
||||
A.getAAFor<AAMemoryBehavior>(*this, getIRPosition(), DepClassTy::NONE);
|
||||
if (MemBehaviorAA.isAssumedReadNone()) {
|
||||
if (MemBehaviorAA.isKnownReadNone())
|
||||
return indicateOptimisticFixpoint();
|
||||
@ -7949,8 +7939,8 @@ struct AANoUndefImpl : AANoUndef {
|
||||
// A position whose simplified value does not have any value is
|
||||
// considered to be dead. We don't manifest noundef in such positions for
|
||||
// the same reason above.
|
||||
auto &ValueSimplifyAA = A.getAAFor<AAValueSimplify>(
|
||||
*this, getIRPosition(), /* TrackDependence */ false);
|
||||
auto &ValueSimplifyAA =
|
||||
A.getAAFor<AAValueSimplify>(*this, getIRPosition(), DepClassTy::NONE);
|
||||
if (!ValueSimplifyAA.getAssumedSimplifiedValue(A).hasValue())
|
||||
return ChangeStatus::UNCHANGED;
|
||||
return AANoUndef::manifest(A);
|
||||
|
@ -4,8 +4,8 @@
|
||||
; we don't do that anymore. It also verifies that the combination of
|
||||
; globalopt and argpromotion is able to optimize the call safely.
|
||||
;
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=11 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=11 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -152,15 +152,15 @@ define i32 @main() nounwind {
|
||||
; IS__TUNIT_NPM-NEXT: store i32 1, i32* [[TMP1]], align 8
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1
|
||||
; IS__TUNIT_NPM-NEXT: store i64 2, i64* [[TMP4]], align 4
|
||||
; IS__TUNIT_NPM-NEXT: [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 8
|
||||
; IS__TUNIT_NPM-NEXT: [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 8
|
||||
; IS__TUNIT_NPM-NEXT: [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]]) [[ATTR0]]
|
||||
; IS__TUNIT_NPM-NEXT: [[S_CAST1:%.*]] = bitcast %struct.ss* [[S]] to i32*
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP2:%.*]] = load i32, i32* [[S_CAST1]], align 32
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP0:%.*]] = load i32, i32* [[S_CAST1]], align 8
|
||||
; IS__TUNIT_NPM-NEXT: [[S_0_12:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP3:%.*]] = load i64, i64* [[S_0_12]], align 32
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP1:%.*]] = load i64, i64* [[S_0_12]], align 8
|
||||
; IS__TUNIT_NPM-NEXT: [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]]) [[ATTR0]]
|
||||
; IS__TUNIT_NPM-NEXT: [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP2:%.*]] = load i32, i32* [[S_CAST]], align 32
|
||||
; IS__TUNIT_NPM-NEXT: [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1
|
||||
; IS__TUNIT_NPM-NEXT: [[TMP3:%.*]] = load i64, i64* [[S_0_1]], align 32
|
||||
; IS__TUNIT_NPM-NEXT: [[C1:%.*]] = call i32 @g(i32 [[TMP2]], i64 [[TMP3]]) [[ATTR0]]
|
||||
; IS__TUNIT_NPM-NEXT: [[A:%.*]] = add i32 [[C0]], [[C1]]
|
||||
; IS__TUNIT_NPM-NEXT: ret i32 [[A]]
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
@ -83,127 +83,66 @@ entry:
|
||||
}
|
||||
|
||||
define internal void @.omp_outlined.(i32* noalias %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4) %N, float* dereferenceable(4) %p, i64 %q) {
|
||||
; IS________OPM-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
; IS________OPM-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]]) {
|
||||
; IS________OPM-NEXT: entry:
|
||||
; IS________OPM-NEXT: [[Q_ADDR:%.*]] = alloca i64, align 8
|
||||
; IS________OPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
||||
; IS________OPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
||||
; IS________OPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
||||
; IS________OPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
||||
; IS________OPM-NEXT: store i64 4617315517961601024, i64* [[Q_ADDR]], align 8
|
||||
; IS________OPM-NEXT: [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*
|
||||
; IS________OPM-NEXT: [[TMP:%.*]] = load i32, i32* [[N]], align 4
|
||||
; IS________OPM-NEXT: [[SUB3:%.*]] = add nsw i32 [[TMP]], -3
|
||||
; IS________OPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2
|
||||
; IS________OPM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
||||
; IS________OPM: omp.precond.then:
|
||||
; IS________OPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
|
||||
; IS________OPM-NEXT: store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4
|
||||
; IS________OPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
|
||||
; IS________OPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
|
||||
; IS________OPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; IS________OPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0:@.*]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
|
||||
; IS________OPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________OPM-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]
|
||||
; IS________OPM-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
||||
; IS________OPM: cond.true:
|
||||
; IS________OPM-NEXT: br label [[COND_END:%.*]]
|
||||
; IS________OPM: cond.false:
|
||||
; IS________OPM-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________OPM-NEXT: br label [[COND_END]]
|
||||
; IS________OPM: cond.end:
|
||||
; IS________OPM-NEXT: [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]
|
||||
; IS________OPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
|
||||
; IS________OPM-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
|
||||
; IS________OPM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
||||
; IS________OPM: omp.inner.for.cond:
|
||||
; IS________OPM-NEXT: [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]
|
||||
; IS________OPM-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________OPM-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]
|
||||
; IS________OPM-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]
|
||||
; IS________OPM: omp.inner.for.cond.cleanup:
|
||||
; IS________OPM-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
|
||||
; IS________OPM: omp.inner.for.body:
|
||||
; IS________OPM-NEXT: [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2
|
||||
; IS________OPM-NEXT: [[TMP10:%.*]] = load float, float* [[P]], align 4
|
||||
; IS________OPM-NEXT: [[TMP11:%.*]] = load double, double* [[CONV]], align 8
|
||||
; IS________OPM-NEXT: call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])
|
||||
; IS________OPM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
; IS________OPM: omp.body.continue:
|
||||
; IS________OPM-NEXT: br label [[OMP_INNER_FOR_INC]]
|
||||
; IS________OPM: omp.inner.for.inc:
|
||||
; IS________OPM-NEXT: [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1
|
||||
; IS________OPM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
||||
; IS________OPM: omp.inner.for.end:
|
||||
; IS________OPM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
||||
; IS________OPM: omp.loop.exit:
|
||||
; IS________OPM-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; IS________OPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0]], i32 [[TMP12]])
|
||||
; IS________OPM-NEXT: br label [[OMP_PRECOND_END]]
|
||||
; IS________OPM: omp.precond.end:
|
||||
; IS________OPM-NEXT: ret void
|
||||
;
|
||||
; IS________NPM-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
; IS________NPM-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* noalias nocapture noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]]) {
|
||||
; IS________NPM-NEXT: entry:
|
||||
; IS________NPM-NEXT: [[Q_ADDR:%.*]] = alloca i64, align 8
|
||||
; IS________NPM-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
||||
; IS________NPM-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
||||
; IS________NPM-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
||||
; IS________NPM-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
||||
; IS________NPM-NEXT: store i64 4617315517961601024, i64* [[Q_ADDR]], align 8
|
||||
; IS________NPM-NEXT: [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*
|
||||
; IS________NPM-NEXT: [[TMP:%.*]] = load i32, i32* [[N]], align 4
|
||||
; IS________NPM-NEXT: [[SUB3:%.*]] = add nsw i32 [[TMP]], -3
|
||||
; IS________NPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2
|
||||
; IS________NPM-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
||||
; IS________NPM: omp.precond.then:
|
||||
; IS________NPM-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
|
||||
; IS________NPM-NEXT: store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4
|
||||
; IS________NPM-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
|
||||
; IS________NPM-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
|
||||
; IS________NPM-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; IS________NPM-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0:@.*]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
|
||||
; IS________NPM-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________NPM-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]
|
||||
; IS________NPM-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
||||
; IS________NPM: cond.true:
|
||||
; IS________NPM-NEXT: br label [[COND_END:%.*]]
|
||||
; IS________NPM: cond.false:
|
||||
; IS________NPM-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________NPM-NEXT: br label [[COND_END]]
|
||||
; IS________NPM: cond.end:
|
||||
; IS________NPM-NEXT: [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]
|
||||
; IS________NPM-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
|
||||
; IS________NPM-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
|
||||
; IS________NPM-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
||||
; IS________NPM: omp.inner.for.cond:
|
||||
; IS________NPM-NEXT: [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]
|
||||
; IS________NPM-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; IS________NPM-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]
|
||||
; IS________NPM-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]
|
||||
; IS________NPM: omp.inner.for.cond.cleanup:
|
||||
; IS________NPM-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
|
||||
; IS________NPM: omp.inner.for.body:
|
||||
; IS________NPM-NEXT: [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2
|
||||
; IS________NPM-NEXT: [[TMP10:%.*]] = load float, float* [[P]], align 4
|
||||
; IS________NPM-NEXT: [[TMP11:%.*]] = load double, double* [[CONV]], align 8
|
||||
; IS________NPM-NEXT: call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])
|
||||
; IS________NPM-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
; IS________NPM: omp.body.continue:
|
||||
; IS________NPM-NEXT: br label [[OMP_INNER_FOR_INC]]
|
||||
; IS________NPM: omp.inner.for.inc:
|
||||
; IS________NPM-NEXT: [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1
|
||||
; IS________NPM-NEXT: br label [[OMP_INNER_FOR_COND]]
|
||||
; IS________NPM: omp.inner.for.end:
|
||||
; IS________NPM-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
||||
; IS________NPM: omp.loop.exit:
|
||||
; IS________NPM-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; IS________NPM-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0]], i32 [[TMP12]])
|
||||
; IS________NPM-NEXT: br label [[OMP_PRECOND_END]]
|
||||
; IS________NPM: omp.precond.end:
|
||||
; IS________NPM-NEXT: ret void
|
||||
; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
|
||||
; CHECK-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* nocapture noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]]) {
|
||||
; CHECK-NEXT: entry:
|
||||
; CHECK-NEXT: [[Q_ADDR:%.*]] = alloca i64, align 8
|
||||
; CHECK-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4
|
||||
; CHECK-NEXT: store i64 4617315517961601024, i64* [[Q_ADDR]], align 8
|
||||
; CHECK-NEXT: [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*
|
||||
; CHECK-NEXT: [[TMP:%.*]] = load i32, i32* [[N]], align 4
|
||||
; CHECK-NEXT: [[SUB3:%.*]] = add nsw i32 [[TMP]], -3
|
||||
; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2
|
||||
; CHECK-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]
|
||||
; CHECK: omp.precond.then:
|
||||
; CHECK-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4
|
||||
; CHECK-NEXT: store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4
|
||||
; CHECK-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4
|
||||
; CHECK-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; CHECK-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0:@.*]], i32 [[TMP5]], i32 noundef 34, i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* noundef nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 noundef 1, i32 noundef 1)
|
||||
; CHECK-NEXT: [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]
|
||||
; CHECK-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]
|
||||
; CHECK: cond.true:
|
||||
; CHECK-NEXT: br label [[COND_END:%.*]]
|
||||
; CHECK: cond.false:
|
||||
; CHECK-NEXT: [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: br label [[COND_END]]
|
||||
; CHECK: cond.end:
|
||||
; CHECK-NEXT: [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]
|
||||
; CHECK-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_COND:%.*]]
|
||||
; CHECK: omp.inner.for.cond:
|
||||
; CHECK-NEXT: [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]
|
||||
; CHECK-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4
|
||||
; CHECK-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]
|
||||
; CHECK-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]
|
||||
; CHECK: omp.inner.for.cond.cleanup:
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_END:%.*]]
|
||||
; CHECK: omp.inner.for.body:
|
||||
; CHECK-NEXT: [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2
|
||||
; CHECK-NEXT: [[TMP10:%.*]] = load float, float* [[P]], align 4
|
||||
; CHECK-NEXT: [[TMP11:%.*]] = load double, double* [[CONV]], align 8
|
||||
; CHECK-NEXT: call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])
|
||||
; CHECK-NEXT: br label [[OMP_BODY_CONTINUE:%.*]]
|
||||
; CHECK: omp.body.continue:
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_INC]]
|
||||
; CHECK: omp.inner.for.inc:
|
||||
; CHECK-NEXT: [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1
|
||||
; CHECK-NEXT: br label [[OMP_INNER_FOR_COND]]
|
||||
; CHECK: omp.inner.for.end:
|
||||
; CHECK-NEXT: br label [[OMP_LOOP_EXIT:%.*]]
|
||||
; CHECK: omp.loop.exit:
|
||||
; CHECK-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4
|
||||
; CHECK-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* noundef nonnull align 8 dereferenceable(24) [[GLOB0]], i32 [[TMP12]])
|
||||
; CHECK-NEXT: br label [[OMP_PRECOND_END]]
|
||||
; CHECK: omp.precond.end:
|
||||
; CHECK-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
%q.addr = alloca i64, align 8
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -77,7 +77,6 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AANoSync] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state nosync
|
||||
; GRAPH-NEXT: updates [AANoSync] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state nosync
|
||||
@ -120,7 +119,6 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-NEXT: updates [AAMemoryBehavior] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state readonly
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAMemoryLocation] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state memory:argument
|
||||
; GRAPH-NEXT: updates [AAMemoryLocation] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state memory:argument
|
||||
@ -177,11 +175,9 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AANoUnwind] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state nounwind
|
||||
; GRAPH-NEXT: updates [AAIsDead] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_ret: [@-1]} with state assumed-live
|
||||
; GRAPH-NEXT: updates [AAIsDead] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_ret: [@-1]} with state assumed-live
|
||||
; GRAPH-NEXT: updates [AANoUnwind] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state nounwind
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAMemoryBehavior] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state readonly
|
||||
; GRAPH-NEXT: updates [AAIsDead] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_ret: [@-1]} with state assumed-live
|
||||
; GRAPH-NEXT: updates [AAMemoryBehavior] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state readonly
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAIsDead] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_arg: [@0]} with state assumed-live
|
||||
@ -193,7 +189,6 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-NEXT: [AANoCapture] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-NEXT: updates [AANoCapture] for CtxI ' %2 = load i32, i32* %0, align 4' at position {arg: [@0]} with state assumed not-captured-maybe-returned
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AANoAlias] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_arg: [@0]} with state may-alias
|
||||
; GRAPH-EMPTY:
|
||||
@ -232,6 +227,8 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAIsDead] for CtxI ' br label %8' at position {flt: [@-1]} with state assumed-live
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAIsDead] for CtxI ' br label %8' at position {flt: [@-1]} with state assumed-live
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAIsDead] for CtxI ' %5 = getelementptr inbounds i32, i32* %0, i64 4' at position {flt: [@-1]} with state assumed-live
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAWillReturn] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state may-noreturn
|
||||
@ -247,8 +244,6 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; GRAPH-NEXT: [AAMemoryLocation] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs: [@-1]} with state memory:argument
|
||||
; GRAPH-NEXT: updates [AAMemoryLocation] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state memory:argument
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAIsDead] for CtxI ' br label %8' at position {flt: [@-1]} with state assumed-live
|
||||
; GRAPH-EMPTY:
|
||||
; GRAPH-NEXT: [AAAlign] for CtxI ' %6 = call i32* @checkAndAdvance(i32* %5)' at position {cs_ret: [@-1]} with state align<1-16>
|
||||
; GRAPH-NEXT: updates [AAAlign] for CtxI ' %2 = load i32, i32* %0, align 4' at position {fn_ret:checkAndAdvance [checkAndAdvance@-1]} with state align<1-16>
|
||||
; GRAPH-EMPTY:
|
||||
@ -305,7 +300,6 @@ define i32* @checkAndAdvance(i32* align 16 %0) {
|
||||
; DOT-DAG: Node[[Node36]] -> Node[[Node46]]
|
||||
; DOT-DAG: Node[[Node39]] -> Node[[Node38]]
|
||||
; DOT-DAG: Node[[Node39]] -> Node[[Node6]]
|
||||
; DOT-DAG: Node[[Node40]] -> Node[[Node38]]
|
||||
; DOT-DAG: Node[[Node40]] -> Node[[Node16]]
|
||||
; DOT-DAG: Node[[Node43]] -> Node[[Node34]]
|
||||
; DOT-DAG: Node[[Node45]] -> Node[[Node17]]
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=19 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=21 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=19 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
; FIXME: Figure out why we need 16 iterations here.
|
||||
|
@ -8,8 +8,8 @@
|
||||
|
||||
; Deep Wrapper enabled
|
||||
|
||||
; RUN: opt -attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM,CHECK_ENABLED,NOT_CGSCC_NPM_ENABLED,NOT_CGSCC_OPM_ENABLED,NOT_TUNIT_NPM_ENABLED,IS__TUNIT_____ENABLED,IS________OPM_ENABLED,IS__TUNIT_OPM_ENABLED
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM,CHECK_ENABLED,NOT_CGSCC_OPM_ENABLED,NOT_CGSCC_NPM_ENABLED,NOT_TUNIT_OPM_ENABLED,IS__TUNIT_____ENABLED,IS________NPM_ENABLED,IS__TUNIT_NPM_ENABLED
|
||||
; RUN: opt -attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM,CHECK_ENABLED,NOT_CGSCC_NPM_ENABLED,NOT_CGSCC_OPM_ENABLED,NOT_TUNIT_NPM_ENABLED,IS__TUNIT_____ENABLED,IS________OPM_ENABLED,IS__TUNIT_OPM_ENABLED
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM,CHECK_ENABLED,NOT_CGSCC_OPM_ENABLED,NOT_CGSCC_NPM_ENABLED,NOT_TUNIT_OPM_ENABLED,IS__TUNIT_____ENABLED,IS________NPM_ENABLED,IS__TUNIT_NPM_ENABLED
|
||||
; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM,CHECK_ENABLED,NOT_TUNIT_NPM_ENABLED,NOT_TUNIT_OPM_ENABLED,NOT_CGSCC_NPM_ENABLED,IS__CGSCC_____ENABLED,IS________OPM_ENABLED,IS__CGSCC_OPM_ENABLED
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -attributor-allow-deep-wrappers -disable-inlining -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM,CHECK_ENABLED,NOT_TUNIT_NPM_ENABLED,NOT_TUNIT_OPM_ENABLED,NOT_CGSCC_OPM_ENABLED,IS__CGSCC_____ENABLED,IS________NPM_ENABLED,IS__CGSCC_NPM_ENABLED
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=39 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=39 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=35 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=37 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; TODO: The old pass manager cgscc run is disabled as it causes a crash on windows which is under investigation: http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/23151
|
||||
; opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
@ -37,7 +37,7 @@ define i32 @chain_alive(i32 %arg) {
|
||||
; CHECK: Function Attrs: nounwind readonly
|
||||
; CHECK-LABEL: define {{[^@]+}}@chain_alive
|
||||
; CHECK-SAME: (i32 [[ARG:%.*]]) [[ATTR0:#.*]] {
|
||||
; CHECK-NEXT: [[INIT:%.*]] = call i32 @source() [[ATTR2:#.*]]
|
||||
; CHECK-NEXT: [[INIT:%.*]] = call i32 @source() [[ATTR0]]
|
||||
; CHECK-NEXT: [[V0:%.*]] = add i32 [[ARG]], [[INIT]]
|
||||
; CHECK-NEXT: [[V1:%.*]] = add i32 [[INIT]], [[V0]]
|
||||
; CHECK-NEXT: [[V2:%.*]] = add i32 [[V0]], [[V1]]
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=18 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=21 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=19 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=11 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=11 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=15 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=14 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -enable-new-pm=0 -attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=22 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=20 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -enable-new-pm=0 -attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=20 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=19 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -enable-new-pm=0 -attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
;
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=25 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=31 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=23 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=27 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=12 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=13 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=10 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
@ -41,7 +41,7 @@ define i32* @external_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {
|
||||
; IS__TUNIT____-NEXT: entry:
|
||||
; IS__TUNIT____-NEXT: [[CALL:%.*]] = call i32* @internal_ret0_nw(i32* nofree [[N0]], i32* nofree [[W0]]) [[ATTR2:#.*]]
|
||||
; IS__TUNIT____-NEXT: [[CALL1:%.*]] = call i32* @internal_ret1_rrw(i32* nofree align 4 [[R0]], i32* nofree [[R0]], i32* nofree [[W0]]) [[ATTR2]]
|
||||
; IS__TUNIT____-NEXT: [[CALL2:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR2]]
|
||||
; IS__TUNIT____-NEXT: [[CALL2:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR3:#.*]]
|
||||
; IS__TUNIT____-NEXT: [[CALL3:%.*]] = call i32* @internal_ret1_rw(i32* nofree align 4 [[R0]], i32* nofree [[W0]]) [[ATTR2]]
|
||||
; IS__TUNIT____-NEXT: ret i32* [[CALL3]]
|
||||
;
|
||||
@ -106,8 +106,8 @@ define internal i32* @internal_ret0_nw(i32* %n0, i32* %w0) {
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @internal_ret1_rrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree noundef nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL2:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree noundef nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL4:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR4:#.*]]
|
||||
; IS__CGSCC____-NEXT: [[CALL4:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR4]]
|
||||
; IS__CGSCC____-NEXT: [[CALL5:%.*]] = call i32* @internal_ret0_nw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: br label [[RETURN]]
|
||||
; IS__CGSCC____: return:
|
||||
@ -189,8 +189,8 @@ define internal i32* @internal_ret1_rrw(i32* %r0, i32* %r1, i32* %w0) {
|
||||
; IS__CGSCC____-NEXT: [[CALL3:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[W0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL4:%.*]] = call i32* @external_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL5:%.*]] = call i32* @external_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL6:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL7:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL6:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR4]]
|
||||
; IS__CGSCC____-NEXT: [[CALL7:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR4]]
|
||||
; IS__CGSCC____-NEXT: [[CALL8:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: br label [[RETURN]]
|
||||
; IS__CGSCC____: return:
|
||||
@ -311,7 +311,7 @@ define internal i32* @internal_ret1_rw(i32* %r0, i32* %w0) {
|
||||
; IS__CGSCC____-NEXT: store i32 [[TMP1]], i32* [[W0]], align 4
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32* @internal_ret0_nw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL2:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[W0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]]) [[ATTR4]]
|
||||
; IS__CGSCC____-NEXT: [[CALL4:%.*]] = call i32* @external_ret2_nrw(i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree noundef nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]]) [[ATTR2]]
|
||||
; IS__CGSCC____-NEXT: br label [[RETURN]]
|
||||
; IS__CGSCC____: return:
|
||||
@ -346,7 +346,7 @@ define i32* @external_source_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {
|
||||
; IS__TUNIT____-LABEL: define {{[^@]+}}@external_source_ret2_nrw
|
||||
; IS__TUNIT____-SAME: (i32* nofree [[N0:%.*]], i32* nofree [[R0:%.*]], i32* nofree returned [[W0:%.*]]) [[ATTR0]] {
|
||||
; IS__TUNIT____-NEXT: entry:
|
||||
; IS__TUNIT____-NEXT: [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR3:#.*]]
|
||||
; IS__TUNIT____-NEXT: [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__TUNIT____-NEXT: [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree [[R0]], i32* nofree [[W0]]) [[ATTR2]]
|
||||
; IS__TUNIT____-NEXT: ret i32* [[CALL1]]
|
||||
;
|
||||
@ -354,8 +354,8 @@ define i32* @external_source_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@external_source_ret2_nrw
|
||||
; IS__CGSCC____-SAME: (i32* nofree [[N0:%.*]], i32* nofree [[R0:%.*]], i32* nofree returned [[W0:%.*]]) [[ATTR0]] {
|
||||
; IS__CGSCC____-NEXT: entry:
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR4:#.*]]
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree [[R0]], i32* nofree [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]]) [[ATTR3]]
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree [[R0]], i32* nofree [[W0]]) [[ATTR4]]
|
||||
; IS__CGSCC____-NEXT: ret i32* [[CALL1]]
|
||||
;
|
||||
entry:
|
||||
@ -372,7 +372,6 @@ entry:
|
||||
; IS__CGSCC____: attributes #{{.*}} = { argmemonly nofree norecurse nosync nounwind willreturn }
|
||||
; IS__CGSCC____: attributes #{{.*}} = { nofree nosync nounwind }
|
||||
; IS__CGSCC____: attributes #{{.*}} = { nounwind }
|
||||
; IS__CGSCC____: attributes #{{.*}} = { nounwind willreturn }
|
||||
; IS__CGSCC____-NOT: attributes #
|
||||
|
||||
; IS__TUNIT____-NOT: attributes #
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
;
|
||||
@ -242,19 +242,19 @@ define i32 @scc_rX(i32 %a, i32 %b, i32 %r) #0 {
|
||||
; IS__CGSCC____-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
|
||||
; IS__CGSCC____: if.then:
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32 @sink_r0(i32 [[R]]) [[ATTR6]]
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32 @scc_r2(i32 [[B]], i32 [[A]], i32 [[CALL]])
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32 @scc_r2(i32 [[B]], i32 [[A]], i32 [[CALL]]) [[ATTR8:#.*]]
|
||||
; IS__CGSCC____-NEXT: br label [[RETURN:%.*]]
|
||||
; IS__CGSCC____: if.end:
|
||||
; IS__CGSCC____-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]
|
||||
; IS__CGSCC____-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]
|
||||
; IS__CGSCC____: if.then3:
|
||||
; IS__CGSCC____-NEXT: [[CALL4:%.*]] = call i32 @sink_r0(i32 [[B]])
|
||||
; IS__CGSCC____-NEXT: [[CALL5:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef)
|
||||
; IS__CGSCC____-NEXT: [[CALL6:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[R]], i32 [[R]])
|
||||
; IS__CGSCC____-NEXT: [[CALL7:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[CALL6]], i32 undef)
|
||||
; IS__CGSCC____-NEXT: [[CALL8:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef)
|
||||
; IS__CGSCC____-NEXT: [[CALL9:%.*]] = call i32 @scc_r2(i32 [[CALL5]], i32 [[CALL7]], i32 [[CALL8]])
|
||||
; IS__CGSCC____-NEXT: [[CALL11:%.*]] = call i32 @scc_r1(i32 [[CALL4]], i32 [[CALL9]], i32 undef)
|
||||
; IS__CGSCC____-NEXT: [[CALL5:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL6:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[R]], i32 [[R]]) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL7:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[CALL6]], i32 undef) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL8:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL9:%.*]] = call i32 @scc_r2(i32 [[CALL5]], i32 [[CALL7]], i32 [[CALL8]]) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL11:%.*]] = call i32 @scc_r1(i32 [[CALL4]], i32 [[CALL9]], i32 undef) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: br label [[RETURN]]
|
||||
; IS__CGSCC____: if.end12:
|
||||
; IS__CGSCC____-NEXT: [[CMP13:%.*]] = icmp eq i32 [[A]], [[B]]
|
||||
@ -262,7 +262,7 @@ define i32 @scc_rX(i32 %a, i32 %b, i32 %r) #0 {
|
||||
; IS__CGSCC____: cond.true:
|
||||
; IS__CGSCC____-NEXT: br label [[COND_END:%.*]]
|
||||
; IS__CGSCC____: cond.false:
|
||||
; IS__CGSCC____-NEXT: [[CALL14:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]])
|
||||
; IS__CGSCC____-NEXT: [[CALL14:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]]) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: br label [[COND_END]]
|
||||
; IS__CGSCC____: cond.end:
|
||||
; IS__CGSCC____-NEXT: [[COND:%.*]] = phi i32 [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]
|
||||
@ -695,7 +695,7 @@ define i32* @calls_unknown_fn(i32* %r) #0 {
|
||||
; IS__CGSCC____: Function Attrs: noinline nounwind uwtable
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@calls_unknown_fn
|
||||
; IS__CGSCC____-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[R:%.*]]) [[ATTR3:#.*]] {
|
||||
; IS__CGSCC____-NEXT: tail call void @unknown_fn(i32* (i32*)* noundef nonnull @calls_unknown_fn) [[ATTR8:#.*]]
|
||||
; IS__CGSCC____-NEXT: tail call void @unknown_fn(i32* (i32*)* noundef nonnull @calls_unknown_fn) [[ATTR9:#.*]]
|
||||
; IS__CGSCC____-NEXT: ret i32* [[R]]
|
||||
;
|
||||
tail call void @unknown_fn(i32* (i32*)* nonnull @calls_unknown_fn)
|
||||
@ -739,7 +739,7 @@ define i32* @calls_maybe_redefined_fn(i32* %r) #0 {
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@calls_maybe_redefined_fn
|
||||
; IS__CGSCC____-SAME: (i32* returned [[R:%.*]]) [[ATTR3]] {
|
||||
; IS__CGSCC____-NEXT: entry:
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @maybe_redefined_fn(i32* [[R]]) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @maybe_redefined_fn(i32* [[R]]) [[ATTR9]]
|
||||
; IS__CGSCC____-NEXT: ret i32* [[R]]
|
||||
;
|
||||
entry:
|
||||
@ -782,7 +782,7 @@ define i32* @calls_maybe_redefined_fn2(i32* %r) #0 {
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@calls_maybe_redefined_fn2
|
||||
; IS__CGSCC____-SAME: (i32* [[R:%.*]]) [[ATTR3]] {
|
||||
; IS__CGSCC____-NEXT: entry:
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @maybe_redefined_fn2(i32* [[R]]) [[ATTR8]]
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32* @maybe_redefined_fn2(i32* [[R]]) [[ATTR9]]
|
||||
; IS__CGSCC____-NEXT: ret i32* [[CALL]]
|
||||
;
|
||||
entry:
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=17 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=20 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=22 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor -enable-new-pm=0 -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=18 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=20 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM
|
||||
; RUN: opt -attributor-cgscc -enable-new-pm=0 -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM
|
||||
; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM
|
||||
|
||||
@ -1784,35 +1784,65 @@ define void @non_loop_cycle(i32 %n) {
|
||||
; IS__TUNIT_NPM: exit:
|
||||
; IS__TUNIT_NPM-NEXT: ret void
|
||||
;
|
||||
; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone
|
||||
; IS__CGSCC____-LABEL: define {{[^@]+}}@non_loop_cycle
|
||||
; IS__CGSCC____-SAME: (i32 [[N:%.*]]) [[ATTR19]] {
|
||||
; IS__CGSCC____-NEXT: entry:
|
||||
; IS__CGSCC____-NEXT: [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC____-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 5
|
||||
; IS__CGSCC____-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
||||
; IS__CGSCC____: if.then:
|
||||
; IS__CGSCC____-NEXT: br label [[ENTRY1:%.*]]
|
||||
; IS__CGSCC____: if.else:
|
||||
; IS__CGSCC____-NEXT: br label [[ENTRY2:%.*]]
|
||||
; IS__CGSCC____: entry1:
|
||||
; IS__CGSCC____-NEXT: [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC____-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[CALL1]], 5
|
||||
; IS__CGSCC____-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_ELSE4:%.*]]
|
||||
; IS__CGSCC____: if.then3:
|
||||
; IS__CGSCC____-NEXT: br label [[EXIT:%.*]]
|
||||
; IS__CGSCC____: if.else4:
|
||||
; IS__CGSCC____-NEXT: br label [[ENTRY2]]
|
||||
; IS__CGSCC____: entry2:
|
||||
; IS__CGSCC____-NEXT: [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC____-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[CALL5]], 5
|
||||
; IS__CGSCC____-NEXT: br i1 [[CMP6]], label [[IF_THEN7:%.*]], label [[IF_ELSE8:%.*]]
|
||||
; IS__CGSCC____: if.then7:
|
||||
; IS__CGSCC____-NEXT: br label [[EXIT]]
|
||||
; IS__CGSCC____: if.else8:
|
||||
; IS__CGSCC____-NEXT: br label [[ENTRY1]]
|
||||
; IS__CGSCC____: exit:
|
||||
; IS__CGSCC____-NEXT: ret void
|
||||
; IS__CGSCC_OPM: Function Attrs: nofree norecurse nosync nounwind readnone
|
||||
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@non_loop_cycle
|
||||
; IS__CGSCC_OPM-SAME: (i32 [[N:%.*]]) [[ATTR18]] {
|
||||
; IS__CGSCC_OPM-NEXT: entry:
|
||||
; IS__CGSCC_OPM-NEXT: [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]]) [[ATTR23:#.*]]
|
||||
; IS__CGSCC_OPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 5
|
||||
; IS__CGSCC_OPM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
||||
; IS__CGSCC_OPM: if.then:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[ENTRY1:%.*]]
|
||||
; IS__CGSCC_OPM: if.else:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[ENTRY2:%.*]]
|
||||
; IS__CGSCC_OPM: entry1:
|
||||
; IS__CGSCC_OPM-NEXT: [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]]) [[ATTR23]]
|
||||
; IS__CGSCC_OPM-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[CALL1]], 5
|
||||
; IS__CGSCC_OPM-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_ELSE4:%.*]]
|
||||
; IS__CGSCC_OPM: if.then3:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[EXIT:%.*]]
|
||||
; IS__CGSCC_OPM: if.else4:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[ENTRY2]]
|
||||
; IS__CGSCC_OPM: entry2:
|
||||
; IS__CGSCC_OPM-NEXT: [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]]) [[ATTR23]]
|
||||
; IS__CGSCC_OPM-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[CALL5]], 5
|
||||
; IS__CGSCC_OPM-NEXT: br i1 [[CMP6]], label [[IF_THEN7:%.*]], label [[IF_ELSE8:%.*]]
|
||||
; IS__CGSCC_OPM: if.then7:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[EXIT]]
|
||||
; IS__CGSCC_OPM: if.else8:
|
||||
; IS__CGSCC_OPM-NEXT: br label [[ENTRY1]]
|
||||
; IS__CGSCC_OPM: exit:
|
||||
; IS__CGSCC_OPM-NEXT: ret void
|
||||
;
|
||||
; IS__CGSCC_NPM: Function Attrs: nofree norecurse nosync nounwind readnone
|
||||
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@non_loop_cycle
|
||||
; IS__CGSCC_NPM-SAME: (i32 [[N:%.*]]) [[ATTR19:#.*]] {
|
||||
; IS__CGSCC_NPM-NEXT: entry:
|
||||
; IS__CGSCC_NPM-NEXT: [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC_NPM-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 5
|
||||
; IS__CGSCC_NPM-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
|
||||
; IS__CGSCC_NPM: if.then:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[ENTRY1:%.*]]
|
||||
; IS__CGSCC_NPM: if.else:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[ENTRY2:%.*]]
|
||||
; IS__CGSCC_NPM: entry1:
|
||||
; IS__CGSCC_NPM-NEXT: [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC_NPM-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[CALL1]], 5
|
||||
; IS__CGSCC_NPM-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_ELSE4:%.*]]
|
||||
; IS__CGSCC_NPM: if.then3:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[EXIT:%.*]]
|
||||
; IS__CGSCC_NPM: if.else4:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[ENTRY2]]
|
||||
; IS__CGSCC_NPM: entry2:
|
||||
; IS__CGSCC_NPM-NEXT: [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]])
|
||||
; IS__CGSCC_NPM-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[CALL5]], 5
|
||||
; IS__CGSCC_NPM-NEXT: br i1 [[CMP6]], label [[IF_THEN7:%.*]], label [[IF_ELSE8:%.*]]
|
||||
; IS__CGSCC_NPM: if.then7:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[EXIT]]
|
||||
; IS__CGSCC_NPM: if.else8:
|
||||
; IS__CGSCC_NPM-NEXT: br label [[ENTRY1]]
|
||||
; IS__CGSCC_NPM: exit:
|
||||
; IS__CGSCC_NPM-NEXT: ret void
|
||||
;
|
||||
entry:
|
||||
%call = call i32 @fact_loop(i32 %n)
|
||||
|
Loading…
Reference in New Issue
Block a user