[llvm] 732bdb6 - [Attributor] Avoid the type check in getCalledFunction
Johannes Doerfert via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 23 20:10:30 PDT 2023
Author: Johannes Doerfert
Date: 2023-06-23T20:10:12-07:00
New Revision: 732bdb607341854de8185bd71cec00e8cb04bad2
URL: https://github.com/llvm/llvm-project/commit/732bdb607341854de8185bd71cec00e8cb04bad2
DIFF: https://github.com/llvm/llvm-project/commit/732bdb607341854de8185bd71cec00e8cb04bad2.diff
LOG: [Attributor] Avoid the type check in getCalledFunction
We now consistently use `CallBase::getCalledOperand` rather than
`getCalledFunction`, as we do not want the type checked performed by the
latter. This exposed various missing checks to handle mismatches
properly, but it is good to have them explicit now.
In a follow up we might want to flag certain calls as UB, but for now,
we allow everything to cut down on unexpected differences.
Added:
Modified:
llvm/include/llvm/Transforms/IPO/Attributor.h
llvm/lib/Transforms/IPO/Attributor.cpp
llvm/lib/Transforms/IPO/AttributorAttributes.cpp
llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll
llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll
llvm/test/Transforms/Attributor/liveness.ll
llvm/test/Transforms/Attributor/misc_crash.ll
llvm/test/Transforms/Attributor/noalias.ll
llvm/test/Transforms/OpenMP/custom_state_machines.ll
llvm/test/Transforms/OpenMP/custom_state_machines_pre_lto.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h
index babafdf8fa465..49fa9f8ad98b5 100644
--- a/llvm/include/llvm/Transforms/IPO/Attributor.h
+++ b/llvm/include/llvm/Transforms/IPO/Attributor.h
@@ -708,7 +708,8 @@ struct IRPosition {
// function.
if (Argument *Arg = getAssociatedArgument())
return Arg->getParent();
- return CB->getCalledFunction();
+ return dyn_cast_if_present<Function>(
+ CB->getCalledOperand()->stripPointerCasts());
}
return getAnchorScope();
}
@@ -1257,7 +1258,8 @@ struct InformationCache {
for (Instruction &I : instructions(*F))
if (auto *CB = dyn_cast<CallBase>(&I))
- if (Function *Callee = CB->getCalledFunction())
+ if (auto *Callee =
+ dyn_cast_if_present<Function>(CB->getCalledOperand()))
if (Seen.insert(Callee).second)
Worklist.push_back(Callee);
}
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 1c0108dd22712..24efb377b062f 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -980,7 +980,7 @@ Argument *IRPosition::getAssociatedArgument() const {
// If no callbacks were found, or none used the underlying call site operand
// exclusively, use the direct callee argument if available.
- const Function *Callee = CB.getCalledFunction();
+ auto *Callee = dyn_cast_if_present<Function>(CB.getCalledOperand());
if (Callee && Callee->arg_size() > unsigned(ArgNo))
return Callee->getArg(ArgNo);
@@ -1090,7 +1090,7 @@ SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
// TODO: We need to look at the operand bundles similar to the redirection
// in CallBase.
if (!CB->hasOperandBundles() || CanIgnoreOperandBundles(*CB))
- if (const Function *Callee = CB->getCalledFunction())
+ if (auto *Callee = dyn_cast_if_present<Function>(CB->getCalledOperand()))
IRPositions.emplace_back(IRPosition::function(*Callee));
return;
case IRPosition::IRP_CALL_SITE_RETURNED:
@@ -1098,7 +1098,8 @@ SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
// TODO: We need to look at the operand bundles similar to the redirection
// in CallBase.
if (!CB->hasOperandBundles() || CanIgnoreOperandBundles(*CB)) {
- if (const Function *Callee = CB->getCalledFunction()) {
+ if (auto *Callee =
+ dyn_cast_if_present<Function>(CB->getCalledOperand())) {
IRPositions.emplace_back(IRPosition::returned(*Callee));
IRPositions.emplace_back(IRPosition::function(*Callee));
for (const Argument &Arg : Callee->args())
@@ -1118,7 +1119,7 @@ SubsumingPositionIterator::SubsumingPositionIterator(const IRPosition &IRP) {
// TODO: We need to look at the operand bundles similar to the redirection
// in CallBase.
if (!CB->hasOperandBundles() || CanIgnoreOperandBundles(*CB)) {
- const Function *Callee = CB->getCalledFunction();
+ auto *Callee = dyn_cast_if_present<Function>(CB->getCalledOperand());
if (Callee) {
if (Argument *Arg = IRP.getAssociatedArgument())
IRPositions.emplace_back(IRPosition::argument(*Arg));
@@ -1375,7 +1376,8 @@ std::optional<Value *> Attributor::translateArgumentToCallSiteContent(
if (*V == nullptr || isa<Constant>(*V))
return V;
if (auto *Arg = dyn_cast<Argument>(*V))
- if (CB.getCalledFunction() == Arg->getParent())
+ if (CB.getCalledOperand() == Arg->getParent() &&
+ CB.arg_size() > Arg->getArgNo())
if (!Arg->hasPointeeInMemoryValueAttr())
return getAssumedSimplified(
IRPosition::callsite_argument(CB, Arg->getArgNo()), AA,
@@ -2314,9 +2316,9 @@ ChangeStatus Attributor::cleanupIR() {
if (CB->isArgOperand(U)) {
unsigned Idx = CB->getArgOperandNo(U);
CB->removeParamAttr(Idx, Attribute::NoUndef);
- Function *Fn = CB->getCalledFunction();
- if (Fn && Fn->arg_size() > Idx)
- Fn->removeParamAttr(Idx, Attribute::NoUndef);
+ auto *Callee = dyn_cast_if_present<Function>(CB->getCalledOperand());
+ if (Callee && Callee->arg_size() > Idx)
+ Callee->removeParamAttr(Idx, Attribute::NoUndef);
}
}
if (isa<Constant>(NewV) && isa<BranchInst>(U->getUser())) {
@@ -2715,7 +2717,10 @@ bool Attributor::isValidFunctionSignatureRewrite(
ACS.getInstruction()->getType() !=
ACS.getCalledFunction()->getReturnType())
return false;
- if (ACS.getCalledOperand()->getType() != Fn->getType())
+ if (cast<CallBase>(ACS.getInstruction())->getCalledOperand()->getType() !=
+ Fn->getType())
+ return false;
+ if (ACS.getNumArgOperands() != Fn->arg_size())
return false;
// Forbid must-tail calls for now.
return !ACS.isCallbackCall() && !ACS.getInstruction()->isMustTailCall();
@@ -2741,7 +2746,8 @@ bool Attributor::isValidFunctionSignatureRewrite(
// Avoid callbacks for now.
bool UsedAssumedInformation = false;
if (!checkForAllCallSites(CallSiteCanBeChanged, *Fn, true, nullptr,
- UsedAssumedInformation)) {
+ UsedAssumedInformation,
+ /* CheckPotentiallyDead */ true)) {
LLVM_DEBUG(dbgs() << "[Attributor] Cannot rewrite all call sites\n");
return false;
}
@@ -3084,7 +3090,8 @@ void InformationCache::initializeInformationCache(const Function &CF,
AddToAssumeUsesMap(*Assume->getArgOperand(0));
} else if (cast<CallInst>(I).isMustTailCall()) {
FI.ContainsMustTailCall = true;
- if (const Function *Callee = cast<CallInst>(I).getCalledFunction())
+ if (auto *Callee = dyn_cast_if_present<Function>(
+ cast<CallInst>(I).getCalledOperand()))
getFunctionInfo(*Callee).CalledViaMustTail = true;
}
[[fallthrough]];
@@ -3314,7 +3321,7 @@ void Attributor::identifyDefaultAbstractAttributes(Function &F) {
// users. The return value might be dead if there are no live users.
getOrCreateAAFor<AAIsDead>(CBInstPos);
- Function *Callee = CB.getCalledFunction();
+ Function *Callee = dyn_cast_if_present<Function>(CB.getCalledOperand());
// TODO: Even if the callee is not known now we might be able to simplify
// the call/callee.
if (!Callee)
diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
index 099dc1a3df6c9..1b3039fc2256b 100644
--- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
+++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp
@@ -2095,12 +2095,10 @@ class AAReturnedValuesImpl : public AAReturnedValues, public AbstractState {
ReturnedValues.clear();
Function *F = getAssociatedFunction();
- if (!F || F->isDeclaration()) {
+ if (!F || F->isDeclaration() || F->getReturnType()->isVoidTy()) {
indicatePessimisticFixpoint();
return;
}
- assert(!F->getReturnType()->isVoidTy() &&
- "Did not expect a void return type!");
// The map from instruction opcodes to those instructions in the function.
auto &OpcodeInstMap = A.getInfoCache().getOpcodeInstMapForFunction(*F);
@@ -3068,7 +3066,7 @@ struct AANonConvergentFunction final : AANonConvergentImpl {
// If all function calls are known to not be convergent, we are not convergent.
auto CalleeIsNotConvergent = [&](Instruction &Inst) {
CallBase &CB = cast<CallBase>(Inst);
- Function *Callee = CB.getCalledFunction();
+ auto *Callee = dyn_cast_if_present<Function>(CB.getCalledOperand());
if (!Callee || Callee->isIntrinsic()) {
return false;
}
@@ -3195,7 +3193,7 @@ struct AAUndefinedBehaviorImpl : public AAUndefinedBehavior {
// Check nonnull and noundef argument attribute violation for each
// callsite.
CallBase &CB = cast<CallBase>(I);
- Function *Callee = CB.getCalledFunction();
+ auto *Callee = dyn_cast_if_present<Function>(CB.getCalledOperand());
if (!Callee)
return true;
for (unsigned idx = 0; idx < CB.arg_size(); idx++) {
@@ -4855,7 +4853,7 @@ struct AAIsDeadFunction : public AAIsDead {
// functions. It can however cause dead functions to be treated as live.
for (const Instruction &I : BB)
if (const auto *CB = dyn_cast<CallBase>(&I))
- if (const Function *F = CB->getCalledFunction())
+ if (auto *F = dyn_cast_if_present<Function>(CB->getCalledOperand()))
if (F->hasLocalLinkage())
A.markLiveInternalFunction(*F);
return true;
@@ -5819,8 +5817,8 @@ struct AAInstanceInfoImpl : public AAInstanceInfo {
if (auto *CB = dyn_cast<CallBase>(UserI)) {
// This check is not guaranteeing uniqueness but for now that we cannot
// end up with two versions of \p U thinking it was one.
- if (!CB->getCalledFunction() ||
- !CB->getCalledFunction()->hasLocalLinkage())
+ auto *Callee = dyn_cast_if_present<Function>(CB->getCalledOperand());
+ if (!Callee || !Callee->hasLocalLinkage())
return true;
if (!CB->isArgOperand(&U))
return false;
@@ -6577,7 +6575,7 @@ struct AAValueSimplifyArgument final : AAValueSimplifyImpl {
bool Success;
bool UsedAssumedInformation = false;
if (hasCallBaseContext() &&
- getCallBaseContext()->getCalledFunction() == Arg->getParent())
+ getCallBaseContext()->getCalledOperand() == Arg->getParent())
Success = PredForCallSite(
AbstractCallSite(&getCallBaseContext()->getCalledOperandUse()));
else
@@ -7538,7 +7536,9 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
auto CallSiteCheck = [&](AbstractCallSite ACS) {
CallBase *CB = ACS.getInstruction();
return TTI->areTypesABICompatible(
- CB->getCaller(), CB->getCalledFunction(), ReplacementTypes);
+ CB->getCaller(),
+ dyn_cast_if_present<Function>(CB->getCalledOperand()),
+ ReplacementTypes);
};
bool UsedAssumedInformation = false;
if (!A.checkForAllCallSites(CallSiteCheck, *this, true,
@@ -7620,17 +7620,17 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
assert(DCArgNo >= 0 && unsigned(DCArgNo) < DC->arg_size() &&
"Expected a direct call operand for callback call operand");
+ Function *DCCallee =
+ dyn_cast_if_present<Function>(DC->getCalledOperand());
LLVM_DEBUG({
dbgs() << "[AAPrivatizablePtr] Argument " << *Arg
<< " check if be privatized in the context of its parent ("
<< Arg->getParent()->getName()
<< ")\n[AAPrivatizablePtr] because it is an argument in a "
"direct call of ("
- << DCArgNo << "@" << DC->getCalledFunction()->getName()
- << ").\n";
+ << DCArgNo << "@" << DCCallee->getName() << ").\n";
});
- Function *DCCallee = DC->getCalledFunction();
if (unsigned(DCArgNo) < DCCallee->arg_size()) {
const auto *DCArgPrivAA = A.getAAFor<AAPrivatizablePtr>(
*this, IRPosition::argument(*DCCallee->getArg(DCArgNo)),
@@ -7650,7 +7650,7 @@ struct AAPrivatizablePtrArgument final : public AAPrivatizablePtrImpl {
<< Arg->getParent()->getName()
<< ")\n[AAPrivatizablePtr] because it is an argument in a "
"direct call of ("
- << ACS.getInstruction()->getCalledFunction()->getName()
+ << ACS.getInstruction()->getCalledOperand()->getName()
<< ").\n[AAPrivatizablePtr] for which the argument "
"privatization is not compatible.\n";
});
@@ -11481,14 +11481,15 @@ struct AAPotentialValuesFloating : AAPotentialValuesImpl {
if (V->getType()->isPointerTy()) {
NewV = AA::getWithType(*V->stripPointerCasts(), *V->getType());
} else {
- auto *CB = dyn_cast<CallBase>(V);
- if (CB && CB->getCalledFunction()) {
- for (Argument &Arg : CB->getCalledFunction()->args())
- if (Arg.hasReturnedAttr()) {
- NewV = CB->getArgOperand(Arg.getArgNo());
- break;
- }
- }
+ if (auto *CB = dyn_cast<CallBase>(V))
+ if (auto *Callee =
+ dyn_cast_if_present<Function>(CB->getCalledOperand())) {
+ for (Argument &Arg : Callee->args())
+ if (Arg.hasReturnedAttr()) {
+ NewV = CB->getArgOperand(Arg.getArgNo());
+ break;
+ }
+ }
}
if (NewV && NewV != V) {
Worklist.push_back({{*NewV, CtxI}, S});
@@ -11706,7 +11707,7 @@ struct AAPotentialValuesCallSiteReturned : AAPotentialValuesImpl {
SmallVector<AA::ValueAndContext> ArgValues;
IRPosition IRP = IRPosition::value(*V);
if (auto *Arg = dyn_cast<Argument>(V))
- if (Arg->getParent() == CB->getCalledFunction())
+ if (Arg->getParent() == CB->getCalledOperand())
IRP = IRPosition::callsite_argument(*CB, Arg->getArgNo());
if (recurseForValue(A, IRP, AA::AnyScope))
continue;
diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll
index 13337931b1f28..9913827babf71 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll
@@ -34,16 +34,15 @@
; FIXME we should recognize this as UB and make it an unreachable.
define dso_local i16 @foo(i16 %a) {
-; TUNIT: Function Attrs: norecurse
+; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; TUNIT-LABEL: define {{[^@]+}}@foo
; TUNIT-SAME: (i16 [[A:%.*]]) #[[ATTR0:[0-9]+]] {
-; TUNIT-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]])
-; TUNIT-NEXT: ret i16 [[CALL]]
+; TUNIT-NEXT: ret i16 0
;
-; CGSCC: Function Attrs: nosync nounwind
+; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn
; CGSCC-LABEL: define {{[^@]+}}@foo
; CGSCC-SAME: (i16 [[A:%.*]]) #[[ATTR0:[0-9]+]] {
-; CGSCC-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]])
+; CGSCC-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar to i16 (i16)*)(i16 [[A]]) #[[ATTR2:[0-9]+]]
; CGSCC-NEXT: ret i16 [[CALL]]
;
%call = call i16 bitcast (i16 (i16, i16) * @bar to i16 (i16) *)(i16 %a)
@@ -51,25 +50,25 @@ define dso_local i16 @foo(i16 %a) {
}
define internal i16 @bar(i16 %p1, i16 %p2) {
-; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
-; CHECK-LABEL: define {{[^@]+}}@bar
-; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR1:[0-9]+]] {
-; CHECK-NEXT: ret i16 0
+; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
+; CGSCC-LABEL: define {{[^@]+}}@bar
+; CGSCC-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR1:[0-9]+]] {
+; CGSCC-NEXT: ret i16 0
;
ret i16 0
}
define dso_local i16 @foo2(i16 %a) {
-; TUNIT: Function Attrs: norecurse
+; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; TUNIT-LABEL: define {{[^@]+}}@foo2
; TUNIT-SAME: (i16 [[A:%.*]]) #[[ATTR0]] {
-; TUNIT-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar2 to i16 (i16)*)(i16 [[A]])
+; TUNIT-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar2 to i16 (i16)*)(i16 [[A]]) #[[ATTR1:[0-9]+]]
; TUNIT-NEXT: ret i16 [[CALL]]
;
-; CGSCC: Function Attrs: nosync nounwind
+; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn
; CGSCC-LABEL: define {{[^@]+}}@foo2
; CGSCC-SAME: (i16 [[A:%.*]]) #[[ATTR0]] {
-; CGSCC-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar2 to i16 (i16)*)(i16 [[A]])
+; CGSCC-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16, i16)* @bar2 to i16 (i16)*)(i16 [[A]]) #[[ATTR2]]
; CGSCC-NEXT: ret i16 [[CALL]]
;
%call = call i16 bitcast (i16 (i16, i16) * @bar2 to i16 (i16) *)(i16 %a)
@@ -77,11 +76,17 @@ define dso_local i16 @foo2(i16 %a) {
}
define internal i16 @bar2(i16 %p1, i16 %p2) {
-; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
-; CHECK-LABEL: define {{[^@]+}}@bar2
-; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR1]] {
-; CHECK-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
-; CHECK-NEXT: ret i16 [[A]]
+; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
+; TUNIT-LABEL: define {{[^@]+}}@bar2
+; TUNIT-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR0]] {
+; TUNIT-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
+; TUNIT-NEXT: ret i16 [[A]]
+;
+; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
+; CGSCC-LABEL: define {{[^@]+}}@bar2
+; CGSCC-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) #[[ATTR1]] {
+; CGSCC-NEXT: [[A:%.*]] = add i16 [[P1]], [[P2]]
+; CGSCC-NEXT: ret i16 [[A]]
;
%a = add i16 %p1, %p2
ret i16 %a
@@ -94,18 +99,16 @@ define internal i16 @bar2(i16 %p1, i16 %p2) {
; been provided),
define dso_local i16 @vararg_tests(i16 %a) {
-; TUNIT: Function Attrs: norecurse
+; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; TUNIT-LABEL: define {{[^@]+}}@vararg_tests
; TUNIT-SAME: (i16 [[A:%.*]]) #[[ATTR0]] {
-; TUNIT-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 noundef 7)
-; TUNIT-NEXT: [[ADD:%.*]] = add i16 7, [[CALL2]]
-; TUNIT-NEXT: ret i16 [[ADD]]
+; TUNIT-NEXT: ret i16 14
;
-; CGSCC: Function Attrs: nosync nounwind
+; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn
; CGSCC-LABEL: define {{[^@]+}}@vararg_tests
; CGSCC-SAME: (i16 [[A:%.*]]) #[[ATTR0]] {
; CGSCC-NEXT: [[CALL1:%.*]] = call i16 (i16, ...) @vararg_prop(i16 noundef 7, i16 noundef 8, i16 [[A]])
-; CGSCC-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)
+; CGSCC-NEXT: [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7) #[[ATTR2]]
; CGSCC-NEXT: [[ADD:%.*]] = add i16 [[CALL1]], [[CALL2]]
; CGSCC-NEXT: ret i16 [[ADD]]
;
@@ -125,18 +128,21 @@ define internal i16 @vararg_prop(i16 %p1, ...) {
}
define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) {
-; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
-; CHECK-LABEL: define {{[^@]+}}@vararg_no_prop
-; CHECK-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR1]] {
-; CHECK-NEXT: ret i16 7
+; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
+; CGSCC-LABEL: define {{[^@]+}}@vararg_no_prop
+; CGSCC-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]], ...) #[[ATTR1]] {
+; CGSCC-NEXT: ret i16 7
;
ret i16 %p1
}
;.
-; TUNIT: attributes #[[ATTR0]] = { norecurse }
-; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
+; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
+; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) }
;.
-; CGSCC: attributes #[[ATTR0]] = { nosync nounwind }
+; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn }
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
+; CGSCC: attributes #[[ATTR2]] = { nofree nounwind willreturn }
;.
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll
index 57df274b67d8c..5babc2f531f51 100644
--- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll
@@ -6,16 +6,15 @@
; argument type between the caller and callee.
define dso_local i16 @foo(i16 %a) {
-; TUNIT: Function Attrs: norecurse
+; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; TUNIT-LABEL: define {{[^@]+}}@foo
; TUNIT-SAME: (i16 [[A:%.*]]) #[[ATTR0:[0-9]+]] {
-; TUNIT-NEXT: [[CALL:%.*]] = call i16 @bar(i16 [[A]], i32 7)
-; TUNIT-NEXT: ret i16 [[CALL]]
+; TUNIT-NEXT: ret i16 7
;
-; CGSCC: Function Attrs: nosync nounwind memory(none)
+; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
; CGSCC-LABEL: define {{[^@]+}}@foo
; CGSCC-SAME: (i16 [[A:%.*]]) #[[ATTR0:[0-9]+]] {
-; CGSCC-NEXT: [[CALL:%.*]] = call i16 @bar(i16 [[A]], i32 7)
+; CGSCC-NEXT: [[CALL:%.*]] = call i16 @bar(i16 [[A]], i32 noundef 7)
; CGSCC-NEXT: ret i16 [[CALL]]
;
%call = call i16 @bar(i16 %a, i32 7)
@@ -23,10 +22,6 @@ define dso_local i16 @foo(i16 %a) {
}
define internal i16 @bar(i16 %p1, i16 %p2) {
-; TUNIT-LABEL: define {{[^@]+}}@bar
-; TUNIT-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) {
-; TUNIT-NEXT: ret i16 [[P2]]
-;
; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; CGSCC-LABEL: define {{[^@]+}}@bar
; CGSCC-SAME: (i16 [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR1:[0-9]+]] {
@@ -37,9 +32,9 @@ define internal i16 @bar(i16 %p1, i16 %p2) {
;.
-; TUNIT: attributes #[[ATTR0]] = { norecurse }
+; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
;.
-; CGSCC: attributes #[[ATTR0]] = { nosync nounwind memory(none) }
+; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) }
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
;.
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
diff --git a/llvm/test/Transforms/Attributor/liveness.ll b/llvm/test/Transforms/Attributor/liveness.ll
index 9e1ea70357e27..086569d320f36 100644
--- a/llvm/test/Transforms/Attributor/liveness.ll
+++ b/llvm/test/Transforms/Attributor/liveness.ll
@@ -2427,33 +2427,60 @@ indirectgoto: ; preds = %lab0, %entry
@e = global %struct.a* null
define i32 @main() {
-; CHECK-LABEL: define {{[^@]+}}@main() {
-; CHECK-NEXT: entry:
-; CHECK-NEXT: [[F:%.*]] = alloca i32, align 4
-; CHECK-NEXT: br label [[FOR_COND_0:%.*]]
-; CHECK: for.cond.0:
-; CHECK-NEXT: [[G_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY_0:%.*]] ]
-; CHECK-NEXT: [[CMP_0:%.*]] = icmp ult i32 [[G_0]], 100
-; CHECK-NEXT: br i1 [[CMP_0]], label [[FOR_BODY_0]], label [[FOR_END_0:%.*]]
-; CHECK: for.body.0:
-; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[G_0]], 1
-; CHECK-NEXT: br label [[FOR_COND_0]]
-; CHECK: for.end.0:
-; CHECK-NEXT: [[CALL:%.*]] = call i8* @malloc(i64 noundef 8)
-; CHECK-NEXT: store i8* [[CALL]], i8** bitcast (%struct.a** @e to i8**), align 8
-; CHECK-NEXT: [[B:%.*]] = bitcast i8* [[CALL]] to %struct.a**
-; CHECK-NEXT: store %struct.a* null, %struct.a** [[B]], align 8
-; CHECK-NEXT: br label [[FOR_COND_1:%.*]]
-; CHECK: for.cond.1:
-; CHECK-NEXT: [[G_1:%.*]] = phi i32 [ 0, [[FOR_END_0]] ], [ [[INC6:%.*]], [[FOR_BODY_1:%.*]] ]
-; CHECK-NEXT: [[CMP_1:%.*]] = icmp ult i32 [[G_1]], 100
-; CHECK-NEXT: br i1 [[CMP_1]], label [[FOR_BODY_1]], label [[FOR_END_1:%.*]]
-; CHECK: for.body.1:
-; CHECK-NEXT: [[CALL4:%.*]] = call i32 (i32*, ...) bitcast (i32 (i32)* @h to i32 (i32*, ...)*)(i32* nonnull [[F]])
-; CHECK-NEXT: [[INC6]] = add nuw nsw i32 [[G_1]], 1
-; CHECK-NEXT: br label [[FOR_COND_1]]
-; CHECK: for.end.1:
-; CHECK-NEXT: ret i32 0
+; TUNIT-LABEL: define {{[^@]+}}@main() {
+; TUNIT-NEXT: entry:
+; TUNIT-NEXT: [[F:%.*]] = alloca i32, align 4
+; TUNIT-NEXT: br label [[FOR_COND_0:%.*]]
+; TUNIT: for.cond.0:
+; TUNIT-NEXT: [[G_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY_0:%.*]] ]
+; TUNIT-NEXT: [[CMP_0:%.*]] = icmp ult i32 [[G_0]], 100
+; TUNIT-NEXT: br i1 [[CMP_0]], label [[FOR_BODY_0]], label [[FOR_END_0:%.*]]
+; TUNIT: for.body.0:
+; TUNIT-NEXT: [[INC]] = add nuw nsw i32 [[G_0]], 1
+; TUNIT-NEXT: br label [[FOR_COND_0]]
+; TUNIT: for.end.0:
+; TUNIT-NEXT: [[CALL:%.*]] = call i8* @malloc(i64 noundef 8)
+; TUNIT-NEXT: store i8* [[CALL]], i8** bitcast (%struct.a** @e to i8**), align 8
+; TUNIT-NEXT: [[B:%.*]] = bitcast i8* [[CALL]] to %struct.a**
+; TUNIT-NEXT: store %struct.a* null, %struct.a** [[B]], align 8
+; TUNIT-NEXT: br label [[FOR_COND_1:%.*]]
+; TUNIT: for.cond.1:
+; TUNIT-NEXT: [[G_1:%.*]] = phi i32 [ 0, [[FOR_END_0]] ], [ [[INC6:%.*]], [[FOR_BODY_1:%.*]] ]
+; TUNIT-NEXT: [[CMP_1:%.*]] = icmp ult i32 [[G_1]], 100
+; TUNIT-NEXT: br i1 [[CMP_1]], label [[FOR_BODY_1]], label [[FOR_END_1:%.*]]
+; TUNIT: for.body.1:
+; TUNIT-NEXT: [[INC6]] = add nuw nsw i32 [[G_1]], 1
+; TUNIT-NEXT: br label [[FOR_COND_1]]
+; TUNIT: for.end.1:
+; TUNIT-NEXT: ret i32 0
+;
+; CGSCC-LABEL: define {{[^@]+}}@main() {
+; CGSCC-NEXT: entry:
+; CGSCC-NEXT: [[F:%.*]] = alloca i32, align 4
+; CGSCC-NEXT: br label [[FOR_COND_0:%.*]]
+; CGSCC: for.cond.0:
+; CGSCC-NEXT: [[G_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY_0:%.*]] ]
+; CGSCC-NEXT: [[CMP_0:%.*]] = icmp ult i32 [[G_0]], 100
+; CGSCC-NEXT: br i1 [[CMP_0]], label [[FOR_BODY_0]], label [[FOR_END_0:%.*]]
+; CGSCC: for.body.0:
+; CGSCC-NEXT: [[INC]] = add nuw nsw i32 [[G_0]], 1
+; CGSCC-NEXT: br label [[FOR_COND_0]]
+; CGSCC: for.end.0:
+; CGSCC-NEXT: [[CALL:%.*]] = call i8* @malloc(i64 noundef 8)
+; CGSCC-NEXT: store i8* [[CALL]], i8** bitcast (%struct.a** @e to i8**), align 8
+; CGSCC-NEXT: [[B:%.*]] = bitcast i8* [[CALL]] to %struct.a**
+; CGSCC-NEXT: store %struct.a* null, %struct.a** [[B]], align 8
+; CGSCC-NEXT: br label [[FOR_COND_1:%.*]]
+; CGSCC: for.cond.1:
+; CGSCC-NEXT: [[G_1:%.*]] = phi i32 [ 0, [[FOR_END_0]] ], [ [[INC6:%.*]], [[FOR_BODY_1:%.*]] ]
+; CGSCC-NEXT: [[CMP_1:%.*]] = icmp ult i32 [[G_1]], 100
+; CGSCC-NEXT: br i1 [[CMP_1]], label [[FOR_BODY_1]], label [[FOR_END_1:%.*]]
+; CGSCC: for.body.1:
+; CGSCC-NEXT: [[CALL4:%.*]] = call i32 (i32*, ...) bitcast (i32 (i32)* @h to i32 (i32*, ...)*)(i32* nonnull [[F]]) #[[ATTR2]]
+; CGSCC-NEXT: [[INC6]] = add nuw nsw i32 [[G_1]], 1
+; CGSCC-NEXT: br label [[FOR_COND_1]]
+; CGSCC: for.end.1:
+; CGSCC-NEXT: ret i32 0
;
entry:
%f = alloca i32
diff --git a/llvm/test/Transforms/Attributor/misc_crash.ll b/llvm/test/Transforms/Attributor/misc_crash.ll
index ec9d2fbd8806c..f2755e3f7fb38 100644
--- a/llvm/test/Transforms/Attributor/misc_crash.ll
+++ b/llvm/test/Transforms/Attributor/misc_crash.ll
@@ -48,10 +48,10 @@ define internal void @func2a(i32* %0) {
}
define i32 @func2() {
-; CHECK: Function Attrs: norecurse
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
; CHECK-LABEL: define {{[^@]+}}@func2
; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
-; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 (i32*, ...) bitcast (void (i32*)* @func2a to i32 (i32*, ...)*)(i32* nonnull align 4 dereferenceable(4) @var2)
+; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 (i32*, ...) bitcast (void (i32*)* @func2a to i32 (i32*, ...)*)(i32* nonnull align 4 dereferenceable(4) @var2) #[[ATTR3:[0-9]+]]
; CHECK-NEXT: [[TMP2:%.*]] = load i32, i32* @var2, align 4
; CHECK-NEXT: ret i32 [[TMP2]]
;
@@ -61,10 +61,10 @@ define i32 @func2() {
}
define i32 @func3(i1 %false) {
-; CHECK: Function Attrs: norecurse
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
; CHECK-LABEL: define {{[^@]+}}@func3
; CHECK-SAME: (i1 [[FALSE:%.*]]) #[[ATTR2]] {
-; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 (i32*, ...) bitcast (void (i32*)* @func2a to i32 (i32*, ...)*)(i32* nonnull align 4 dereferenceable(4) @var2)
+; CHECK-NEXT: [[TMP1:%.*]] = tail call i32 (i32*, ...) bitcast (void (i32*)* @func2a to i32 (i32*, ...)*)(i32* nonnull align 4 dereferenceable(4) @var2) #[[ATTR3]]
; CHECK-NEXT: br i1 [[FALSE]], label [[USE_BB:%.*]], label [[RET_BB:%.*]]
; CHECK: use_bb:
; CHECK-NEXT: ret i32 [[TMP1]]
@@ -108,10 +108,10 @@ block:
}
define i16 @foo3() {
-; CHECK: Function Attrs: norecurse
+; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
; CHECK-LABEL: define {{[^@]+}}@foo3
-; CHECK-SAME: () #[[ATTR2]] {
-; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16*, i16)* @bar3 to i16 ()*)()
+; CHECK-SAME: () #[[ATTR0]] {
+; CHECK-NEXT: [[CALL:%.*]] = call i16 bitcast (i16 (i16*, i16)* @bar3 to i16 ()*)() #[[ATTR4:[0-9]+]]
; CHECK-NEXT: ret i16 [[CALL]]
;
%call = call i16 bitcast (i16 (i16*, i16) * @bar3 to i16 () *)()
@@ -132,5 +132,7 @@ declare void @func6(i8*)
;.
; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) }
-; CHECK: attributes #[[ATTR2]] = { norecurse }
+; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn }
+; CHECK: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(write) }
+; CHECK: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(none) }
;.
diff --git a/llvm/test/Transforms/Attributor/noalias.ll b/llvm/test/Transforms/Attributor/noalias.ll
index 6a72ed6c5d048..0838a299ca7ad 100644
--- a/llvm/test/Transforms/Attributor/noalias.ll
+++ b/llvm/test/Transforms/Attributor/noalias.ll
@@ -570,7 +570,7 @@ define internal fastcc double @strtox(ptr %s, ptr %p, i32 %prec) unnamed_addr {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[F:%.*]] = alloca [[STRUCT__IO_FILE:%.*]], align 8
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 noundef 144, ptr nocapture nofree noundef nonnull align 8 dereferenceable(240) [[F]]) #[[ATTR11:[0-9]+]]
-; CHECK-NEXT: [[CALL:%.*]] = call i32 @sh_fromstring(ptr nonnull align 8 dereferenceable(240) [[F]], ptr [[S]])
+; CHECK-NEXT: [[CALL:%.*]] = call i32 @sh_fromstring(ptr noundef nonnull align 8 dereferenceable(240) [[F]], ptr [[S]])
; CHECK-NEXT: call void @__shlim(ptr noundef nonnull align 8 dereferenceable(240) [[F]], i64 noundef 0)
; CHECK-NEXT: [[CALL1:%.*]] = call double @__floatscan(ptr noundef nonnull align 8 dereferenceable(240) [[F]], i32 noundef 1, i32 noundef 1)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 noundef 144, ptr nocapture nofree noundef nonnull align 8 dereferenceable(240) [[F]])
diff --git a/llvm/test/Transforms/OpenMP/custom_state_machines.ll b/llvm/test/Transforms/OpenMP/custom_state_machines.ll
index 487d813317328..74cfb9f1febd9 100644
--- a/llvm/test/Transforms/OpenMP/custom_state_machines.ll
+++ b/llvm/test/Transforms/OpenMP/custom_state_machines.ll
@@ -1546,13 +1546,11 @@ attributes #9 = { convergent nounwind readonly willreturn }
; AMDGPU: worker_state_machine.is_active.check:
; AMDGPU-NEXT: br i1 [[WORKER_IS_ACTIVE]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_CHECK:%.*]], label [[WORKER_STATE_MACHINE_DONE_BARRIER:%.*]]
; AMDGPU: worker_state_machine.parallel_region.check:
-; AMDGPU-NEXT: [[WORKER_CHECK_PARALLEL_REGION:%.*]] = icmp eq ptr [[WORKER_WORK_FN_ADDR_CAST]], @__omp_outlined__19_wrapper
-; AMDGPU-NEXT: br i1 [[WORKER_CHECK_PARALLEL_REGION]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_EXECUTE:%.*]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_FALLBACK_EXECUTE:%.*]]
+; AMDGPU-NEXT: br i1 true, label [[WORKER_STATE_MACHINE_PARALLEL_REGION_EXECUTE:%.*]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_CHECK1:%.*]]
; AMDGPU: worker_state_machine.parallel_region.execute:
; AMDGPU-NEXT: call void @__omp_outlined__19_wrapper(i16 0, i32 [[TMP0]])
; AMDGPU-NEXT: br label [[WORKER_STATE_MACHINE_PARALLEL_REGION_END:%.*]]
-; AMDGPU: worker_state_machine.parallel_region.fallback.execute:
-; AMDGPU-NEXT: call void [[WORKER_WORK_FN_ADDR_CAST]](i16 0, i32 [[TMP0]])
+; AMDGPU: worker_state_machine.parallel_region.check1:
; AMDGPU-NEXT: br label [[WORKER_STATE_MACHINE_PARALLEL_REGION_END]]
; AMDGPU: worker_state_machine.parallel_region.end:
; AMDGPU-NEXT: call void @__kmpc_kernel_end_parallel()
@@ -1578,7 +1576,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; AMDGPU-NEXT: entry:
; AMDGPU-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; AMDGPU-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; AMDGPU-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; AMDGPU-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; AMDGPU-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; AMDGPU-NEXT: ret void
;
@@ -2488,13 +2486,11 @@ attributes #9 = { convergent nounwind readonly willreturn }
; NVPTX: worker_state_machine.is_active.check:
; NVPTX-NEXT: br i1 [[WORKER_IS_ACTIVE]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_CHECK:%.*]], label [[WORKER_STATE_MACHINE_DONE_BARRIER:%.*]]
; NVPTX: worker_state_machine.parallel_region.check:
-; NVPTX-NEXT: [[WORKER_CHECK_PARALLEL_REGION:%.*]] = icmp eq ptr [[WORKER_WORK_FN_ADDR_CAST]], @__omp_outlined__19_wrapper
-; NVPTX-NEXT: br i1 [[WORKER_CHECK_PARALLEL_REGION]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_EXECUTE:%.*]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_FALLBACK_EXECUTE:%.*]]
+; NVPTX-NEXT: br i1 true, label [[WORKER_STATE_MACHINE_PARALLEL_REGION_EXECUTE:%.*]], label [[WORKER_STATE_MACHINE_PARALLEL_REGION_CHECK1:%.*]]
; NVPTX: worker_state_machine.parallel_region.execute:
; NVPTX-NEXT: call void @__omp_outlined__19_wrapper(i16 0, i32 [[TMP0]])
; NVPTX-NEXT: br label [[WORKER_STATE_MACHINE_PARALLEL_REGION_END:%.*]]
-; NVPTX: worker_state_machine.parallel_region.fallback.execute:
-; NVPTX-NEXT: call void [[WORKER_WORK_FN_ADDR_CAST]](i16 0, i32 [[TMP0]])
+; NVPTX: worker_state_machine.parallel_region.check1:
; NVPTX-NEXT: br label [[WORKER_STATE_MACHINE_PARALLEL_REGION_END]]
; NVPTX: worker_state_machine.parallel_region.end:
; NVPTX-NEXT: call void @__kmpc_kernel_end_parallel()
@@ -2520,7 +2516,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; NVPTX-NEXT: entry:
; NVPTX-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; NVPTX-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; NVPTX-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; NVPTX-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; NVPTX-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; NVPTX-NEXT: ret void
;
@@ -3217,7 +3213,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; AMDGPU-DISABLED-NEXT: entry:
; AMDGPU-DISABLED-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; AMDGPU-DISABLED-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; AMDGPU-DISABLED-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; AMDGPU-DISABLED-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; AMDGPU-DISABLED-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; AMDGPU-DISABLED-NEXT: ret void
;
@@ -3884,7 +3880,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; NVPTX-DISABLED-NEXT: entry:
; NVPTX-DISABLED-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; NVPTX-DISABLED-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; NVPTX-DISABLED-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; NVPTX-DISABLED-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; NVPTX-DISABLED-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; NVPTX-DISABLED-NEXT: ret void
;
diff --git a/llvm/test/Transforms/OpenMP/custom_state_machines_pre_lto.ll b/llvm/test/Transforms/OpenMP/custom_state_machines_pre_lto.ll
index 44ba276ee1170..d5f4ee1f357a8 100644
--- a/llvm/test/Transforms/OpenMP/custom_state_machines_pre_lto.ll
+++ b/llvm/test/Transforms/OpenMP/custom_state_machines_pre_lto.ll
@@ -1323,7 +1323,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; AMDGPU-NEXT: entry:
; AMDGPU-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; AMDGPU-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; AMDGPU-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; AMDGPU-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; AMDGPU-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; AMDGPU-NEXT: ret void
;
@@ -1985,7 +1985,7 @@ attributes #9 = { convergent nounwind readonly willreturn }
; NVPTX-NEXT: entry:
; NVPTX-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
; NVPTX-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-; NVPTX-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR12]]
+; NVPTX-NEXT: [[CALL:%.*]] = call i32 @omp_get_thread_num() #[[ATTR10]]
; NVPTX-NEXT: call void @simple_state_machine_interprocedural_nested_recursive_after.internalized(i32 [[CALL]]) #[[ATTR10]]
; NVPTX-NEXT: ret void
;
More information about the llvm-commits
mailing list