diff --git a/llvm/include/llvm/Transforms/IPO/Attributor.h b/llvm/include/llvm/Transforms/IPO/Attributor.h --- a/llvm/include/llvm/Transforms/IPO/Attributor.h +++ b/llvm/include/llvm/Transforms/IPO/Attributor.h @@ -3404,6 +3404,38 @@ static const char ID; }; +/// An abstract interface for all nonnull attributes. +struct AAMustProgress + : public IRAttribute> { + AAMustProgress(const IRPosition &IRP, Attributor &A) : IRAttribute(IRP) {} + + /// Return true if we assume that the underlying value is nonnull. + bool isAssumedMustProgress() const { return getAssumed(); } + + /// Return true if we know that underlying value is nonnull. + bool isKnownMustProgress() const { return getKnown(); } + + /// Create an abstract attribute view for the position \p IRP. + static AAMustProgress &createForPosition(const IRPosition &IRP, + Attributor &A); + + /// See AbstractAttribute::getName() + const std::string getName() const override { return "AAMustProgress"; } + + /// See AbstractAttribute::getIdAddr() + const char *getIdAddr() const override { return &ID; } + + /// This function should return true if the type of the \p AA is + /// AAMustProgress + static bool classof(const AbstractAttribute *AA) { + return (AA->getIdAddr() == &ID); + } + + /// Unique ID (due to the unique address) + static const char ID; +}; + /// An abstract interface for all nonnull attributes. struct AANonNull : public IRAttribute(FPos); + // Every function might be "must-progress". + getOrCreateAAFor(FPos); + // Every function might contain instructions that cause "undefined behavior". getOrCreateAAFor(FPos); diff --git a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp --- a/llvm/lib/Transforms/IPO/AttributorAttributes.cpp +++ b/llvm/lib/Transforms/IPO/AttributorAttributes.cpp @@ -161,6 +161,7 @@ PIPE_OPERATOR(AANoReturn) PIPE_OPERATOR(AAReturnedValues) PIPE_OPERATOR(AANonNull) +PIPE_OPERATOR(AAMustProgress) PIPE_OPERATOR(AANoAlias) PIPE_OPERATOR(AADereferenceable) PIPE_OPERATOR(AAAlign) @@ -2854,6 +2855,77 @@ }; } // namespace +/// ------------------------ Must-Progress Attributes -------------------------- +namespace { +struct AAMustProgressImpl : public AAMustProgress { + AAMustProgressImpl(const IRPosition &IRP, Attributor &A) + : AAMustProgress(IRP, A) {} + + /// See AbstractAttribute::getAsStr() + const std::string getAsStr() const override { + return getAssumed() ? "mustprogress" : "may-not-progress"; + } +}; + +struct AAMustProgressFunction final : AAMustProgressImpl { + AAMustProgressFunction(const IRPosition &IRP, Attributor &A) + : AAMustProgressImpl(IRP, A) {} + + /// See AbstractAttribute::updateImpl(...). + ChangeStatus updateImpl(Attributor &A) override { + const auto &WillReturnAA = + A.getAAFor(*this, getIRPosition(), DepClassTy::OPTIONAL); + if (WillReturnAA.isKnownWillReturn()) + return indicateOptimisticFixpoint(); + if (WillReturnAA.isAssumedWillReturn()) + return ChangeStatus::UNCHANGED; + + auto CheckForMustProgress = [&](AbstractCallSite ACS) { + IRPosition IPos = IRPosition::callsite_function(*ACS.getInstruction()); + const auto &MustProgressAA = + A.getAAFor(*this, IPos, DepClassTy::OPTIONAL); + return MustProgressAA.isAssumedMustProgress(); + }; + + bool AllCallSitesKnown = true; + if (!A.checkForAllCallSites(CheckForMustProgress, *this, + /* RequireAllCallSites */ true, + AllCallSitesKnown)) + return indicatePessimisticFixpoint(); + + return ChangeStatus::UNCHANGED; + } + + /// See AbstractAttribute::trackStatistics() + void trackStatistics() const override { + STATS_DECLTRACK_FN_ATTR(mustprogress) + } +}; + +/// MustProgress attribute deduction for a call sites. +struct AAMustProgressCallSite final : AAMustProgressImpl { + AAMustProgressCallSite(const IRPosition &IRP, Attributor &A) + : AAMustProgressImpl(IRP, A) {} + + /// See AbstractAttribute::updateImpl(...). + ChangeStatus updateImpl(Attributor &A) override { + // TODO: Once we have call site specific value information we can provide + // call site specific liveness information and then it makes + // sense to specialize attributes for call sites arguments instead of + // redirecting requests to the callee argument. + const IRPosition &FnPos = IRPosition::function(*getAnchorScope()); + const auto &FnAA = + A.getAAFor(*this, FnPos, DepClassTy::OPTIONAL); + return clampStateAndIndicateChange(getState(), FnAA.getState()); + } + + /// See AbstractAttribute::trackStatistics() + void trackStatistics() const override { + STATS_DECLTRACK_CS_ATTR(mustprogress); + } +}; +} // namespace + /// ------------------------ No-Recurse Attributes ---------------------------- namespace { @@ -11879,6 +11951,7 @@ const char AANoSync::ID = 0; const char AANoFree::ID = 0; const char AANonNull::ID = 0; +const char AAMustProgress::ID = 0; const char AANoRecurse::ID = 0; const char AANonConvergent::ID = 0; const char AAWillReturn::ID = 0; @@ -12009,6 +12082,7 @@ CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMemoryLocation) CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AACallEdges) CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAAssumptionInfo) +CREATE_FUNCTION_ABSTRACT_ATTRIBUTE_FOR_POSITION(AAMustProgress) CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANonNull) CREATE_VALUE_ABSTRACT_ATTRIBUTE_FOR_POSITION(AANoAlias) diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define internal i32 @deref(ptr %x) nounwind { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@deref ; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -18,7 +18,7 @@ } define i32 @f(i32 %x) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@f ; TUNIT-SAME: (i32 returned [[X:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -26,7 +26,7 @@ ; TUNIT-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 ; TUNIT-NEXT: ret i32 [[X]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f ; CGSCC-SAME: (i32 [[X:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -42,10 +42,10 @@ ret i32 %tmp1 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll @@ -7,7 +7,7 @@ ; because there is a load of %A in the entry block define internal i32 @callee(i1 %C, ptr %A) { ; -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@callee ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -36,13 +36,13 @@ } define i32 @foo(ptr %A) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (ptr nocapture nofree readonly [[A:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[X:%.*]] = call i32 @callee(ptr nocapture nofree readonly align 4 [[A]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 [[X]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call i32 @callee(ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A]]) #[[ATTR2:[0-9]+]] @@ -53,10 +53,10 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: read) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define internal fastcc i32 @hash(ptr %ts, i32 %mod) nounwind { -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@hash ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -14,13 +14,13 @@ } define void @encode(ptr %m, ptr %ts, ptr %new) nounwind { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@encode ; TUNIT-SAME: (ptr nocapture nofree readnone [[M:%.*]], ptr nocapture nofree readnone [[TS:%.*]], ptr nocapture nofree readnone [[NEW:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@encode ; CGSCC-SAME: (ptr nocapture nofree readnone [[M:%.*]], ptr nocapture nofree readnone [[TS:%.*]], ptr nocapture nofree readnone [[NEW:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -31,10 +31,10 @@ unreachable } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noreturn nosync nounwind willreturn memory(none) } ;. ;; 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/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define internal fastcc i32 @term_SharingList(ptr %Term, ptr %List) nounwind { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@term_SharingList ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -25,7 +25,7 @@ } define i32 @term_Sharing(ptr %Term) nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@term_Sharing ; CHECK-SAME: (ptr nocapture nofree readnone [[TERM:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -46,7 +46,7 @@ ret i32 0 } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; TUNIT: {{.*}} diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll @@ -7,7 +7,7 @@ target triple = "x86_64-unknown-linux-gnu" define internal fastcc void @no_promote_avx2(ptr %arg, ptr readonly %arg1) #0 { -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@no_promote_avx2 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 32 dereferenceable(32) [[ARG1:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: bb: @@ -22,7 +22,7 @@ } define void @no_promote(ptr %arg) #1 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@no_promote ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: bb: @@ -34,7 +34,7 @@ ; TUNIT-NEXT: store <4 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@no_promote ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -57,7 +57,7 @@ } define internal fastcc void @promote_avx2(ptr %arg, ptr readonly %arg1) #0 { -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@promote_avx2 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64> [[TMP0:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: bb: @@ -74,7 +74,7 @@ } define void @promote(ptr %arg) #0 { -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@promote ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: bb: @@ -87,7 +87,7 @@ ; TUNIT-NEXT: store <4 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@promote ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: bb: @@ -117,14 +117,14 @@ attributes #1 = { nounwind uwtable } attributes #2 = { argmemonly nounwind } ;. -; TUNIT: attributes #[[ATTR0]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "target-features"="+avx2" } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; TUNIT: attributes #[[ATTR0]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "target-features"="+avx2" } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } ; TUNIT: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR3]] = { willreturn } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "target-features"="+avx2" } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; CGSCC: attributes #[[ATTR0]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "target-features"="+avx2" } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) uwtable } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR3]] = { willreturn } ; CGSCC: attributes #[[ATTR4]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll @@ -9,7 +9,7 @@ ; This should promote define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(ptr %arg, ptr readonly %arg1) #0 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: bb: @@ -27,7 +27,7 @@ define void @avx512_legal512_prefer512_call_avx512_legal512_prefer512(ptr %arg) #0 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: bb: @@ -40,7 +40,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: bb: @@ -66,7 +66,7 @@ ; This should promote define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(ptr %arg, ptr readonly %arg1) #1 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: bb: @@ -84,7 +84,7 @@ define void @avx512_legal512_prefer256_call_avx512_legal512_prefer256(ptr %arg) #1 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: bb: @@ -97,7 +97,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: bb: @@ -123,7 +123,7 @@ ; This should promote define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(ptr %arg, ptr readonly %arg1) #1 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: bb: @@ -141,7 +141,7 @@ define void @avx512_legal512_prefer512_call_avx512_legal512_prefer256(ptr %arg) #0 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: bb: @@ -154,7 +154,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: bb: @@ -180,7 +180,7 @@ ; This should promote define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(ptr %arg, ptr readonly %arg1) #0 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: bb: @@ -198,7 +198,7 @@ define void @avx512_legal512_prefer256_call_avx512_legal512_prefer512(ptr %arg) #1 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: bb: @@ -211,7 +211,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: bb: @@ -237,7 +237,7 @@ ; This should not promote define internal fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(ptr %arg, ptr readonly %arg1) #1 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: bb: @@ -253,7 +253,7 @@ define void @avx512_legal256_prefer256_call_avx512_legal512_prefer256(ptr %arg) #2 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: bb: @@ -265,7 +265,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -290,7 +290,7 @@ ; This should not promote define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(ptr %arg, ptr readonly %arg1) #2 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: bb: @@ -306,7 +306,7 @@ define void @avx512_legal512_prefer256_call_avx512_legal256_prefer256(ptr %arg) #1 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: bb: @@ -318,7 +318,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: bb: @@ -343,7 +343,7 @@ ; This should promote define internal fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(ptr %arg, ptr readonly %arg1) #3 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: bb: @@ -361,7 +361,7 @@ define void @avx2_legal256_prefer256_call_avx2_legal512_prefer256(ptr %arg) #4 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: bb: @@ -374,7 +374,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: bb: @@ -400,7 +400,7 @@ ; This should promote define internal fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(ptr %arg, ptr readonly %arg1) #4 { ; -; CHECK: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: bb: @@ -418,7 +418,7 @@ define void @avx2_legal512_prefer256_call_avx2_legal256_prefer256(ptr %arg) #3 { ; -; TUNIT: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[ARG:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: bb: @@ -431,7 +431,7 @@ ; TUNIT-NEXT: store <8 x i64> [[TMP4]], ptr [[ARG]], align 2 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: bb: @@ -464,18 +464,18 @@ attributes #4 = { inlinehint norecurse nounwind uwtable "target-features"="+avx2" "min-legal-vector-width"="256" "prefer-vector-width"="256" } attributes #5 = { argmemonly nounwind } ;. -; TUNIT: attributes #[[ATTR0]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="512" "target-features"="+avx512vl" } -; TUNIT: attributes #[[ATTR1]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx512vl" } -; TUNIT: attributes #[[ATTR2]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="256" "prefer-vector-width"="256" "target-features"="+avx512vl" } -; TUNIT: attributes #[[ATTR3]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx2" } +; TUNIT: attributes #[[ATTR0]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="512" "target-features"="+avx512vl" } +; TUNIT: attributes #[[ATTR1]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx512vl" } +; TUNIT: attributes #[[ATTR2]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="256" "prefer-vector-width"="256" "target-features"="+avx512vl" } +; TUNIT: attributes #[[ATTR3]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx2" } ; TUNIT: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR5]] = { willreturn } ; TUNIT: attributes #[[ATTR6]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="512" "target-features"="+avx512vl" } -; CGSCC: attributes #[[ATTR1]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx512vl" } -; CGSCC: attributes #[[ATTR2]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="256" "prefer-vector-width"="256" "target-features"="+avx512vl" } -; CGSCC: attributes #[[ATTR3]] = { inlinehint nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx2" } +; CGSCC: attributes #[[ATTR0]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="512" "target-features"="+avx512vl" } +; CGSCC: attributes #[[ATTR1]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx512vl" } +; CGSCC: attributes #[[ATTR2]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="256" "prefer-vector-width"="256" "target-features"="+avx512vl" } +; CGSCC: attributes #[[ATTR3]] = { inlinehint mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable "min-legal-vector-width"="512" "prefer-vector-width"="256" "target-features"="+avx2" } ; CGSCC: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR5]] = { willreturn } ; CGSCC: attributes #[[ATTR6]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll @@ -9,7 +9,7 @@ ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = constant [[T:%.*]] { i32 0, i32 0, i32 17, i32 25 } ;. define internal i32 @test(ptr %p) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -26,13 +26,13 @@ define i32 @caller() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i32 42 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -44,10 +44,10 @@ ret i32 %v } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll @@ -40,7 +40,7 @@ ; Test2 ; Different alignemnt privatizable arguments define internal i32 @test(ptr %X, ptr %Y) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[X:%.*]], i64 [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[Y_PRIV:%.*]] = alloca i64, align 8 @@ -69,7 +69,7 @@ } define internal i32 @caller(ptr %A) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca i32, align 4 @@ -84,13 +84,13 @@ } define i32 @callercaller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callercaller ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: ret i32 3 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callercaller ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call i32 @caller(i32 noundef 2) #[[ATTR4:[0-9]+]] @@ -102,11 +102,11 @@ ret i32 %X } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR3]] = { willreturn memory(read) } ; CGSCC: attributes #[[ATTR4]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll @@ -7,7 +7,7 @@ ; Don't drop 'byval' on %X here. define internal i32 @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X, i32 %i) nounwind { ; -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@f ; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -40,7 +40,7 @@ ; Also make sure we don't drop the call zeroext attribute. define i32 @test(ptr %X) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test ; TUNIT-SAME: (ptr nocapture nofree readonly [[X:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -54,7 +54,7 @@ ; TUNIT-NEXT: [[C:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 [[C]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -75,10 +75,10 @@ ret i32 %c } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll @@ -4,7 +4,7 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" define internal i32 @test(ptr %X, ptr %Y) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: (i32 [[TMP0:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[Y:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[X_PRIV:%.*]] = alloca i32, align 4 @@ -21,7 +21,7 @@ } define internal i32 @caller(ptr %B) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[B_PRIV:%.*]] = alloca i32, align 4 @@ -36,13 +36,13 @@ } define i32 @callercaller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callercaller ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: ret i32 3 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callercaller ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call i32 @caller(i32 noundef 2) #[[ATTR4:[0-9]+]] @@ -55,11 +55,11 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR3]] = { willreturn memory(read) } ; CGSCC: attributes #[[ATTR4]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll @@ -5,7 +5,7 @@ %struct.ss = type { i32, i64 } define internal void @f(ptr byval(%struct.ss) %b, ptr byval(i32) %X) nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@f ; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -32,7 +32,7 @@ define i32 @test(ptr %X) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test ; TUNIT-SAME: (ptr nocapture nofree readonly [[X:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -46,7 +46,7 @@ ; TUNIT-NEXT: call void @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -65,10 +65,10 @@ ret i32 0 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll @@ -7,7 +7,7 @@ %struct.ss = type { i32, i64 } define internal i32 @f(ptr byval(%struct.ss) %b) nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@f ; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -29,7 +29,7 @@ define internal i32 @g(ptr byval(%struct.ss) align 32 %b) nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@g ; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -51,7 +51,7 @@ define i32 @main() nounwind { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -69,7 +69,7 @@ ; TUNIT-NEXT: [[A:%.*]] = add i32 [[C0]], [[C1]] ; TUNIT-NEXT: ret i32 [[A]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -93,11 +93,11 @@ ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll @@ -11,7 +11,7 @@ ;. define internal i32 @test(ptr %x) { ; -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -25,14 +25,14 @@ } define i32 @caller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[X:%.*]] = call i32 @test() #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 [[X]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -45,10 +45,10 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { 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 } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll @@ -4,7 +4,7 @@ ; Don't promote around control flow. define internal i32 @callee(i1 %C, ptr %P) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@callee ; CHECK-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -27,14 +27,14 @@ } define i32 @foo(i1 %C, ptr %P) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (i1 [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[X:%.*]] = call i32 @callee(i1 [[C]], ptr nocapture nofree readonly [[P]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 [[X]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -47,10 +47,10 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: read) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll @@ -5,7 +5,7 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" define internal i32 @callee(i1 %C, ptr %P) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@callee ; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[P_PRIV:%.*]] = alloca i32, align 4 @@ -28,13 +28,13 @@ } define i32 @foo() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: ret i32 17 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call i32 @callee(i32 noundef 17) #[[ATTR2:[0-9]+]] @@ -47,10 +47,10 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll @@ -7,7 +7,7 @@ ; Inlining should nuke the invoke (and any inlined calls) here even with ; argument promotion running along with it. define void @zot() personality ptr @wibble { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@zot ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] personality ptr @wibble { ; TUNIT-NEXT: bb: @@ -18,7 +18,7 @@ ; TUNIT: bb2: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@zot ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] personality ptr @wibble { ; CGSCC-NEXT: bb: @@ -43,13 +43,13 @@ } define internal void @hoge() { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@hoge ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: bb: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@hoge ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: bb: @@ -62,7 +62,7 @@ } define internal fastcc ptr @spam(ptr %arg) { -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@spam ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -85,7 +85,7 @@ } define internal i1 @barney(ptr %arg) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@barney ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -96,13 +96,13 @@ } define i32 @test_inf_promote_caller(i32 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_inf_promote_caller ; TUNIT-SAME: (i32 [[ARG:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: bb: ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_inf_promote_caller ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -119,7 +119,7 @@ } define internal i32 @test_inf_promote_callee(ptr %arg, ptr %arg1) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_inf_promote_callee ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: bb: @@ -135,14 +135,14 @@ declare i32 @wibble(...) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { noreturn nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noreturn nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR4]] = { noreturn nounwind } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll @@ -19,13 +19,13 @@ ;. define void @run() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@run ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@run ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -40,7 +40,7 @@ } define internal i8 @UseLongDoubleUnsafely(ptr byval(%union.u) align 16 %arg) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@UseLongDoubleUnsafely ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -54,7 +54,7 @@ } define internal x86_fp80 @UseLongDoubleSafely(ptr byval(%union.u) align 16 %arg) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@UseLongDoubleSafely ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret x86_fp80 undef @@ -65,7 +65,7 @@ } define internal i64 @AccessPaddingOfStruct(ptr byval(%struct.Foo) %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@AccessPaddingOfStruct ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret i64 undef @@ -103,10 +103,10 @@ br label %loop } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nofree norecurse noreturn nosync nounwind 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/ArgumentPromotion/inalloca.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll @@ -8,7 +8,7 @@ ; Argpromote + sroa should change this to passing the two integers by value. define internal i32 @f(ptr inalloca(%struct.ss) %s) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@f ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull inalloca([[STRUCT_SS:%.*]]) align 4 dereferenceable(8) [[S:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -27,7 +27,7 @@ } define i32 @main() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -38,7 +38,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i32 @f(ptr noalias nocapture nofree noundef nonnull inalloca([[STRUCT_SS]]) align 4 dereferenceable(8) [[S]]) #[[ATTR2:[0-9]+]] ; TUNIT-NEXT: ret i32 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -60,7 +60,7 @@ ; Argpromote can't promote %a because of the icmp use. define internal i1 @g(ptr %a, ptr inalloca(%struct.ss) %b) nounwind { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@g ; CGSCC-SAME: (ptr noalias nocapture nofree nonnull readnone align 4 dereferenceable(8) [[A:%.*]], ptr noalias nocapture nofree nonnull writeonly inalloca([[STRUCT_SS:%.*]]) align 4 dereferenceable(8) [[B:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -72,13 +72,13 @@ } define i32 @test() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -90,12 +90,12 @@ ret i32 0 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR3]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/invalidation.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/invalidation.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/invalidation.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/invalidation.ll @@ -21,7 +21,7 @@ } define i32 @b() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@b ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -33,7 +33,7 @@ } define i32 @c() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@c ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -46,5 +46,5 @@ ret i32 %result } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll @@ -13,7 +13,7 @@ } define internal i32 @test(ptr %X, ptr %Y) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]] @@ -33,7 +33,7 @@ } define internal i32 @caller(ptr %B) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4 @@ -46,13 +46,13 @@ } define i32 @callercaller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callercaller ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callercaller ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[B:%.*]] = alloca i32, align 4 @@ -66,10 +66,10 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll @@ -13,7 +13,7 @@ } define internal i32 @test(ptr %X, ptr %Y) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]] @@ -22,7 +22,7 @@ ; TUNIT: dead: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@test ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[X:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]] @@ -43,14 +43,14 @@ } define internal i32 @caller(ptr %B) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: [[C:%.*]] = call i32 @test(ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B]]) #[[ATTR2:[0-9]+]] ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4 @@ -64,14 +64,14 @@ } define i32 @callercaller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callercaller ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: [[X:%.*]] = call i32 @caller(ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B]]) #[[ATTR2]] ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callercaller ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[B:%.*]] = alloca i32, align 4 @@ -86,12 +86,12 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR3]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll @@ -8,7 +8,7 @@ %T = type { i32, i32, i32, i32 } define internal i32 @test(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@test ; CHECK-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], ptr [[P]], i64 0, i32 3 @@ -27,13 +27,13 @@ } define i32 @caller(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[V:%.*]] = musttail call i32 @test(ptr nocapture nofree readonly [[P]]) #[[ATTR4:[0-9]+]] ; TUNIT-NEXT: ret i32 [[V]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[V:%.*]] = musttail call i32 @test(ptr nocapture nofree readonly [[P]]) #[[ATTR5:[0-9]+]] @@ -46,12 +46,12 @@ ; Don't promote arguments of musttail caller define i32 @foo(ptr %p, i32 %v) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (ptr nocapture nofree readnone [[P:%.*]], i32 [[V:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (ptr nocapture nofree readnone [[P:%.*]], i32 [[V:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: ret i32 0 @@ -60,7 +60,7 @@ } define internal i32 @test2(ptr %p, i32 %p2) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test2 ; CGSCC-SAME: (ptr nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], ptr [[P]], i64 0, i32 3 @@ -81,12 +81,12 @@ } define i32 @caller2(ptr %g) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller2 ; TUNIT-SAME: (ptr nocapture nofree readnone [[G:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@caller2 ; CGSCC-SAME: (ptr nocapture nofree readonly align 4 [[G:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[V:%.*]] = call noundef i32 @test2(ptr nocapture nofree readonly [[G]], i32 noundef 0) #[[ATTR5]] @@ -101,13 +101,13 @@ ; is kept as well. define i32 @bar(ptr %p, i32 %v) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@bar ; TUNIT-SAME: (ptr nocapture nofree nonnull writeonly dereferenceable(4) [[P:%.*]], i32 [[V:%.*]]) #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: store i32 [[V]], ptr [[P]], align 4 ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@bar ; CGSCC-SAME: (ptr nocapture nofree nonnull writeonly dereferenceable(4) [[P:%.*]], i32 [[V:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: store i32 [[V]], ptr [[P]], align 4 @@ -119,7 +119,7 @@ } define internal i32 @test2b(ptr %p, i32 %p2) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test2b ; TUNIT-SAME: (ptr nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]]) #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], ptr [[P]], i64 0, i32 3 @@ -130,7 +130,7 @@ ; TUNIT-NEXT: [[CA:%.*]] = musttail call noundef i32 @bar(ptr undef, i32 [[V]]) #[[ATTR4]] ; TUNIT-NEXT: ret i32 [[CA]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test2b ; CGSCC-SAME: (ptr nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: [[A_GEP:%.*]] = getelementptr [[T:%.*]], ptr [[P]], i64 0, i32 3 @@ -151,13 +151,13 @@ } define i32 @caller2b(ptr %g) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@caller2b ; TUNIT-SAME: (ptr nocapture nofree readonly [[G:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[V:%.*]] = call noundef i32 @test2b(ptr nocapture nofree readonly [[G]], i32 undef) #[[ATTR4]] ; TUNIT-NEXT: ret i32 [[V]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@caller2b ; CGSCC-SAME: (ptr nocapture nofree readonly align 4 [[G:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: [[V:%.*]] = call noundef i32 @test2b(ptr nocapture nofree readonly [[G]], i32 noundef 0) #[[ATTR7:[0-9]+]] @@ -167,17 +167,17 @@ ret i32 %v } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR5]] = { willreturn } ; CGSCC: attributes #[[ATTR6]] = { nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR7]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll @@ -11,7 +11,7 @@ ; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = common local_unnamed_addr global i32 0, align 4 ;. define i32 @fn2() local_unnamed_addr { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@fn2 ; TUNIT-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4 @@ -20,7 +20,7 @@ ; TUNIT-NEXT: call fastcc void @fn1(ptr nocapture nofree readonly align 4 [[TMP3]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@fn2 ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[TMP1:%.*]] = load i32, ptr @b, align 4 @@ -37,7 +37,7 @@ } define internal fastcc void @fn1(ptr nocapture readonly) unnamed_addr { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@fn1 ; TUNIT-SAME: (ptr nocapture nofree nonnull readonly align 4 [[TMP0:%.*]]) unnamed_addr #[[ATTR0]] { ; TUNIT-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 -1 @@ -45,7 +45,7 @@ ; TUNIT-NEXT: store i32 [[TMP3]], ptr @a, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@fn1 ; CGSCC-SAME: (ptr nocapture nofree nonnull readonly align 4 [[TMP0:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 -1 @@ -59,11 +59,11 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll @@ -12,7 +12,7 @@ %fun_t = type ptr define void @foo() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[TMP:%.*]] = alloca ptr, align 8 @@ -24,7 +24,7 @@ } define internal void @bar(%p_t %p) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@bar ; CGSCC-SAME: (ptr nocapture nofree readnone [[P:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: call void @llvm.dbg.value(metadata ptr [[P]], metadata [[META3:![0-9]+]], metadata !DIExpression()) #[[ATTR2:[0-9]+]], !dbg [[DBG5:![0-9]+]] @@ -47,10 +47,10 @@ !5 = !DIExpression() !6 = !DILocation(line: 1, column: 1, scope: !3) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll @@ -22,7 +22,7 @@ ; CHECK: @[[D:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 1 ;. define internal fastcc void @fn(ptr nocapture readonly %p1, ptr nocapture readonly %p2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@fn ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -41,7 +41,7 @@ } define i32 @main() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -52,7 +52,7 @@ ; TUNIT-NEXT: call fastcc void @fn() #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -84,11 +84,11 @@ !9 = !{!"any pointer", !3, i64 0} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. ; CHECK: [[TBAA0]] = !{!1, !1, i64 0} diff --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll --- a/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll +++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll @@ -7,13 +7,13 @@ define internal void @add(ptr %this, ptr sret(i32) %r) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@add ; TUNIT-SAME: (ptr noalias nocapture nofree nonnull readnone align 8 dereferenceable(8) [[THIS:%.*]], ptr noalias nocapture nofree noundef nonnull writeonly sret(i32) align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: store i32 undef, ptr [[R]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@add ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[THIS:%.*]], ptr noalias nocapture nofree noundef nonnull writeonly sret(i32) align 4 dereferenceable(4) [[R:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[BP:%.*]] = getelementptr { i32, i32 }, ptr [[THIS]], i32 0, i32 1 @@ -33,14 +33,14 @@ } define void @f() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@f ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: [[R:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: call void @add(ptr noalias nocapture nofree nonnull readnone align 8 dereferenceable(8) undef, ptr noalias nocapture nofree noundef nonnull writeonly sret(i32) align 4 dereferenceable(4) [[R]]) #[[ATTR2:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[R:%.*]] = alloca i32, align 4 @@ -55,12 +55,12 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll b/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll @@ -43,7 +43,7 @@ } define internal i32 @vfu2(ptr byval(%struct.MYstr) align 4 %u) nounwind readonly { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@vfu2 ; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -90,7 +90,7 @@ } define internal i32 @vfu2_v2(ptr byval(%struct.MYstr) align 4 %u) nounwind readonly { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@vfu2_v2 ; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -149,5 +149,5 @@ } ;. ; CHECK: attributes #[[ATTR0]] = { nounwind } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll @@ -7,13 +7,13 @@ define i64 @fn2() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@fn2 ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i64 undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@fn2 ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -31,7 +31,7 @@ define i64 @fn2b(i32 %arg) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@fn2b ; TUNIT-SAME: (i32 [[ARG:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -39,7 +39,7 @@ ; TUNIT-NEXT: [[DIV:%.*]] = sdiv i64 8, [[CONV]] ; TUNIT-NEXT: ret i64 [[DIV]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@fn2b ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -56,13 +56,13 @@ } define i64 @fn2c() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@fn2c ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i64 42 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@fn2c ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -79,7 +79,7 @@ } define internal i64 @fn1(i64 %p1) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@fn1 ; CGSCC-SAME: (i64 returned [[P1:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -91,10 +91,10 @@ ret i64 %cond } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll @@ -55,7 +55,7 @@ } define internal i32 @fn1(i32 %p1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@fn1 ; CHECK-SAME: (i32 returned [[P1:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -118,7 +118,7 @@ } define internal i32 @fn0(i32 %p1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@fn0 ; CHECK-SAME: (i32 returned [[P1:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -131,11 +131,11 @@ } ;. ; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind null_pointer_is_valid } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind } ;. ; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind null_pointer_is_valid } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll @@ -8,7 +8,7 @@ declare dso_local fastcc float @bar(ptr noalias, <8 x i32>) unnamed_addr define %struct.zot @widget(<8 x i32> %arg) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@widget ; CHECK-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: bb: @@ -19,14 +19,14 @@ } define void @baz(<8 x i32> %arg) local_unnamed_addr { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@baz ; TUNIT-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr #[[ATTR0]] { ; TUNIT-NEXT: bb: ; TUNIT-NEXT: [[TMP1:%.*]] = extractvalue [[STRUCT_ZOT:%.*]] undef, 0, 0 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@baz ; CGSCC-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: bb: @@ -38,8 +38,8 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll @@ -51,7 +51,7 @@ } define internal i16 @bar(i16 %p1, i16 %p2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; 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 @@ -77,7 +77,7 @@ } define internal i16 @bar2(i16 %p1, i16 %p2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; 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]] @@ -116,7 +116,7 @@ } define internal i16 @vararg_prop(i16 %p1, ...) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@vararg_prop ; CGSCC-SAME: (i16 [[P1:%.*]], ...) #[[ATTR1]] { ; CGSCC-NEXT: ret i16 7 @@ -125,7 +125,7 @@ } define internal i16 @vararg_no_prop(i16 %p1, i16 %p2, ...) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; 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 @@ -135,9 +135,9 @@ ;. ; TUNIT: attributes #[[ATTR0]] = { norecurse } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. ; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll @@ -27,7 +27,7 @@ ; TUNIT-SAME: (i16 [[P1:%.*]], i16 [[P2:%.*]]) { ; TUNIT-NEXT: ret i16 [[P2]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; 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]+]] { ; CGSCC-NEXT: ret i16 [[P2]] @@ -40,7 +40,7 @@ ; TUNIT: attributes #[[ATTR0]] = { norecurse } ;. ; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse 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: ; CHECK: {{.*}} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll @@ -5,7 +5,7 @@ ; See PR26774 define i32 @baz() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@baz ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret i32 10 @@ -45,8 +45,8 @@ ret i32 %val } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { norecurse } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll b/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll @@ -70,13 +70,13 @@ } define i32 @main() nounwind readnone { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -86,11 +86,11 @@ ret i32 0 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. ; CGSCC: attributes #[[ATTR0]] = { nounwind memory(none) } ; CGSCC: attributes #[[ATTR1]] = { nounwind memory(read) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { 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: ; CHECK: {{.*}} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll b/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll @@ -12,7 +12,7 @@ } define void @bar() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret void @@ -20,7 +20,7 @@ ret void } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; TUNIT: {{.*}} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/global.ll b/llvm/test/Transforms/Attributor/IPConstantProp/global.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/global.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/global.ll @@ -8,7 +8,7 @@ ; CHECK: @[[_ZL6TEST1G:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 42, align 4 ;. define void @_Z7test1f1v() nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@_Z7test1f1v ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -32,7 +32,7 @@ } define i32 @_Z7test1f2v() nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@_Z7test1f2v ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -43,7 +43,7 @@ ret i32 %tmp } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll b/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll @@ -38,7 +38,7 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" define internal i32 @cb0(i32 %zero) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cb0 ; CHECK-SAME: (i32 [[ZERO:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -49,7 +49,7 @@ } define internal i32 @cb1(i32 %unknown) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cb1 ; CHECK-SAME: (i32 noundef [[UNKNOWN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -60,13 +60,13 @@ } define internal i32 @cb2(i32 %unknown) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@cb2 ; TUNIT-SAME: (i32 noundef [[UNKNOWN:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i32 [[UNKNOWN]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cb2 ; CGSCC-SAME: (i32 noundef [[UNKNOWN:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -78,7 +78,7 @@ } define internal i32 @cb3(i32 %unknown) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cb3 ; CHECK-SAME: (i32 noundef [[UNKNOWN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -89,7 +89,7 @@ } define internal i32 @cb4(i32 %unknown) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cb4 ; CHECK-SAME: (i32 noundef [[UNKNOWN:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -125,10 +125,10 @@ !2 = !{i64 2, i64 3, i1 false} !3 = !{!0, !2, !1} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ;. ; CHECK: [[META0:![0-9]+]] = !{!1, !2, !3} ; CHECK: [[META1:![0-9]+]] = !{i64 0, i64 3, i1 false} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll b/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll @@ -78,7 +78,7 @@ } define internal ptr @no_side_effects(i8 %v) readonly nounwind { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@no_side_effects ; CGSCC-SAME: (i8 [[V:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: ret ptr null @@ -96,5 +96,5 @@ ret ptr null } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll b/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll @@ -68,7 +68,7 @@ declare !callback !0 dso_local i32 @pthread_create(ptr, ptr, ptr, ptr) define internal ptr @foo(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr noalias nocapture nofree readnone align 4294967296 [[ARG:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -79,7 +79,7 @@ } define internal ptr @bar(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: (ptr noalias nocapture nofree nonnull readnone align 8 dereferenceable(8) [[ARG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -90,7 +90,7 @@ } define internal ptr @baz(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@baz ; CHECK-SAME: (ptr noalias nofree noundef nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -101,7 +101,7 @@ } define internal ptr @buz(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@buz ; CHECK-SAME: (ptr noalias nofree noundef nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -114,7 +114,7 @@ !1 = !{i64 2, i64 3, i1 false} !0 = !{!1} ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. ; CHECK: [[META0:![0-9]+]] = !{!1} ; CHECK: [[META1:![0-9]+]] = !{i64 2, i64 3, i1 false} diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll b/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll @@ -5,7 +5,7 @@ ; CHECK-NOT: %X define internal i32 @foo(i32 %X) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: ret i32 undef @@ -16,12 +16,12 @@ } define void @bar() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@bar ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@bar ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret void @@ -31,9 +31,9 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ;. ;; 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/remove-call-inst.ll b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll @@ -9,13 +9,13 @@ ; FIXME: Remove obsolete calls/instructions define i32 @main() noreturn nounwind { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i32 123 ; -; CGSCC: Function Attrs: nofree noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -28,7 +28,7 @@ } define internal i32 @wwrite(i64 %i) nounwind readnone { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@wwrite ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -54,10 +54,10 @@ ret i32 0 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noreturn nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll @@ -4,7 +4,7 @@ ;; This function returns its second argument on all return statements define internal ptr @incdec(i1 %C, ptr %V) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@incdec ; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr noalias nofree noundef nonnull returned writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[V:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -13,7 +13,7 @@ ; TUNIT: F: ; TUNIT-NEXT: ret ptr [[V]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@incdec ; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nofree noundef nonnull returned align 4 dereferenceable(4) "no-capture-maybe-returned" [[V:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = load i32, ptr [[V]], align 4 @@ -44,7 +44,7 @@ ;; This function returns its first argument as a part of a multiple return ;; value define internal { i32, i32 } @foo(i32 %A, i32 %B) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = add i32 [[A]], [[B]] @@ -59,7 +59,7 @@ } define void @caller(i1 %C) personality ptr @__gxx_personality_v0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1:[0-9]+]] personality ptr @__gxx_personality_v0 { ; TUNIT-NEXT: [[Q:%.*]] = alloca i32, align 4 @@ -72,7 +72,7 @@ ; TUNIT: RET: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2:[0-9]+]] personality ptr @__gxx_personality_v0 { ; CGSCC-NEXT: [[Q:%.*]] = alloca i32, align 4 @@ -118,13 +118,13 @@ declare i32 @__gxx_personality_v0(...) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR3]] = { nounwind willreturn } ; CGSCC: attributes #[[ATTR4]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll @@ -5,7 +5,7 @@ ; FIXME: icmp folding is missing define i1 @invokecaller(i1 %C) personality ptr @__gxx_personality_v0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@invokecaller ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0:[0-9]+]] personality ptr @__gxx_personality_v0 { ; TUNIT-NEXT: [[X:%.*]] = call i32 @foo(i1 [[C]]) #[[ATTR1:[0-9]+]] @@ -15,7 +15,7 @@ ; TUNIT: FAIL: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@invokecaller ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0:[0-9]+]] personality ptr @__gxx_personality_v0 { ; CGSCC-NEXT: [[X:%.*]] = call i32 @foo(i1 noundef [[C]]) #[[ATTR2:[0-9]+]] @@ -37,7 +37,7 @@ } define internal i32 @foo(i1 %C) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -46,7 +46,7 @@ ; TUNIT: F: ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -65,12 +65,12 @@ } define i1 @caller(i1 %C) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[X:%.*]] = call i32 @foo(i1 noundef [[C]]) #[[ATTR3:[0-9]+]] @@ -84,11 +84,11 @@ declare i32 @__gxx_personality_v0(...) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ; CGSCC: attributes #[[ATTR3]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll @@ -7,7 +7,7 @@ %0 = type { i32, i32 } define internal %0 @foo(i1 %Q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (i1 noundef [[Q:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: br i1 [[Q]], label [[T:%.*]], label [[F:%.*]] @@ -34,7 +34,7 @@ } define internal %0 @bar(i1 %Q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: (i1 noundef [[Q:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = insertvalue [[TMP0:%.*]] undef, i32 21, 0 @@ -59,13 +59,13 @@ } define %0 @caller(i1 %Q) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller ; TUNIT-SAME: (i1 [[Q:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 [[Q]]) #[[ATTR1:[0-9]+]] ; TUNIT-NEXT: ret [[TMP0]] [[X]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller ; CGSCC-SAME: (i1 noundef [[Q:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 noundef [[Q]]) #[[ATTR2:[0-9]+]] @@ -84,7 +84,7 @@ ; Similar to @caller but the result of both calls are actually used. define i32 @caller2(i1 %Q) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller2 ; TUNIT-SAME: (i1 [[Q:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 [[Q]]) #[[ATTR1]] @@ -98,7 +98,7 @@ ; TUNIT-NEXT: [[R:%.*]] = add i32 [[N]], [[M]] ; TUNIT-NEXT: ret i32 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller2 ; CGSCC-SAME: (i1 noundef [[Q:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[X:%.*]] = call [[TMP0:%.*]] @foo(i1 noundef [[Q]]) #[[ATTR2]] @@ -125,10 +125,10 @@ ret i32 %R } ;. -; TUNIT: attributes #[[ATTR0]] = { 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 } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll b/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define internal i32 @testf(i1 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@testf ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -29,7 +29,7 @@ } define internal i32 @test1(i1 %c) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test1 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -59,12 +59,12 @@ } define i32 @main(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@main ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: ret i32 99 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@main ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[RES:%.*]] = call noundef i32 @test1(i1 [[C]]) #[[ATTR2]] @@ -74,10 +74,10 @@ ret i32 %res } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll b/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll --- a/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll +++ b/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll @@ -26,7 +26,7 @@ ; CHECK: @[[GSH:[a-zA-Z0-9_$"\\.-]+]] = dso_local global i32 0, align 4 ;. define internal i32 @callee(ptr %thread_local_ptr, ptr %shared_ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CHECK-LABEL: define {{[^@]+}}@callee ; CHECK-SAME: (ptr nocapture nofree nonnull readonly align 4 dereferenceable(4) [[THREAD_LOCAL_PTR:%.*]], ptr nocapture nofree nonnull readonly align 4 dereferenceable(4) [[SHARED_PTR:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -63,7 +63,7 @@ !1 = !{i64 1, i64 0, i64 2, i1 false} !0 = !{!1} ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ;. ; CHECK: [[META0:![0-9]+]] = !{!1} ; CHECK: [[META1:![0-9]+]] = !{i64 1, i64 0, i64 2, i1 false} diff --git a/llvm/test/Transforms/Attributor/align.ll b/llvm/test/Transforms/Attributor/align.ll --- a/llvm/test/Transforms/Attributor/align.ll +++ b/llvm/test/Transforms/Attributor/align.ll @@ -17,7 +17,7 @@ ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = global i8 0, align 32 ;. define ptr @test1(ptr align 8 %0) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test1 ; CHECK-SAME: (ptr nofree readnone returned align 8 "no-capture-maybe-returned" [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret ptr [[TMP0]] @@ -27,7 +27,7 @@ ; TEST 2 define ptr @test2(ptr %0) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[TMP0:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret ptr [[TMP0]] @@ -37,7 +37,7 @@ ; TEST 3 define ptr @test3(ptr align 8 %0, ptr align 4 %1, i1 %2) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test3 ; CHECK-SAME: (ptr nofree readnone align 8 "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree readnone align 4 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] @@ -49,7 +49,7 @@ ; TEST 4 define ptr @test4(ptr align 32 %0, ptr align 32 %1, i1 %2) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@test4 ; CHECK-SAME: (ptr nofree readnone align 32 "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree readnone align 32 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] @@ -85,12 +85,12 @@ ; TEST 6 ; SCC define ptr @test6_1() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test6_1 ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test6_1 ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret ptr undef @@ -100,12 +100,12 @@ } define ptr @test6_2() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test6_2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test6_2 ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret ptr undef @@ -134,7 +134,7 @@ ; Function Attrs: nounwind readnone ssp uwtable define internal ptr @f1(ptr readnone %0) local_unnamed_addr #0 { -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -158,7 +158,7 @@ ; Function Attrs: nounwind readnone ssp uwtable define ptr @f2(ptr readnone %0) local_unnamed_addr #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@f2 ; CHECK-SAME: (ptr nofree readnone [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null @@ -190,7 +190,7 @@ ; Function Attrs: nounwind readnone ssp uwtable define internal ptr @f3(ptr readnone %0) local_unnamed_addr #0 { -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f3 ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -214,15 +214,15 @@ ; TEST 7 ; Better than IR information define align 4 ptr @test7() #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test7 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret ptr @a1 ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test7 ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { -; CGSCC-NEXT: [[C:%.*]] = tail call noundef nonnull align 8 dereferenceable(1) ptr @f1() #[[ATTR13:[0-9]+]] +; CGSCC-NEXT: [[C:%.*]] = tail call noundef nonnull align 8 dereferenceable(1) ptr @f1() #[[ATTR14:[0-9]+]] ; CGSCC-NEXT: ret ptr [[C]] ; %c = tail call i8* @f1(i8* align 8 dereferenceable(1) @a1) @@ -232,7 +232,7 @@ ; TEST 7b ; Function Attrs: nounwind readnone ssp uwtable define internal ptr @f1b(ptr readnone %0) local_unnamed_addr #0 { -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f1b ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -293,7 +293,7 @@ ; Function Attrs: nounwind readnone ssp uwtable define internal ptr @f3b(ptr readnone %0) local_unnamed_addr #0 { ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f3b ; CGSCC-SAME: () local_unnamed_addr #[[ATTR0]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -315,12 +315,12 @@ } define align 4 ptr @test7b(ptr align 32 %p) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test7b ; TUNIT-SAME: (ptr nofree readnone returned align 32 "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: ret ptr [[P]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test7b ; CGSCC-SAME: (ptr nofree readnone returned align 32 "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: ret ptr [[P]] @@ -522,13 +522,13 @@ define i64 @test11(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test11 ; TUNIT-SAME: (ptr nocapture nofree nonnull readonly align 8 dereferenceable(8) [[P:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: [[RET:%.*]] = load i64, ptr [[P]], align 8 ; TUNIT-NEXT: ret i64 [[RET]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test11 ; CGSCC-SAME: (ptr nocapture nofree nonnull readonly align 8 dereferenceable(8) [[P:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: [[RET:%.*]] = load i64, ptr [[P]], align 8 @@ -544,7 +544,7 @@ ; FXIME: %p should have nonnull define i64 @test12-1(ptr align 4 %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test12-1 ; TUNIT-SAME: (ptr nocapture nofree readonly align 16 [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 @@ -552,7 +552,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = load i64, ptr [[ARRAYIDX1]], align 16 ; TUNIT-NEXT: ret i64 [[RET]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test12-1 ; CGSCC-SAME: (ptr nocapture nofree readonly align 16 [[P:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 @@ -568,13 +568,13 @@ } define i64 @test12-2(ptr align 4 %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test12-2 ; TUNIT-SAME: (ptr nocapture nofree nonnull readonly align 16 dereferenceable(8) [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[RET:%.*]] = load i64, ptr [[P]], align 16 ; TUNIT-NEXT: ret i64 [[RET]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test12-2 ; CGSCC-SAME: (ptr nocapture nofree nonnull readonly align 16 dereferenceable(8) [[P:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: [[RET:%.*]] = load i64, ptr [[P]], align 16 @@ -587,7 +587,7 @@ ; FXIME: %p should have nonnull define void @test12-3(ptr align 4 %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test12-3 ; TUNIT-SAME: (ptr nocapture nofree writeonly align 16 [[P:%.*]]) #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 @@ -595,7 +595,7 @@ ; TUNIT-NEXT: store i64 0, ptr [[ARRAYIDX1]], align 16 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@test12-3 ; CGSCC-SAME: (ptr nocapture nofree writeonly align 16 [[P:%.*]]) #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 @@ -611,13 +611,13 @@ } define void @test12-4(ptr align 4 %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test12-4 ; TUNIT-SAME: (ptr nocapture nofree nonnull writeonly align 16 dereferenceable(8) [[P:%.*]]) #[[ATTR5]] { ; TUNIT-NEXT: store i64 0, ptr [[P]], align 16 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@test12-4 ; CGSCC-SAME: (ptr nocapture nofree nonnull writeonly align 16 dereferenceable(8) [[P:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: store i64 0, ptr [[P]], align 16 @@ -631,20 +631,20 @@ declare void @use(ptr) willreturn nounwind define void @test12-5(ptr align 4 %p) { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@test12-5 -; TUNIT-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR6:[0-9]+]] { +; TUNIT-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR7:[0-9]+]] { ; TUNIT-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 ; TUNIT-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3 -; TUNIT-NEXT: tail call void @use(ptr align 16 [[ARRAYIDX1]]) #[[ATTR6]] +; TUNIT-NEXT: tail call void @use(ptr align 16 [[ARRAYIDX1]]) #[[ATTR6:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@test12-5 -; CGSCC-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR7:[0-9]+]] { +; CGSCC-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR8:[0-9]+]] { ; CGSCC-NEXT: [[ARRAYIDX0:%.*]] = getelementptr i64, ptr [[P]], i64 1 ; CGSCC-NEXT: [[ARRAYIDX1:%.*]] = getelementptr i64, ptr [[ARRAYIDX0]], i64 3 -; CGSCC-NEXT: tail call void @use(ptr align 16 [[ARRAYIDX1]]) #[[ATTR7]] +; CGSCC-NEXT: tail call void @use(ptr align 16 [[ARRAYIDX1]]) #[[ATTR7:[0-9]+]] ; CGSCC-NEXT: ret void ; %p-cast = bitcast i32* %p to i64* @@ -655,15 +655,15 @@ } define void @test12-6(ptr align 4 %p) { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@test12-6 -; TUNIT-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR6]] { +; TUNIT-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: tail call void @use(ptr align 16 [[P]]) #[[ATTR6]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@test12-6 -; CGSCC-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR7]] { +; CGSCC-SAME: (ptr align 16 [[P:%.*]]) #[[ATTR8]] { ; CGSCC-NEXT: tail call void @use(ptr align 16 [[P]]) #[[ATTR7]] ; CGSCC-NEXT: ret void ; @@ -673,9 +673,9 @@ } define void @test13(i1 %c, ptr align 32 %dst) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test13 -; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR7:[0-9]+]] { +; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR8:[0-9]+]] { ; TUNIT-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; TUNIT: truebb: ; TUNIT-NEXT: br label [[END:%.*]] @@ -686,9 +686,9 @@ ; TUNIT-NEXT: store i32 0, ptr [[PTR]], align 32 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test13 -; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR8:[0-9]+]] { +; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9:[0-9]+]] { ; CGSCC-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; CGSCC: truebb: ; CGSCC-NEXT: br label [[END:%.*]] @@ -711,9 +711,9 @@ } define void @test13-1(i1 %c, ptr align 32 %dst) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test13-1 -; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR8:[0-9]+]] { +; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9:[0-9]+]] { ; TUNIT-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; TUNIT: truebb: ; TUNIT-NEXT: br label [[END:%.*]] @@ -724,9 +724,9 @@ ; TUNIT-NEXT: store i32 0, ptr [[PTR]], align 16 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test13-1 -; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9:[0-9]+]] { +; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; CGSCC: truebb: ; CGSCC-NEXT: br label [[END:%.*]] @@ -749,9 +749,9 @@ } define void @test13-2(i1 %c, ptr align 32 %dst) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test13-2 -; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR8]] { +; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9]] { ; TUNIT-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; TUNIT: truebb: ; TUNIT-NEXT: br label [[END:%.*]] @@ -762,9 +762,9 @@ ; TUNIT-NEXT: store i32 0, ptr [[PTR]], align 32 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test13-2 -; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9]] { +; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; CGSCC: truebb: ; CGSCC-NEXT: br label [[END:%.*]] @@ -787,9 +787,9 @@ } define void @test13-3(i1 %c, ptr align 32 %dst) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test13-3 -; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR8]] { +; TUNIT-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9]] { ; TUNIT-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; TUNIT: truebb: ; TUNIT-NEXT: br label [[END:%.*]] @@ -800,9 +800,9 @@ ; TUNIT-NEXT: store i32 0, ptr [[PTR]], align 32 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test13-3 -; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR9]] { +; CGSCC-SAME: (i1 noundef [[C:%.*]], ptr nocapture nofree writeonly align 32 [[DST:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]] ; CGSCC: truebb: ; CGSCC-NEXT: br label [[END:%.*]] @@ -826,15 +826,15 @@ ; Don't crash on ptr2int/int2ptr uses. define i64 @ptr2int(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ptr2int -; TUNIT-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR9:[0-9]+]] { +; TUNIT-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR10:[0-9]+]] { ; TUNIT-NEXT: [[P2I:%.*]] = ptrtoint ptr [[P]] to i64 ; TUNIT-NEXT: ret i64 [[P2I]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ptr2int -; CGSCC-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR10:[0-9]+]] { +; CGSCC-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR11:[0-9]+]] { ; CGSCC-NEXT: [[P2I:%.*]] = ptrtoint ptr [[P]] to i64 ; CGSCC-NEXT: ret i64 [[P2I]] ; @@ -842,15 +842,15 @@ ret i64 %p2i } define ptr @int2ptr(i64 %i) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@int2ptr -; TUNIT-SAME: (i64 [[I:%.*]]) #[[ATTR9]] { +; TUNIT-SAME: (i64 [[I:%.*]]) #[[ATTR10]] { ; TUNIT-NEXT: [[I2P:%.*]] = inttoptr i64 [[I]] to ptr ; TUNIT-NEXT: ret ptr [[I2P]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@int2ptr -; CGSCC-SAME: (i64 [[I:%.*]]) #[[ATTR10]] { +; CGSCC-SAME: (i64 [[I:%.*]]) #[[ATTR11]] { ; CGSCC-NEXT: [[I2P:%.*]] = inttoptr i64 [[I]] to ptr ; CGSCC-NEXT: ret ptr [[I2P]] ; @@ -860,13 +860,13 @@ ; Use the store alignment only for the pointer operand. define void @aligned_store(ptr %Value, ptr %Ptr) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@aligned_store ; TUNIT-SAME: (ptr nofree writeonly [[VALUE:%.*]], ptr nocapture nofree noundef nonnull writeonly align 32 dereferenceable(8) [[PTR:%.*]]) #[[ATTR5]] { ; TUNIT-NEXT: store ptr [[VALUE]], ptr [[PTR]], align 32 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@aligned_store ; CGSCC-SAME: (ptr nofree writeonly [[VALUE:%.*]], ptr nocapture nofree noundef nonnull writeonly align 32 dereferenceable(8) [[PTR:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: store ptr [[VALUE]], ptr [[PTR]], align 32 @@ -890,13 +890,13 @@ } define void @align_store_after_bc(ptr align 2048 %arg) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@align_store_after_bc ; TUNIT-SAME: (ptr nocapture nofree nonnull writeonly align 2048 dereferenceable(1) [[ARG:%.*]]) #[[ATTR5]] { ; TUNIT-NEXT: store i8 0, ptr [[ARG]], align 2048 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@align_store_after_bc ; CGSCC-SAME: (ptr nocapture nofree nonnull writeonly align 2048 dereferenceable(1) [[ARG:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: store i8 0, ptr [[ARG]], align 2048 @@ -911,13 +911,13 @@ ; we cannot also put on the caller. @cnd = external global i1 define i32 @musttail_callee_1(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@musttail_callee_1 ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 32 ; TUNIT-NEXT: ret i32 [[V]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@musttail_callee_1 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: [[V:%.*]] = load i32, ptr [[P]], align 32 @@ -927,24 +927,24 @@ ret i32 %v } define i32 @musttail_caller_1(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@musttail_caller_1 -; TUNIT-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR10:[0-9]+]] { +; TUNIT-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR11:[0-9]+]] { ; TUNIT-NEXT: [[C:%.*]] = load i1, ptr @cnd, align 1 ; TUNIT-NEXT: br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]] ; TUNIT: mt: -; TUNIT-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree readonly [[P]]) #[[ATTR11:[0-9]+]] +; TUNIT-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree readonly [[P]]) #[[ATTR12:[0-9]+]] ; TUNIT-NEXT: ret i32 [[V]] ; TUNIT: exit: ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@musttail_caller_1 -; CGSCC-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR11:[0-9]+]] { +; CGSCC-SAME: (ptr nocapture nofree readonly [[P:%.*]]) #[[ATTR12:[0-9]+]] { ; CGSCC-NEXT: [[C:%.*]] = load i1, ptr @cnd, align 1 ; CGSCC-NEXT: br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]] ; CGSCC: mt: -; CGSCC-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P]]) #[[ATTR13]] +; CGSCC-NEXT: [[V:%.*]] = musttail call i32 @musttail_callee_1(ptr nocapture nofree noundef nonnull readonly dereferenceable(4) [[P]]) #[[ATTR14]] ; CGSCC-NEXT: ret i32 [[V]] ; CGSCC: exit: ; CGSCC-NEXT: ret i32 0 @@ -1023,9 +1023,9 @@ @G = global i8 0, align 32 define internal ptr @aligned_8_return(ptr %a, i1 %c1, i1 %c2) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@aligned_8_return -; TUNIT-SAME: (ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR9]] { +; TUNIT-SAME: (ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR10]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca ptr, align 8 ; TUNIT-NEXT: br i1 [[C1]], label [[T:%.*]], label [[F:%.*]] ; TUNIT: t: @@ -1040,9 +1040,9 @@ ; TUNIT-NEXT: [[L:%.*]] = load ptr, ptr [[STACK]], align 8 ; TUNIT-NEXT: ret ptr [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@aligned_8_return -; CGSCC-SAME: (ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR10]] { +; CGSCC-SAME: (ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR11]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca ptr, align 8 ; CGSCC-NEXT: br i1 [[C1]], label [[T:%.*]], label [[F:%.*]] ; CGSCC: t: @@ -1073,16 +1073,16 @@ } define ptr @aligned_8_return_caller(ptr align(16) %a, i1 %c1, i1 %c2) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@aligned_8_return_caller -; TUNIT-SAME: (ptr nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR9]] { -; TUNIT-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A]], i1 [[C1]], i1 [[C2]]) #[[ATTR11]] +; TUNIT-SAME: (ptr nofree readnone align 16 "no-capture-maybe-returned" [[A:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR10]] { +; TUNIT-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 "no-capture-maybe-returned" [[A]], i1 [[C1]], i1 [[C2]]) #[[ATTR12]] ; TUNIT-NEXT: ret ptr [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@aligned_8_return_caller -; CGSCC-SAME: (ptr nofree readnone align 16 [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR12:[0-9]+]] { -; CGSCC-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR13]] +; CGSCC-SAME: (ptr nofree readnone align 16 [[A:%.*]], i1 noundef [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR13:[0-9]+]] { +; CGSCC-NEXT: [[R:%.*]] = call align 8 ptr @aligned_8_return(ptr noalias nofree readnone align 16 [[A]], i1 noundef [[C1]], i1 [[C2]]) #[[ATTR14]] ; CGSCC-NEXT: ret ptr [[R]] ; %r = call i8* @aligned_8_return(i8* %a, i1 %c1, i1 %c2) @@ -1093,31 +1093,33 @@ attributes #1 = { uwtable noinline } attributes #2 = { null_pointer_is_valid } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } -; TUNIT: attributes #[[ATTR1]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR2]] = { nounwind } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR6]] = { nounwind willreturn } -; TUNIT: attributes #[[ATTR7]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } -; TUNIT: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR10]] = { nofree norecurse nosync nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR11]] = { nofree nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nounwind willreturn } +; TUNIT: attributes #[[ATTR8]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } +; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR12]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR2]] = { noinline nounwind uwtable } ; CGSCC: attributes #[[ATTR3]] = { nounwind } ; CGSCC: attributes #[[ATTR4]] = { nofree nosync nounwind } -; CGSCC: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR7]] = { nounwind willreturn } -; CGSCC: attributes #[[ATTR8]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } -; CGSCC: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR10]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR11]] = { nofree nosync nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR12]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR13]] = { willreturn } +; CGSCC: attributes #[[ATTR8]] = { mustprogress nounwind willreturn } +; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR12]] = { mustprogress nofree nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR13]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR14]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/alwaysinline.ll b/llvm/test/Transforms/Attributor/alwaysinline.ll --- a/llvm/test/Transforms/Attributor/alwaysinline.ll +++ b/llvm/test/Transforms/Attributor/alwaysinline.ll @@ -8,7 +8,7 @@ ; the function is not exactly defined, and marked alwaysinline and can be inlined, ; so the function can be analyzed define linkonce void @inner1() alwaysinline { -; CHECK: Function Attrs: alwaysinline nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: alwaysinline mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@inner1 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -19,13 +19,13 @@ } define void @outer1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@outer1 ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@outer1 ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -122,12 +122,12 @@ ret i32 %call } ;. -; TUNIT: attributes #[[ATTR0]] = { alwaysinline nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { alwaysinline mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { norecurse } ; TUNIT: attributes #[[ATTR3]] = { alwaysinline } ;. -; CGSCC: attributes #[[ATTR0]] = { alwaysinline nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { alwaysinline mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { alwaysinline } ;. diff --git a/llvm/test/Transforms/Attributor/call-simplify-pointer-info.ll b/llvm/test/Transforms/Attributor/call-simplify-pointer-info.ll --- a/llvm/test/Transforms/Attributor/call-simplify-pointer-info.ll +++ b/llvm/test/Transforms/Attributor/call-simplify-pointer-info.ll @@ -4,7 +4,7 @@ ; define internal i8 @read_arg(i8* %p) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@read_arg ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(1022) [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -17,7 +17,7 @@ } define internal i8 @read_arg_index(i8* %p, i64 %index) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@read_arg_index ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly align 16 dereferenceable(1024) [[P:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -32,7 +32,7 @@ } define i8 @call_simplifiable_1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@call_simplifiable_1 ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -40,7 +40,7 @@ ; TUNIT-NEXT: [[I0:%.*]] = getelementptr inbounds [1024 x i8], [1024 x i8]* [[BYTES]], i64 0, i64 2 ; TUNIT-NEXT: ret i8 2 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@call_simplifiable_1 ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -61,7 +61,7 @@ ;;; Same as read_arg, but we need a copy to form distinct leaves in the callgraph. define internal i8 @read_arg_1(i8* %p) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@read_arg_1 ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -74,7 +74,7 @@ } define internal i8 @sum_two_same_loads(i8* %p) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@sum_two_same_loads ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(1022) [[P:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: [[X:%.*]] = call i8 @read_arg_1(i8* nocapture nofree noundef nonnull readonly dereferenceable(1022) [[P]]) #[[ATTR5:[0-9]+]] @@ -89,7 +89,7 @@ } define i8 @call_simplifiable_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@call_simplifiable_2 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -98,7 +98,7 @@ ; TUNIT-NEXT: [[I1:%.*]] = getelementptr inbounds [1024 x i8], [1024 x i8]* [[BYTES]], i64 0, i64 3 ; TUNIT-NEXT: ret i8 4 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@call_simplifiable_2 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -121,7 +121,7 @@ } define i8 @call_simplifiable_3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@call_simplifiable_3 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -129,7 +129,7 @@ ; TUNIT-NEXT: [[I2:%.*]] = getelementptr inbounds [1024 x i8], [1024 x i8]* [[BYTES]], i64 0, i64 2 ; TUNIT-NEXT: ret i8 2 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@call_simplifiable_3 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -152,14 +152,14 @@ ;;; Same as read_arg, but we need a copy to form distinct leaves in the callgraph. define internal i8 @read_arg_2(i8* %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@read_arg_2 ; TUNIT-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(971) [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[L:%.*]] = load i8, i8* [[P]], align 1 ; TUNIT-NEXT: ret i8 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@read_arg_2 ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -172,7 +172,7 @@ } define internal i8 @sum_two_different_loads(i8* %p, i8* %q) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@sum_two_different_loads ; TUNIT-SAME: (i8* nocapture nofree nonnull readonly dereferenceable(972) [[P:%.*]], i8* nocapture nofree noundef nonnull readonly dereferenceable(971) [[Q:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[X:%.*]] = call i8 @read_arg_2(i8* nocapture nofree nonnull readonly dereferenceable(972) [[P]]) #[[ATTR3:[0-9]+]] @@ -180,7 +180,7 @@ ; TUNIT-NEXT: [[Z:%.*]] = add nsw i8 [[X]], [[Y]] ; TUNIT-NEXT: ret i8 [[Z]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@sum_two_different_loads ; CGSCC-SAME: (i8* nocapture nofree noundef nonnull readonly dereferenceable(972) [[P:%.*]], i8* nocapture nofree noundef nonnull readonly dereferenceable(971) [[Q:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[X:%.*]] = call i8 @read_arg_2(i8* nocapture nofree noundef nonnull readonly dereferenceable(972) [[P]]) #[[ATTR5]] @@ -195,7 +195,7 @@ } define i8 @call_partially_simplifiable_1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@call_partially_simplifiable_1 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -208,7 +208,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i8 @sum_two_different_loads(i8* nocapture nofree noundef nonnull readonly align 2 dereferenceable(1022) [[I2]], i8* nocapture nofree noundef nonnull readonly dereferenceable(1021) [[I3]]) #[[ATTR3]] ; TUNIT-NEXT: ret i8 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@call_partially_simplifiable_1 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -236,7 +236,7 @@ } define i8 @call_partially_simplifiable_2(i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@call_partially_simplifiable_2 ; TUNIT-SAME: (i1 [[COND:%.*]]) #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -251,7 +251,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i8 @sum_two_different_loads(i8* nocapture nofree nonnull readonly dereferenceable(972) [[SEL]], i8* nocapture nofree noundef nonnull readonly dereferenceable(971) [[I53]]) #[[ATTR3]] ; TUNIT-NEXT: ret i8 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@call_partially_simplifiable_2 ; CGSCC-SAME: (i1 [[COND:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -283,15 +283,15 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR4]] = { willreturn } ; CGSCC: attributes #[[ATTR5]] = { willreturn memory(read) } ;. diff --git a/llvm/test/Transforms/Attributor/cb_liveness_disabled.ll b/llvm/test/Transforms/Attributor/cb_liveness_disabled.ll --- a/llvm/test/Transforms/Attributor/cb_liveness_disabled.ll +++ b/llvm/test/Transforms/Attributor/cb_liveness_disabled.ll @@ -192,10 +192,10 @@ ; TUNIT_: !0 = !{i32 0, i32 101} ; TUNIT_: !1 = !{i32 100, i32 201} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind sspstrong willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind sspstrong willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/cb_liveness_enabled.ll b/llvm/test/Transforms/Attributor/cb_liveness_enabled.ll --- a/llvm/test/Transforms/Attributor/cb_liveness_enabled.ll +++ b/llvm/test/Transforms/Attributor/cb_liveness_enabled.ll @@ -195,10 +195,10 @@ ; TUNIT_: !0 = !{i32 0, i32 101} ; TUNIT_: !1 = !{i32 100, i32 201} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind sspstrong willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind sspstrong willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind sspstrong willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/cb_range_disabled.ll b/llvm/test/Transforms/Attributor/cb_range_disabled.ll --- a/llvm/test/Transforms/Attributor/cb_range_disabled.ll +++ b/llvm/test/Transforms/Attributor/cb_range_disabled.ll @@ -141,10 +141,10 @@ ret i32 %3 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/cb_range_enabled.ll b/llvm/test/Transforms/Attributor/cb_range_enabled.ll --- a/llvm/test/Transforms/Attributor/cb_range_enabled.ll +++ b/llvm/test/Transforms/Attributor/cb_range_enabled.ll @@ -145,10 +145,10 @@ ret i32 %3 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/convergent.ll b/llvm/test/Transforms/Attributor/convergent.ll --- a/llvm/test/Transforms/Attributor/convergent.ll +++ b/llvm/test/Transforms/Attributor/convergent.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define i32 @defined() convergent { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@defined ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret i32 1 @@ -12,12 +12,12 @@ } define i32 @calls_defined() convergent { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@calls_defined ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: convergent nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: convergent mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@calls_defined ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[A:%.*]] = call noundef i32 @defined() #[[ATTR5:[0-9]+]] @@ -91,13 +91,13 @@ declare void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 %size, i1 %isVolatile) convergent define void @calls_intrinsic(i8* %dest, i8* %src, i64 %size) convergent { -; TUNIT: Function Attrs: convergent nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: convergent mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@calls_intrinsic ; TUNIT-SAME: (ptr nocapture nofree writeonly [[DEST:%.*]], ptr nocapture nofree readonly [[SRC:%.*]], i64 [[SIZE:%.*]]) #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture nofree writeonly [[DEST]], ptr noalias nocapture nofree readonly [[SRC]], i64 [[SIZE]], i1 noundef false) #[[ATTR4:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: convergent nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: convergent mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@calls_intrinsic ; CGSCC-SAME: (ptr nocapture nofree writeonly [[DEST:%.*]], ptr nocapture nofree readonly [[SRC:%.*]], i64 [[SIZE:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture nofree writeonly [[DEST]], ptr noalias nocapture nofree readonly [[SRC]], i64 [[SIZE]], i1 noundef false) #[[ATTR5]] @@ -107,16 +107,16 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { convergent } -; TUNIT: attributes #[[ATTR2]] = { convergent nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR2]] = { convergent mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR4]] = { willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { convergent nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { convergent mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { convergent } -; CGSCC: attributes #[[ATTR3]] = { convergent nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR3]] = { convergent mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR5]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/depgraph.ll b/llvm/test/Transforms/Attributor/depgraph.ll --- a/llvm/test/Transforms/Attributor/depgraph.ll +++ b/llvm/test/Transforms/Attributor/depgraph.ll @@ -139,6 +139,8 @@ ; GRAPH-EMPTY: ; GRAPH-NEXT: [AANoRecurse] for CtxI ' %6 = call ptr @checkAndAdvance(ptr %5)' at position {cs: [@-1]} with state may-recurse ; GRAPH-EMPTY: +; GRAPH-NEXT: [AAMustProgress] for CtxI ' %2 = load i32, ptr %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state may-not-progress +; GRAPH-EMPTY: ; GRAPH-NEXT: [AAUndefinedBehavior] for CtxI ' %2 = load i32, ptr %0, align 4' at position {fn:checkAndAdvance [checkAndAdvance@-1]} with state undefined-behavior ; GRAPH-EMPTY: ; GRAPH-NEXT: [AANoUndef] for CtxI ' %6 = call ptr @checkAndAdvance(ptr %5)' at position {cs_arg: [@0]} with state may-undef-or-poison diff --git a/llvm/test/Transforms/Attributor/dereferenceable-1.ll b/llvm/test/Transforms/Attributor/dereferenceable-1.ll --- a/llvm/test/Transforms/Attributor/dereferenceable-1.ll +++ b/llvm/test/Transforms/Attributor/dereferenceable-1.ll @@ -12,7 +12,7 @@ ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = global i64 0 ;. define ptr @test1(ptr dereferenceable(4) %0, ptr dereferenceable(8) %1, i1 zeroext %2) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test1 ; CHECK-SAME: (ptr nofree noundef nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree noundef nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1:%.*]], i1 zeroext [[TMP2:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] @@ -24,7 +24,7 @@ ; TEST 2 define ptr @test2(ptr dereferenceable_or_null(4) %0, ptr dereferenceable(8) %1, i1 zeroext %2) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nofree noundef readnone dereferenceable_or_null(4) "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree noundef nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1:%.*]], i1 zeroext [[TMP2:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP2]], ptr [[TMP0]], ptr [[TMP1]] @@ -37,7 +37,7 @@ ; TEST 3 ; GEP inbounds define ptr @test3_1(ptr dereferenceable(8) %0) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test3_1 ; CHECK-SAME: (ptr nofree noundef nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 1 @@ -48,7 +48,7 @@ } define ptr @test3_2(ptr dereferenceable_or_null(32) %0) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test3_2 ; CHECK-SAME: (ptr nofree noundef readnone dereferenceable_or_null(32) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 4 @@ -59,7 +59,7 @@ } define ptr @test3_3(ptr dereferenceable(8) %0, ptr dereferenceable(16) %1, i1 %2) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test3_3 ; CHECK-SAME: (ptr nofree noundef nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]], ptr nofree noundef nonnull readnone dereferenceable(16) "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[RET1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 1 @@ -77,7 +77,7 @@ ; Better than known in IR. define dereferenceable(4) ptr @test4(ptr dereferenceable(8) %0) local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test4 ; CHECK-SAME: (ptr nofree noundef nonnull readnone returned dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: ret ptr [[TMP0]] @@ -192,10 +192,10 @@ declare ptr @unkown_ptr() willreturn nounwind declare i32 @unkown_f(ptr) willreturn nounwind define ptr @f7_0(ptr %ptr) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@f7_0 -; CHECK-SAME: (ptr noundef nonnull returned dereferenceable(8) [[PTR:%.*]]) #[[ATTR1:[0-9]+]] { -; CHECK-NEXT: [[T:%.*]] = tail call i32 @unkown_f(ptr noundef nonnull dereferenceable(8) [[PTR]]) #[[ATTR1]] +; CHECK-SAME: (ptr noundef nonnull returned dereferenceable(8) [[PTR:%.*]]) #[[ATTR2:[0-9]+]] { +; CHECK-NEXT: [[T:%.*]] = tail call i32 @unkown_f(ptr noundef nonnull dereferenceable(8) [[PTR]]) #[[ATTR1:[0-9]+]] ; CHECK-NEXT: ret ptr [[PTR]] ; %T = tail call i32 @unkown_f(ptr dereferenceable(8) %ptr) @@ -203,9 +203,9 @@ } define void @f7_1(ptr %ptr, i1 %c) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@f7_1 -; CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[PTR:%.*]], i1 noundef [[C:%.*]]) #[[ATTR1]] { +; CHECK-SAME: (ptr noundef nonnull align 4 dereferenceable(4) [[PTR:%.*]], i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[A:%.*]] = tail call i32 @unkown_f(ptr noundef nonnull align 4 dereferenceable(4) [[PTR]]) #[[ATTR1]] ; CHECK-NEXT: [[PTR_0:%.*]] = load i32, ptr [[PTR]], align 4 ; CHECK-NEXT: [[B:%.*]] = tail call i32 @unkown_f(ptr noundef nonnull align 4 dereferenceable(4) [[PTR]]) #[[ATTR1]] @@ -234,9 +234,9 @@ } define void @f7_2(i1 %c) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@f7_2 -; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { +; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[PTR:%.*]] = tail call nonnull align 4 dereferenceable(4) ptr @unkown_ptr() #[[ATTR1]] ; CHECK-NEXT: [[A:%.*]] = tail call i32 @unkown_f(ptr noundef nonnull align 4 dereferenceable(4) [[PTR]]) #[[ATTR1]] ; CHECK-NEXT: [[ARG_A_0:%.*]] = load i32, ptr [[PTR]], align 4 @@ -266,9 +266,9 @@ } define ptr @f7_3() { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@f7_3 -; CHECK-SAME: () #[[ATTR1]] { +; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: [[PTR:%.*]] = tail call noundef nonnull align 16 dereferenceable(4) ptr @unkown_ptr() #[[ATTR1]] ; CHECK-NEXT: store i32 10, ptr [[PTR]], align 16 ; CHECK-NEXT: ret ptr [[PTR]] @@ -280,9 +280,9 @@ ; FIXME: This should have a return dereferenceable(8) but we need to make sure it will work in loops as well. define ptr @test_for_minus_index(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@test_for_minus_index -; CHECK-SAME: (ptr nofree nonnull writeonly align 4 "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR2:[0-9]+]] { +; CHECK-SAME: (ptr nofree nonnull writeonly align 4 "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: [[Q:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 -2 ; CHECK-NEXT: store i32 1, ptr [[Q]], align 4 ; CHECK-NEXT: ret ptr [[Q]] @@ -293,9 +293,9 @@ } define void @deref_or_null_and_nonnull(ptr dereferenceable_or_null(100) %0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@deref_or_null_and_nonnull -; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(100) [[TMP0:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(100) [[TMP0:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: store i32 1, ptr [[TMP0]], align 4 ; CHECK-NEXT: ret void ; @@ -312,9 +312,9 @@ ; FIXME: %ptr should be dereferenceable(31) define void @test8(ptr %ptr) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@test8 -; CHECK-SAME: (ptr nocapture nofree nonnull writeonly dereferenceable(21) [[PTR:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (ptr nocapture nofree nonnull writeonly dereferenceable(21) [[PTR:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: br label [[TMP1:%.*]] ; CHECK: 1: ; CHECK-NEXT: [[I_0:%.*]] = phi i32 [ 20, [[TMP0:%.*]] ], [ [[TMP4:%.*]], [[TMP5:%.*]] ] @@ -347,9 +347,9 @@ ; 8.2 (negative case) define void @test8_neg(i32 %i, ptr %ptr) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@test8_neg -; CHECK-SAME: (i32 [[I:%.*]], ptr nocapture nofree nonnull writeonly [[PTR:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (i32 [[I:%.*]], ptr nocapture nofree nonnull writeonly [[PTR:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: [[TMP1:%.*]] = sext i32 [[I]] to i64 ; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 [[TMP1]] ; CHECK-NEXT: store i8 65, ptr [[TMP2]], align 1 @@ -370,9 +370,9 @@ ; NOTE: %p should not be dereferenceable define internal void @fill_range_not_inbounds(ptr %p, i64 %start){ -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@fill_range_not_inbounds -; CHECK-SAME: (ptr nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (ptr nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[START]], 9 ; CHECK-NEXT: br label [[FOR_BODY:%.*]] @@ -406,9 +406,9 @@ ; FIXME: %p should be dereferenceable(40) define internal void @fill_range_inbounds(ptr %p, i64 %start){ -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@fill_range_inbounds -; CHECK-SAME: (ptr nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (ptr nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TMP0:%.*]] = add nsw i64 [[START]], 9 ; CHECK-NEXT: br label [[FOR_BODY:%.*]] @@ -441,18 +441,18 @@ } define void @call_fill_range(ptr nocapture %p, ptr nocapture readonly %range) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@call_fill_range -; TUNIT-SAME: (ptr nocapture nofree writeonly [[P:%.*]], ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]]) #[[ATTR3:[0-9]+]] { +; TUNIT-SAME: (ptr nocapture nofree writeonly [[P:%.*]], ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[TMP0:%.*]] = load i64, ptr [[RANGE]], align 8, !range [[RNG0:![0-9]+]] -; TUNIT-NEXT: tail call void @fill_range_inbounds(ptr nocapture nofree writeonly [[P]], i64 [[TMP0]]) #[[ATTR6:[0-9]+]] -; TUNIT-NEXT: tail call void @fill_range_not_inbounds(ptr nocapture nofree writeonly [[P]], i64 [[TMP0]]) #[[ATTR6]] +; TUNIT-NEXT: tail call void @fill_range_inbounds(ptr nocapture nofree writeonly [[P]], i64 [[TMP0]]) #[[ATTR7:[0-9]+]] +; TUNIT-NEXT: tail call void @fill_range_not_inbounds(ptr nocapture nofree writeonly [[P]], i64 [[TMP0]]) #[[ATTR7]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@call_fill_range -; CGSCC-SAME: (ptr nocapture nofree writeonly [[P:%.*]], ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]]) #[[ATTR3:[0-9]+]] { +; CGSCC-SAME: (ptr nocapture nofree writeonly [[P:%.*]], ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: entry: ; CGSCC-NEXT: [[TMP0:%.*]] = load i64, ptr [[RANGE]], align 8, !range [[RNG0:![0-9]+]] ; CGSCC-NEXT: tail call void @fill_range_inbounds(ptr nocapture nofree writeonly [[P]], i64 [[TMP0]]) #[[ATTR1]] @@ -478,9 +478,9 @@ ; fun2(dereferenceable(4) %a, %b) ; We can say that %a is dereferenceable(4) but %b is not. define void @simple-path(ptr %a, ptr %b, i8 %c) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@simple-path -; CHECK-SAME: (ptr nonnull dereferenceable(4) [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR1]] { +; CHECK-SAME: (ptr nonnull dereferenceable(4) [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CHECK: if.then: @@ -513,9 +513,9 @@ ; } ; %a is dereferenceable(12) define void @complex-path(ptr %a, ptr %b, i8 %c) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@complex-path -; CHECK-SAME: (ptr noundef nonnull dereferenceable(12) [[A:%.*]], ptr nocapture nofree readnone [[B:%.*]], i8 [[C:%.*]]) #[[ATTR1]] { +; CHECK-SAME: (ptr noundef nonnull dereferenceable(12) [[A:%.*]], ptr nocapture nofree readnone [[B:%.*]], i8 [[C:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; CHECK-NEXT: tail call void @use1(ptr noundef nonnull dereferenceable(12) [[A]]) #[[ATTR1]] ; CHECK-NEXT: br i1 [[CMP]], label [[CONT_THEN:%.*]], label [[CONT_ELSE:%.*]] @@ -559,9 +559,9 @@ ; ; FIXME: %ptr should be dereferenceable(4) define dso_local void @rec-branch-1(i32 %a, i32 %b, i32 %c, ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@rec-branch-1 -; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR2]] { +; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0 ; CHECK-NEXT: br i1 [[TOBOOL]], label [[IF_ELSE3:%.*]], label [[IF_THEN:%.*]] @@ -635,7 +635,7 @@ define dso_local void @rec-branch-2(i32 %a, i32 %b, i32 %c, ptr %ptr) { ; TUNIT: Function Attrs: nofree nosync nounwind memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@rec-branch-2 -; TUNIT-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR4:[0-9]+]] { +; TUNIT-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0 ; TUNIT-NEXT: br i1 [[TOBOOL]], label [[IF_ELSE3:%.*]], label [[IF_THEN:%.*]] @@ -655,14 +655,14 @@ ; TUNIT-NEXT: store i32 3, ptr [[PTR]], align 4 ; TUNIT-NEXT: br label [[IF_END8]] ; TUNIT: if.else6: -; TUNIT-NEXT: tail call void @rec-branch-2(i32 noundef 1, i32 noundef 1, i32 noundef 1, ptr nocapture nofree writeonly [[PTR]]) #[[ATTR7:[0-9]+]] +; TUNIT-NEXT: tail call void @rec-branch-2(i32 noundef 1, i32 noundef 1, i32 noundef 1, ptr nocapture nofree writeonly [[PTR]]) #[[ATTR8:[0-9]+]] ; TUNIT-NEXT: br label [[IF_END8]] ; TUNIT: if.end8: ; TUNIT-NEXT: ret void ; ; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@rec-branch-2 -; CGSCC-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR4:[0-9]+]] { +; CGSCC-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: entry: ; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0 ; CGSCC-NEXT: br i1 [[TOBOOL]], label [[IF_ELSE3:%.*]], label [[IF_THEN:%.*]] @@ -682,7 +682,7 @@ ; CGSCC-NEXT: store i32 3, ptr [[PTR]], align 4 ; CGSCC-NEXT: br label [[IF_END8]] ; CGSCC: if.else6: -; CGSCC-NEXT: tail call void @rec-branch-2(i32 noundef 1, i32 noundef 1, i32 noundef 1, ptr nocapture nofree writeonly [[PTR]]) #[[ATTR6:[0-9]+]] +; CGSCC-NEXT: tail call void @rec-branch-2(i32 noundef 1, i32 noundef 1, i32 noundef 1, ptr nocapture nofree writeonly [[PTR]]) #[[ATTR7:[0-9]+]] ; CGSCC-NEXT: br label [[IF_END8]] ; CGSCC: if.end8: ; CGSCC-NEXT: ret void @@ -729,13 +729,13 @@ ; ; TUNIT-LABEL: define {{[^@]+}}@nonnull_assume_pos ; TUNIT-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(101) [[ARG1:%.*]], ptr nocapture nofree readnone dereferenceable_or_null(31) [[ARG2:%.*]], ptr nocapture nofree nonnull readnone [[ARG3:%.*]], ptr nocapture nofree readnone dereferenceable_or_null(42) [[ARG4:%.*]]) { -; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR8:[0-9]+]] [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[ARG1]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] +; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR9:[0-9]+]] [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[ARG1]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] ; TUNIT-NEXT: call void @unknown() ; TUNIT-NEXT: ret void ; ; CGSCC-LABEL: define {{[^@]+}}@nonnull_assume_pos ; CGSCC-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(101) [[ARG1:%.*]], ptr nocapture nofree readnone dereferenceable_or_null(31) [[ARG2:%.*]], ptr nocapture nofree nonnull readnone [[ARG3:%.*]], ptr nocapture nofree readnone dereferenceable_or_null(42) [[ARG4:%.*]]) { -; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR7:[0-9]+]] [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[ARG1]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] +; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR8:[0-9]+]] [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[ARG1]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] ; CGSCC-NEXT: call void @unknown() ; CGSCC-NEXT: ret void ; @@ -782,36 +782,36 @@ ; TUNIT-LABEL: define {{[^@]+}}@nonnull_assume_call ; TUNIT-SAME: (ptr [[ARG1:%.*]], ptr [[ARG2:%.*]], ptr [[ARG3:%.*]], ptr [[ARG4:%.*]]) { ; TUNIT-NEXT: call void @unknown() -; TUNIT-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) ptr @unkown_ptr() #[[ATTR9:[0-9]+]] -; TUNIT-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR9]] +; TUNIT-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) ptr @unkown_ptr() #[[ATTR10:[0-9]+]] +; TUNIT-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR10]] ; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[P]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] -; TUNIT-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR9]] -; TUNIT-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR9]] +; TUNIT-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR10]] +; TUNIT-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR10]] ; TUNIT-NEXT: call void @unknown() ; TUNIT-NEXT: ret void ; ; CGSCC-LABEL: define {{[^@]+}}@nonnull_assume_call ; CGSCC-SAME: (ptr [[ARG1:%.*]], ptr [[ARG2:%.*]], ptr [[ARG3:%.*]], ptr [[ARG4:%.*]]) { ; CGSCC-NEXT: call void @unknown() -; CGSCC-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) ptr @unkown_ptr() #[[ATTR8:[0-9]+]] -; CGSCC-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR8]] +; CGSCC-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) ptr @unkown_ptr() #[[ATTR9:[0-9]+]] +; CGSCC-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR9]] ; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(ptr [[ARG3]]), "dereferenceable"(ptr [[ARG1]], i64 1), "dereferenceable"(ptr [[ARG1]], i64 2), "dereferenceable"(ptr [[P]], i64 101), "dereferenceable_or_null"(ptr [[ARG2]], i64 31), "dereferenceable_or_null"(ptr [[ARG4]], i64 42) ] -; CGSCC-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR8]] -; CGSCC-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR8]] +; CGSCC-NEXT: call void @unknown_use8(ptr nonnull dereferenceable(2) [[ARG1]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(31) [[ARG2]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr nonnull [[ARG3]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use8(ptr dereferenceable_or_null(42) [[ARG4]]) #[[ATTR9]] +; CGSCC-NEXT: call void @unknown_use32(ptr nonnull dereferenceable(101) [[P]]) #[[ATTR9]] ; CGSCC-NEXT: call void @unknown() ; CGSCC-NEXT: ret void ; @@ -837,9 +837,9 @@ @g = global i64 0 define void @max_offset(i1 %c) { -; CHECK: Function Attrs: nounwind willreturn +; CHECK: Function Attrs: mustprogress nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@max_offset -; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { +; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] ; CHECK: t: @@ -864,26 +864,28 @@ !0 = !{i64 10, i64 100} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { nounwind willreturn } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind memory(argmem: write) } -; TUNIT: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; TUNIT: attributes #[[ATTR6]] = { nofree nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR7]] = { nofree nosync nounwind } -; TUNIT: attributes #[[ATTR8]] = { willreturn } -; TUNIT: attributes #[[ATTR9]] = { nounwind } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nounwind willreturn } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR5]] = { nofree nosync nounwind memory(argmem: write) } +; TUNIT: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; TUNIT: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR8]] = { nofree nosync nounwind } +; TUNIT: attributes #[[ATTR9]] = { willreturn } +; TUNIT: attributes #[[ATTR10]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR1]] = { nounwind willreturn } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR4]] = { nofree nosync nounwind memory(argmem: write) } -; CGSCC: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR6]] = { nofree nosync nounwind } -; CGSCC: attributes #[[ATTR7]] = { willreturn } -; CGSCC: attributes #[[ATTR8]] = { nounwind } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nounwind willreturn } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind memory(argmem: write) } +; CGSCC: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; CGSCC: attributes #[[ATTR7]] = { nofree nosync nounwind } +; CGSCC: attributes #[[ATTR8]] = { willreturn } +; CGSCC: attributes #[[ATTR9]] = { nounwind } ;. ; CHECK: [[META0:![0-9]+]] = !{i64 10, i64 100} ;. diff --git a/llvm/test/Transforms/Attributor/dereferenceable-2-inseltpoison.ll b/llvm/test/Transforms/Attributor/dereferenceable-2-inseltpoison.ll --- a/llvm/test/Transforms/Attributor/dereferenceable-2-inseltpoison.ll +++ b/llvm/test/Transforms/Attributor/dereferenceable-2-inseltpoison.ll @@ -6,7 +6,7 @@ ; https://bugs.llvm.org/show_bug.cgi?id=21780 define <4 x double> @PR21780(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds double, ptr [[PTR]], i64 1 @@ -44,7 +44,7 @@ define double @PR21780_only_access3_with_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_with_inbounds ; CHECK-SAME: (ptr nocapture nofree nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds double, ptr [[PTR]], i64 3 @@ -58,7 +58,7 @@ } define double @PR21780_only_access3_without_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_without_inbounds ; CHECK-SAME: (ptr nocapture nofree readonly align 8 [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr double, ptr [[PTR]], i64 3 @@ -71,7 +71,7 @@ } define double @PR21780_without_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_without_inbounds ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr double, ptr [[PTR]], i64 3 @@ -94,7 +94,7 @@ ; Unsimplified, but still valid. Also, throw in some bogus arguments. define void @gep0(ptr %unused, ptr %other, ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@gep0 ; CHECK-SAME: (ptr nocapture nofree readnone [[UNUSED:%.*]], ptr nocapture nofree noundef nonnull writeonly dereferenceable(1) [[OTHER:%.*]], ptr nocapture nofree nonnull readonly dereferenceable(3) [[PTR:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[PTR]], i64 2 @@ -116,7 +116,7 @@ ; Multiple arguments may be dereferenceable. define void @ordering(ptr %ptr1, ptr %ptr2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ordering ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(3) [[PTR1:%.*]], ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR2:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: ret void @@ -136,7 +136,7 @@ ; Not in entry block. define void @not_entry_but_guaranteed_to_execute(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_entry_but_guaranteed_to_execute ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(3) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -158,7 +158,7 @@ ; Not in entry block and not guaranteed to execute. define void @not_entry_not_guaranteed_to_execute(ptr %ptr, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_entry_not_guaranteed_to_execute ; CHECK-SAME: (ptr nocapture nofree readnone [[PTR:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -184,7 +184,7 @@ ; The last load may not execute, so derefenceable bytes only covers the 1st two loads. define void @partial_in_entry(ptr %ptr, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@partial_in_entry ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(4) [[PTR:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -211,7 +211,7 @@ ; The 2nd and 3rd loads may never execute. define void @volatile_is_not_dereferenceable(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@volatile_is_not_dereferenceable ; CHECK-SAME: (ptr nofree align 2 [[PTR:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: [[T0:%.*]] = load volatile i16, ptr [[PTR]], align 2 @@ -229,7 +229,7 @@ ; TODO: We should allow inference for atomic (but not volatile) ops. define void @atomic_is_alright(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@atomic_is_alright ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(6) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -264,7 +264,7 @@ ; We must have consecutive accesses. define void @variable_gep_index(ptr %unused, ptr %ptr, i64 %variable_index) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@variable_gep_index ; CHECK-SAME: (ptr nocapture nofree readnone [[UNUSED:%.*]], ptr nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]], i64 [[VARIABLE_INDEX:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -281,7 +281,7 @@ define void @multi_index_gep(ptr %ptr) { ; FIXME: %ptr should be dereferenceable(4) -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@multi_index_gep ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -294,7 +294,7 @@ ; Could round weird bitwidths down? define void @not_byte_multiple(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_byte_multiple ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(2) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -307,7 +307,7 @@ ; Missing direct access from the pointer. define void @no_pointer_deref(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@no_pointer_deref ; CHECK-SAME: (ptr nocapture nofree readnone align 2 [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -322,7 +322,7 @@ ; Out-of-order is ok, but missing access concludes dereferenceable range. define void @non_consecutive(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@non_consecutive ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -338,7 +338,7 @@ ; Improve on existing dereferenceable attribute. define void @more_bytes(ptr dereferenceable(8) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@more_bytes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -356,7 +356,7 @@ ; Improve on existing dereferenceable_or_null attribute. define void @more_bytes_and_not_null(ptr dereferenceable_or_null(8) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@more_bytes_and_not_null ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -374,7 +374,7 @@ ; But don't pessimize existing dereferenceable attribute. define void @better_bytes(ptr dereferenceable(100) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@better_bytes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(100) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -390,7 +390,7 @@ } define void @bitcast(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bitcast ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -403,7 +403,7 @@ } define void @bitcast_different_sizes(ptr %arg1, ptr %arg2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bitcast_different_sizes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(12) [[ARG1:%.*]], ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[ARG2:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -422,7 +422,7 @@ } define void @negative_offset(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@negative_offset ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -435,7 +435,7 @@ } define void @stores(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@stores ; CHECK-SAME: (ptr nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr float, ptr [[ARG]], i64 1 @@ -451,7 +451,7 @@ } define void @load_store(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@load_store ; CHECK-SAME: (ptr nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr float, ptr [[ARG]], i64 1 @@ -466,7 +466,7 @@ } define void @different_size1(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@different_size1 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: store double 0.000000e+00, ptr [[ARG]], align 8 @@ -480,7 +480,7 @@ } define void @different_size2(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@different_size2 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: store i32 0, ptr [[ARG]], align 8 @@ -511,7 +511,7 @@ ; ; ATTRIBUTOR_CGSCC_NPM-LABEL: define i32 @require_cfg_analysis(i32 %c, i32* {{.*}} dereferenceable(4) %p) define i32 @require_cfg_analysis(i32 %c, ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@require_cfg_analysis ; CHECK-SAME: (i32 [[C:%.*]], ptr nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp eq i32 [[C]], 0 @@ -563,11 +563,11 @@ ret i32 1 } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR3]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } -; CHECK: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR3]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; CHECK: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/dereferenceable-2.ll b/llvm/test/Transforms/Attributor/dereferenceable-2.ll --- a/llvm/test/Transforms/Attributor/dereferenceable-2.ll +++ b/llvm/test/Transforms/Attributor/dereferenceable-2.ll @@ -6,7 +6,7 @@ ; https://bugs.llvm.org/show_bug.cgi?id=21780 define <4 x double> @PR21780(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds double, ptr [[PTR]], i64 1 @@ -44,7 +44,7 @@ define double @PR21780_only_access3_with_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_with_inbounds ; CHECK-SAME: (ptr nocapture nofree nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds double, ptr [[PTR]], i64 3 @@ -58,7 +58,7 @@ } define double @PR21780_only_access3_without_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_without_inbounds ; CHECK-SAME: (ptr nocapture nofree readonly align 8 [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr double, ptr [[PTR]], i64 3 @@ -71,7 +71,7 @@ } define double @PR21780_without_inbounds(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@PR21780_without_inbounds ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr double, ptr [[PTR]], i64 3 @@ -94,7 +94,7 @@ ; Unsimplified, but still valid. Also, throw in some bogus arguments. define void @gep0(ptr %unused, ptr %other, ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@gep0 ; CHECK-SAME: (ptr nocapture nofree readnone [[UNUSED:%.*]], ptr nocapture nofree noundef nonnull writeonly dereferenceable(1) [[OTHER:%.*]], ptr nocapture nofree nonnull readonly dereferenceable(3) [[PTR:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[PTR]], i64 2 @@ -116,7 +116,7 @@ ; Multiple arguments may be dereferenceable. define void @ordering(ptr %ptr1, ptr %ptr2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ordering ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(3) [[PTR1:%.*]], ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR2:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: ret void @@ -136,7 +136,7 @@ ; Not in entry block. define void @not_entry_but_guaranteed_to_execute(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_entry_but_guaranteed_to_execute ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(3) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -158,7 +158,7 @@ ; Not in entry block and not guaranteed to execute. define void @not_entry_not_guaranteed_to_execute(ptr %ptr, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_entry_not_guaranteed_to_execute ; CHECK-SAME: (ptr nocapture nofree readnone [[PTR:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -184,7 +184,7 @@ ; The last load may not execute, so derefenceable bytes only covers the 1st two loads. define void @partial_in_entry(ptr %ptr, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@partial_in_entry ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(4) [[PTR:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -211,7 +211,7 @@ ; The 2nd and 3rd loads may never execute. define void @volatile_is_not_dereferenceable(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@volatile_is_not_dereferenceable ; CHECK-SAME: (ptr nofree align 2 [[PTR:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: [[T0:%.*]] = load volatile i16, ptr [[PTR]], align 2 @@ -229,7 +229,7 @@ ; TODO: We should allow inference for atomic (but not volatile) ops. define void @atomic_is_alright(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@atomic_is_alright ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(6) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -264,7 +264,7 @@ ; We must have consecutive accesses. define void @variable_gep_index(ptr %unused, ptr %ptr, i64 %variable_index) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@variable_gep_index ; CHECK-SAME: (ptr nocapture nofree readnone [[UNUSED:%.*]], ptr nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]], i64 [[VARIABLE_INDEX:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -281,7 +281,7 @@ define void @multi_index_gep(ptr %ptr) { ; FIXME: %ptr should be dereferenceable(4) -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@multi_index_gep ; CHECK-SAME: (ptr nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -294,7 +294,7 @@ ; Could round weird bitwidths down? define void @not_byte_multiple(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_byte_multiple ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 2 dereferenceable(2) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -307,7 +307,7 @@ ; Missing direct access from the pointer. define void @no_pointer_deref(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@no_pointer_deref ; CHECK-SAME: (ptr nocapture nofree readnone align 2 [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -322,7 +322,7 @@ ; Out-of-order is ok, but missing access concludes dereferenceable range. define void @non_consecutive(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@non_consecutive ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -338,7 +338,7 @@ ; Improve on existing dereferenceable attribute. define void @more_bytes(ptr dereferenceable(8) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@more_bytes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -356,7 +356,7 @@ ; Improve on existing dereferenceable_or_null attribute. define void @more_bytes_and_not_null(ptr dereferenceable_or_null(8) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@more_bytes_and_not_null ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -374,7 +374,7 @@ ; But don't pessimize existing dereferenceable attribute. define void @better_bytes(ptr dereferenceable(100) %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@better_bytes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(100) [[PTR:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -390,7 +390,7 @@ } define void @bitcast(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bitcast ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -403,7 +403,7 @@ } define void @bitcast_different_sizes(ptr %arg1, ptr %arg2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bitcast_different_sizes ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(12) [[ARG1:%.*]], ptr nocapture nofree nonnull readnone align 4 dereferenceable(16) [[ARG2:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -422,7 +422,7 @@ } define void @negative_offset(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@negative_offset ; CHECK-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: ret void @@ -435,7 +435,7 @@ } define void @stores(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@stores ; CHECK-SAME: (ptr nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr float, ptr [[ARG]], i64 1 @@ -451,7 +451,7 @@ } define void @load_store(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@load_store ; CHECK-SAME: (ptr nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr float, ptr [[ARG]], i64 1 @@ -466,7 +466,7 @@ } define void @different_size1(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@different_size1 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: store double 0.000000e+00, ptr [[ARG]], align 8 @@ -480,7 +480,7 @@ } define void @different_size2(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@different_size2 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: store i32 0, ptr [[ARG]], align 8 @@ -511,7 +511,7 @@ ; ; ATTRIBUTOR_CGSCC_NPM-LABEL: define i32 @require_cfg_analysis(i32 %c, i32* {{.*}} dereferenceable(4) %p) define i32 @require_cfg_analysis(i32 %c, ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@require_cfg_analysis ; CHECK-SAME: (i32 [[C:%.*]], ptr nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: [[TOBOOL1:%.*]] = icmp eq i32 [[C]], 0 @@ -563,11 +563,11 @@ ret i32 1 } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } -; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR3]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } -; CHECK: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR3]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; CHECK: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/internal-noalias.ll b/llvm/test/Transforms/Attributor/internal-noalias.ll --- a/llvm/test/Transforms/Attributor/internal-noalias.ll +++ b/llvm/test/Transforms/Attributor/internal-noalias.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define dso_local i32 @visible(ptr noalias %A, ptr noalias %B) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; TUNIT-LABEL: define {{[^@]+}}@visible ; TUNIT-SAME: (ptr noalias nocapture nofree readonly [[A:%.*]], ptr noalias nocapture nofree readonly [[B:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -12,7 +12,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]] ; TUNIT-NEXT: ret i32 [[ADD]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable ; CGSCC-LABEL: define {{[^@]+}}@visible ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -29,7 +29,7 @@ } define private i32 @noalias_args(ptr %A, ptr %B) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; TUNIT-LABEL: define {{[^@]+}}@noalias_args ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -40,7 +40,7 @@ ; TUNIT-NEXT: [[ADD2:%.*]] = add nsw i32 [[ADD]], [[CALL]] ; TUNIT-NEXT: ret i32 [[ADD2]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable ; CGSCC-LABEL: define {{[^@]+}}@noalias_args ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -62,7 +62,7 @@ define internal i32 @noalias_args_argmem(ptr %A, ptr %B) #1 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; TUNIT-LABEL: define {{[^@]+}}@noalias_args_argmem ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -71,7 +71,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]] ; TUNIT-NEXT: ret i32 [[ADD]] ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; CGSCC-LABEL: define {{[^@]+}}@noalias_args_argmem ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]], ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -88,7 +88,7 @@ } define dso_local i32 @visible_local(ptr %A) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@visible_local ; TUNIT-SAME: (ptr nocapture nofree readonly [[A:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -99,7 +99,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]] ; TUNIT-NEXT: ret i32 [[ADD]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@visible_local ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -120,7 +120,7 @@ } define internal i32 @noalias_args_argmem_ro(ptr %A, ptr %B) #1 { -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; CGSCC-LABEL: define {{[^@]+}}@noalias_args_argmem_ro ; CGSCC-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[B_PRIV:%.*]] = alloca i32, align 4 @@ -139,13 +139,13 @@ } define i32 @visible_local_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@visible_local_2 ; TUNIT-SAME: () #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: ret i32 10 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@visible_local_2 ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: [[CALL:%.*]] = call i32 @noalias_args_argmem_ro(i32 noundef 5, i32 noundef 5) #[[ATTR6:[0-9]+]] @@ -158,12 +158,12 @@ } define internal i32 @noalias_args_argmem_rn(ptr %A, ptr %B) #1 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@noalias_args_argmem_rn ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@noalias_args_argmem_rn ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull align 4 dereferenceable(4) [[B:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: [[T0:%.*]] = load i32, ptr [[B]], align 4 @@ -176,14 +176,14 @@ } define i32 @visible_local_3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@visible_local_3 ; TUNIT-SAME: () #[[ATTR2]] { ; TUNIT-NEXT: [[B:%.*]] = alloca i32, align 4 ; TUNIT-NEXT: [[CALL:%.*]] = call i32 @noalias_args_argmem_rn(ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[B]]) #[[ATTR5:[0-9]+]] ; TUNIT-NEXT: ret i32 5 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@visible_local_3 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[B:%.*]] = alloca i32, align 4 @@ -200,18 +200,18 @@ attributes #0 = { noinline nounwind uwtable willreturn } attributes #1 = { argmemonly noinline nounwind uwtable willreturn} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } -; TUNIT: attributes #[[ATTR1]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR3]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind } ; TUNIT: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } -; CGSCC: attributes #[[ATTR2]] = { nofree noinline nosync nounwind willreturn memory(argmem: readwrite) uwtable } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR4]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline nosync nounwind willreturn memory(argmem: read) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree noinline nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } ; CGSCC: attributes #[[ATTR5]] = { memory(read) } ; CGSCC: attributes #[[ATTR6]] = { willreturn } ; CGSCC: attributes #[[ATTR7]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/internalize.ll b/llvm/test/Transforms/Attributor/internalize.ll --- a/llvm/test/Transforms/Attributor/internalize.ll +++ b/llvm/test/Transforms/Attributor/internalize.ll @@ -135,7 +135,7 @@ ; CHECK_DISABLED-NEXT: call void @unused_arg(i8 noundef 0) ; CHECK_DISABLED-NEXT: ret void ; -; CHECK_ENABLED: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK_ENABLED: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK_ENABLED-LABEL: define {{[^@]+}}@unused_arg_caller ; CHECK_ENABLED-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK_ENABLED-NEXT: unreachable @@ -164,7 +164,7 @@ ;. ; CHECK_DISABLED: attributes #[[ATTR0]] = { norecurse } ;. -; CHECK_ENABLED: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK_ENABLED: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CHECK_ENABLED: attributes #[[ATTR1]] = { norecurse } ; CHECK_ENABLED: attributes #[[ATTR2:[0-9]+]] = { nounwind } ;. diff --git a/llvm/test/Transforms/Attributor/liveness.ll b/llvm/test/Transforms/Attributor/liveness.ll --- a/llvm/test/Transforms/Attributor/liveness.ll +++ b/llvm/test/Transforms/Attributor/liveness.ll @@ -37,7 +37,7 @@ ; CGSCC: @[[P:[a-zA-Z0-9_$"\\.-]+]] = global i8 0 ;. define internal i32 @dead_internal_func(i32 %0) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@dead_internal_func ; CGSCC-SAME: () #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -68,13 +68,13 @@ } define i32 @volatile_load(i32*) norecurse nounwind uwtable { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; TUNIT-LABEL: define {{[^@]+}}@volatile_load ; TUNIT-SAME: (i32* nofree noundef align 4 [[TMP0:%.*]]) #[[ATTR6:[0-9]+]] { ; TUNIT-NEXT: [[TMP2:%.*]] = load volatile i32, i32* [[TMP0]], align 4 ; TUNIT-NEXT: ret i32 [[TMP2]] ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CGSCC-LABEL: define {{[^@]+}}@volatile_load ; CGSCC-SAME: (i32* nofree noundef align 4 [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: [[TMP2:%.*]] = load volatile i32, i32* [[TMP0]], align 4 @@ -85,7 +85,7 @@ } define internal i32 @internal_load(i32*) norecurse nounwind uwtable { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@internal_load ; CGSCC-SAME: () #[[ATTR8:[0-9]+]] { ; CGSCC-NEXT: ret i32 undef @@ -498,7 +498,7 @@ ; FIXME: Should be able to detect undefined behavior. define void @ub(i32* %0) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@ub ; TUNIT-SAME: (i32* nocapture nofree writeonly [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] { ; TUNIT-NEXT: [[POISON:%.*]] = sub nuw i32 0, 1 @@ -507,7 +507,7 @@ ; TUNIT-NEXT: store i32 0, i32* [[POISON_YET_AGAIN]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@ub ; CGSCC-SAME: (i32* nocapture nofree writeonly [[TMP0:%.*]]) #[[ATTR9:[0-9]+]] { ; CGSCC-NEXT: [[POISON:%.*]] = sub nuw i32 0, 1 @@ -588,13 +588,13 @@ } define void @rec() #0 { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@rec ; TUNIT-SAME: () #[[ATTR9:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@rec ; CGSCC-SAME: () #[[ATTR11:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -795,14 +795,14 @@ ; TUNIT: Function Attrs: nofree noreturn nosync nounwind ; TUNIT-LABEL: define {{[^@]+}}@test_unreachable ; TUNIT-SAME: () #[[ATTR0]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13:[0-9]+]] +; TUNIT-NEXT: call void @sink() #[[ATTR14:[0-9]+]] ; TUNIT-NEXT: call void @test_unreachable() #[[ATTR0]] ; TUNIT-NEXT: unreachable ; ; CGSCC: Function Attrs: nofree noreturn nosync nounwind ; CGSCC-LABEL: define {{[^@]+}}@test_unreachable ; CGSCC-SAME: () #[[ATTR0]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15:[0-9]+]] +; CGSCC-NEXT: call void @sink() #[[ATTR16:[0-9]+]] ; CGSCC-NEXT: call void @test_unreachable() #[[ATTR0]] ; CGSCC-NEXT: unreachable ; @@ -883,28 +883,28 @@ ; ; CGSCC-LABEL: define {{[^@]+}}@middle() { ; CGSCC-NEXT: bb0: -; CGSCC-NEXT: call void @non_dead_b0() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b1() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b2() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b3() #[[ATTR15]] +; CGSCC-NEXT: call void @non_dead_b0() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b1() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b2() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b3() #[[ATTR16]] ; CGSCC-NEXT: br label [[BB1:%.*]] ; CGSCC: bb1: -; CGSCC-NEXT: call void @non_dead_b4() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b5() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b6() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b7() #[[ATTR15]] +; CGSCC-NEXT: call void @non_dead_b4() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b5() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b6() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b7() #[[ATTR16]] ; CGSCC-NEXT: br label [[BB2:%.*]] ; CGSCC: bb2: -; CGSCC-NEXT: call void @non_dead_b8() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b9() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b10() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b11() #[[ATTR15]] +; CGSCC-NEXT: call void @non_dead_b8() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b9() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b10() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b11() #[[ATTR16]] ; CGSCC-NEXT: br label [[BB3:%.*]] ; CGSCC: bb3: -; CGSCC-NEXT: call void @non_dead_b12() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b13() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b14() #[[ATTR15]] -; CGSCC-NEXT: call void @non_dead_b15() #[[ATTR15]] +; CGSCC-NEXT: call void @non_dead_b12() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b13() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b14() #[[ATTR16]] +; CGSCC-NEXT: call void @non_dead_b15() #[[ATTR16]] ; CGSCC-NEXT: br label [[BB4:%.*]] ; CGSCC: bb4: ; CGSCC-NEXT: call void @non_exact2() @@ -1021,1024 +1021,1024 @@ } define internal void @non_dead_a0() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a0 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11:[0-9]+]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a0 -; CGSCC-SAME: () #[[ATTR12:[0-9]+]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13:[0-9]+]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a1() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a1 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a1 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a2() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a2 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a2 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a3() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a3 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a3 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a4() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a4 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a4 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a5() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a5 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a5 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a6() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a6 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a6 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a7() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a7 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a7 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a8() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a8 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a8 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a9() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a9 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a9 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a10() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a10 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a10 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a11() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a11 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a11 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a12() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a12 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a12 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a13() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a13 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a13 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a14() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a14 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a14 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_a15() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_a15 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_a15 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b0() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b0 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b0 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b1() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b1 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b1 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b2() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b2 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b2 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b3() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b3 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b3 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b4() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b4 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b4 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b5() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b5 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b5 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b6() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b6 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b6 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b7() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b7 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b7 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b8() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b8 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b8 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b9() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b9 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b9 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b10() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b10 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b10 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b11() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b11 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b11 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b12() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b12 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b12 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b13() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b13 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b13 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b14() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b14 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b14 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_b15() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_b15 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_b15 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c0() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c0 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c0 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c1() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c1 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c1 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c2() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c2 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c2 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c3() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c3 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c3 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c4() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c4 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c4 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c5() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c5 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c5 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c6() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c6 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c6 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c7() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c7 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c7 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c8() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c8 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c8 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c9() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c9 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c9 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c10() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c10 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c10 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c11() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c11 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c11 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c12() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c12 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c12 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c13() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c13 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c13 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c14() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c14 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c14 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_c15() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_c15 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_c15 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d0() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d0 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d0 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d1() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d1 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d1 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d2() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d2 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d2 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d3() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d3 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d3 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d4() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d4 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d4 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d5() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d5 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d5 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d6() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d6 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d6 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d7() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d7 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d7 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d8() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d8 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d8 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d9() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d9 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d9 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d10() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d10 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d10 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d11() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d11 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d11 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d12() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d12 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d12 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d13() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d13 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d13 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d14() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d14 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d14 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() ret void } define internal void @non_dead_d15() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@non_dead_d15 -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@non_dead_d15 -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() @@ -2101,16 +2101,16 @@ } define internal void @useless_arg_sink(i32* %a) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@useless_arg_sink -; TUNIT-SAME: () #[[ATTR10]] { -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@useless_arg_sink -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @sink() @@ -2118,16 +2118,16 @@ } define internal void @useless_arg_almost_sink(i32* %a) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@useless_arg_almost_sink -; TUNIT-SAME: () #[[ATTR10]] { +; TUNIT-SAME: () #[[ATTR11]] { ; TUNIT-NEXT: call void @useless_arg_sink() #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@useless_arg_almost_sink -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: call void @useless_arg_sink() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: call void @useless_arg_sink() #[[ATTR16]] ; CGSCC-NEXT: ret void ; call void @useless_arg_sink(i32* %a) @@ -2168,30 +2168,30 @@ ; FIXME: We should fold terminators. define internal i32 @switch_default(i64 %i) nounwind { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@switch_default -; TUNIT-SAME: () #[[ATTR10]] { +; TUNIT-SAME: () #[[ATTR11]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: switch i64 0, label [[SW_DEFAULT:%.*]] [ ; TUNIT-NEXT: i64 3, label [[RETURN:%.*]] ; TUNIT-NEXT: i64 10, label [[RETURN]] ; TUNIT-NEXT: ] ; TUNIT: sw.default: -; TUNIT-NEXT: call void @sink() #[[ATTR13]] +; TUNIT-NEXT: call void @sink() #[[ATTR14]] ; TUNIT-NEXT: ret i32 undef ; TUNIT: return: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@switch_default -; CGSCC-SAME: () #[[ATTR12]] { +; CGSCC-SAME: () #[[ATTR13]] { ; CGSCC-NEXT: entry: ; CGSCC-NEXT: switch i64 0, label [[SW_DEFAULT:%.*]] [ ; CGSCC-NEXT: i64 3, label [[RETURN:%.*]] ; CGSCC-NEXT: i64 10, label [[RETURN]] ; CGSCC-NEXT: ] ; CGSCC: sw.default: -; CGSCC-NEXT: call void @sink() #[[ATTR15]] +; CGSCC-NEXT: call void @sink() #[[ATTR16]] ; CGSCC-NEXT: ret i32 123 ; CGSCC: return: ; CGSCC-NEXT: unreachable @@ -2211,16 +2211,16 @@ } define i32 @switch_default_caller() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@switch_default_caller -; TUNIT-SAME: () #[[ATTR10]] { +; TUNIT-SAME: () #[[ATTR11]] { ; TUNIT-NEXT: [[CALL2:%.*]] = tail call i32 @switch_default() #[[ATTR10]] ; TUNIT-NEXT: ret i32 123 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@switch_default_caller -; CGSCC-SAME: () #[[ATTR12]] { -; CGSCC-NEXT: [[CALL2:%.*]] = tail call noundef i32 @switch_default() #[[ATTR15]] +; CGSCC-SAME: () #[[ATTR13]] { +; CGSCC-NEXT: [[CALL2:%.*]] = tail call noundef i32 @switch_default() #[[ATTR16]] ; CGSCC-NEXT: ret i32 [[CALL2]] ; %call2 = tail call i32 @switch_default(i64 0) @@ -2228,7 +2228,7 @@ } define internal i32 @switch_default_dead(i64 %i) nounwind { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@switch_default_dead ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: entry: @@ -2255,15 +2255,15 @@ } define i32 @switch_default_dead_caller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@switch_default_dead_caller -; TUNIT-SAME: () #[[ATTR11:[0-9]+]] { +; TUNIT-SAME: () #[[ATTR12:[0-9]+]] { ; TUNIT-NEXT: ret i32 123 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@switch_default_dead_caller ; CGSCC-SAME: () #[[ATTR11]] { -; CGSCC-NEXT: [[CALL2:%.*]] = tail call noundef i32 @switch_default_dead() #[[ATTR16:[0-9]+]] +; CGSCC-NEXT: [[CALL2:%.*]] = tail call noundef i32 @switch_default_dead() #[[ATTR17:[0-9]+]] ; CGSCC-NEXT: ret i32 [[CALL2]] ; %call2 = tail call i32 @switch_default_dead(i64 0) @@ -2391,7 +2391,7 @@ define internal void @dead_with_blockaddress_users(i32* nocapture %pc) nounwind readonly { ; CGSCC: Function Attrs: nounwind memory(read) ; CGSCC-LABEL: define {{[^@]+}}@dead_with_blockaddress_users -; CGSCC-SAME: (i32* nocapture [[PC:%.*]]) #[[ATTR13:[0-9]+]] { +; CGSCC-SAME: (i32* nocapture [[PC:%.*]]) #[[ATTR14:[0-9]+]] { ; CGSCC-NEXT: entry: ; CGSCC-NEXT: br label [[INDIRECTGOTO:%.*]] ; CGSCC: lab0: @@ -2499,12 +2499,12 @@ declare noalias i8* @malloc(i64) define i32 @h(i32 %i) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@h -; TUNIT-SAME: (i32 [[I:%.*]]) #[[ATTR11]] { +; TUNIT-SAME: (i32 [[I:%.*]]) #[[ATTR12]] { ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@h ; CGSCC-SAME: (i32 [[I:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: ret i32 0 @@ -2518,13 +2518,13 @@ @p = global i8 0 define void @bad_gep() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@bad_gep -; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-SAME: () #[[ATTR12]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[N:%.*]] = alloca i8, align 1 ; TUNIT-NEXT: [[M:%.*]] = alloca i8, align 1 -; TUNIT-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR14:[0-9]+]] +; TUNIT-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR15:[0-9]+]] ; TUNIT-NEXT: br label [[EXIT:%.*]] ; TUNIT: while.body: ; TUNIT-NEXT: unreachable @@ -2533,16 +2533,16 @@ ; TUNIT: if.end: ; TUNIT-NEXT: unreachable ; TUNIT: exit: -; TUNIT-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR14]] +; TUNIT-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR15]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@bad_gep ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: entry: ; CGSCC-NEXT: [[N:%.*]] = alloca i8, align 1 ; CGSCC-NEXT: [[M:%.*]] = alloca i8, align 1 -; CGSCC-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR16]] +; CGSCC-NEXT: call void @llvm.lifetime.start.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR17]] ; CGSCC-NEXT: br label [[EXIT:%.*]] ; CGSCC: while.body: ; CGSCC-NEXT: unreachable @@ -2551,7 +2551,7 @@ ; CGSCC: if.end: ; CGSCC-NEXT: unreachable ; CGSCC: exit: -; CGSCC-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR16]] +; CGSCC-NEXT: call void @llvm.lifetime.end.p0i8(i64 noundef 1, i8* noalias nocapture nofree noundef nonnull dereferenceable(1) [[N]]) #[[ATTR17]] ; CGSCC-NEXT: ret void ; entry: @@ -2580,9 +2580,9 @@ } define i8 @edge_vs_block_liveness() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@edge_vs_block_liveness -; TUNIT-SAME: () #[[ATTR11]] { +; TUNIT-SAME: () #[[ATTR12]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: br i1 true, label [[B1:%.*]], label [[B2:%.*]] ; TUNIT: b1: @@ -2591,7 +2591,7 @@ ; TUNIT-NEXT: [[PHI:%.*]] = phi i8 [ 0, [[ENTRY:%.*]] ], [ 1, [[B1]] ] ; TUNIT-NEXT: ret i8 1 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@edge_vs_block_liveness ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: entry: @@ -2623,15 +2623,16 @@ ; TUNIT: attributes #[[ATTR3]] = { noreturn nounwind } ; TUNIT: attributes #[[ATTR4]] = { noreturn } ; TUNIT: attributes #[[ATTR5]] = { nosync memory(none) } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } -; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR8]] = { nofree norecurse noreturn nosync nounwind memory(none) } -; TUNIT: attributes #[[ATTR9]] = { nofree nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR10]] = { nofree nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR11]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR12:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR13]] = { nounwind willreturn } -; TUNIT: attributes #[[ATTR14]] = { willreturn } +; TUNIT: attributes #[[ATTR11]] = { mustprogress nofree nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR12]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR13:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR14]] = { nounwind willreturn } +; TUNIT: attributes #[[ATTR15]] = { willreturn } ;. ; CGSCC: attributes #[[ATTR0]] = { nofree noreturn nosync nounwind } ; CGSCC: attributes #[[ATTR1:[0-9]+]] = { memory(none) } @@ -2639,15 +2640,16 @@ ; CGSCC: attributes #[[ATTR3]] = { noreturn nounwind } ; CGSCC: attributes #[[ATTR4]] = { noreturn } ; CGSCC: attributes #[[ATTR5]] = { nosync memory(none) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR7]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } -; CGSCC: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } +; CGSCC: attributes #[[ATTR8]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR10]] = { nofree norecurse noreturn nosync nounwind memory(none) } -; CGSCC: attributes #[[ATTR11]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR12]] = { nofree nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR13]] = { nounwind memory(read) } -; CGSCC: attributes #[[ATTR14:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR15]] = { nounwind willreturn } -; CGSCC: attributes #[[ATTR16]] = { willreturn } +; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR12:[0-9]+]] = { nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR13]] = { mustprogress nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR14]] = { nounwind memory(read) } +; CGSCC: attributes #[[ATTR15:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR16]] = { nounwind willreturn } +; CGSCC: attributes #[[ATTR17]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/liveness_chains.ll b/llvm/test/Transforms/Attributor/liveness_chains.ll --- a/llvm/test/Transforms/Attributor/liveness_chains.ll +++ b/llvm/test/Transforms/Attributor/liveness_chains.ll @@ -7,7 +7,7 @@ declare i32 @source() nounwind readonly define i32 @chain_dead(i32 %arg) { -; CHECK: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@chain_dead ; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: ret i32 0 @@ -58,7 +58,7 @@ } ;. ; CHECK: attributes #[[ATTR0]] = { nounwind memory(read) } -; CHECK: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CHECK: attributes #[[ATTR2]] = { nounwind } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll b/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll --- a/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll +++ b/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define i8 @test1(i32 %a, i32 %length) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test1 ; CHECK-SAME: (i32 [[A:%.*]], i32 [[LENGTH:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -37,7 +37,7 @@ } define i8 @test2(i32 %n) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (i32 [[N:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -185,7 +185,7 @@ declare void @dummy(i1) nounwind declare void @llvm.experimental.guard(i1, ...) ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CHECK: attributes #[[ATTR1:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ; CHECK: attributes #[[ATTR2]] = { nounwind } ; CHECK: attributes #[[ATTR3:[0-9]+]] = { nocallback nofree nosync willreturn } diff --git a/llvm/test/Transforms/Attributor/lvi-for-ashr.ll b/llvm/test/Transforms/Attributor/lvi-for-ashr.ll --- a/llvm/test/Transforms/Attributor/lvi-for-ashr.ll +++ b/llvm/test/Transforms/Attributor/lvi-for-ashr.ll @@ -5,7 +5,7 @@ ; FIXME: DOT should be replaced with 3 define i32 @test-ashr(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test-ashr ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: chk65: @@ -49,7 +49,7 @@ ret i32 %retval } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/memory_locations.ll b/llvm/test/Transforms/Attributor/memory_locations.ll --- a/llvm/test/Transforms/Attributor/memory_locations.ll +++ b/llvm/test/Transforms/Attributor/memory_locations.ll @@ -388,7 +388,7 @@ } define void @callerE(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@callerE ; CHECK-SAME: (ptr nocapture nofree readnone [[ARG:%.*]]) #[[ATTR5:[0-9]+]] { ; CHECK-NEXT: ret void @@ -399,7 +399,7 @@ define void @write_global() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@write_global ; CHECK-SAME: () #[[ATTR6:[0-9]+]] { ; CHECK-NEXT: store i32 0, ptr @G, align 4 @@ -409,7 +409,7 @@ ret void } define void @write_global_via_arg(ptr %GPtr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@write_global_via_arg ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[GPTR:%.*]]) #[[ATTR7:[0-9]+]] { ; CHECK-NEXT: store i32 0, ptr [[GPTR]], align 4 @@ -419,7 +419,7 @@ ret void } define internal void @write_global_via_arg_internal(ptr %GPtr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@write_global_via_arg_internal ; CHECK-SAME: () #[[ATTR6]] { ; CHECK-NEXT: store i32 0, ptr @G, align 4 @@ -430,13 +430,13 @@ } define void @writeonly_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@writeonly_global ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: call void @write_global() #[[ATTR10:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@writeonly_global ; CGSCC-SAME: () #[[ATTR8:[0-9]+]] { ; CGSCC-NEXT: call void @write_global() #[[ATTR11:[0-9]+]] @@ -446,13 +446,13 @@ ret void } define void @writeonly_global_via_arg() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@writeonly_global_via_arg ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: call void @write_global_via_arg(ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) @G) #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@writeonly_global_via_arg ; CGSCC-SAME: () #[[ATTR8]] { ; CGSCC-NEXT: call void @write_global_via_arg(ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) @G) #[[ATTR11]] @@ -464,13 +464,13 @@ define void @writeonly_global_via_arg_internal() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@writeonly_global_via_arg_internal ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: call void @write_global_via_arg_internal() #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@writeonly_global_via_arg_internal ; CGSCC-SAME: () #[[ATTR8]] { ; CGSCC-NEXT: call void @write_global_via_arg_internal() #[[ATTR11]] @@ -682,7 +682,7 @@ } define internal void @argmemonly_before_ipconstprop(ptr %p) argmemonly { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@argmemonly_before_ipconstprop ; CHECK-SAME: () #[[ATTR6]] { ; CHECK-NEXT: store i32 0, ptr @G, align 4 @@ -693,13 +693,13 @@ } define void @argmemonky_caller() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@argmemonky_caller ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: call void @argmemonly_before_ipconstprop() #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@argmemonky_caller ; CGSCC-SAME: () #[[ATTR8]] { ; CGSCC-NEXT: call void @argmemonly_before_ipconstprop() #[[ATTR11]] @@ -714,9 +714,9 @@ ; TUNIT: attributes #[[ATTR2]] = { memory(none) } ; TUNIT: attributes #[[ATTR3]] = { memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR8]] = { nofree nosync nounwind memory(argmem: write) } ; TUNIT: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR10]] = { nofree nosync nounwind willreturn } @@ -727,10 +727,10 @@ ; CGSCC: attributes #[[ATTR2]] = { memory(none) } ; CGSCC: attributes #[[ATTR3]] = { memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR8]] = { nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR8]] = { mustprogress nofree nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR9]] = { nofree nosync nounwind memory(argmem: write) } ; CGSCC: attributes #[[ATTR10]] = { nofree nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR11]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/memory_locations_gpu.ll b/llvm/test/Transforms/Attributor/memory_locations_gpu.ll --- a/llvm/test/Transforms/Attributor/memory_locations_gpu.ll +++ b/llvm/test/Transforms/Attributor/memory_locations_gpu.ll @@ -15,7 +15,7 @@ ; CHECK: @[[G:[a-zA-Z0-9_$"\\.-]+]] = external dso_local addrspace(4) global i32, align 4 ;. define i32 @test_const_as_global1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test_const_as_global1 ; CHECK-SAME: () #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[L1:%.*]] = load i32, ptr addrspace(4) @G, align 4 @@ -26,7 +26,7 @@ } ; Should be memory(none) define i32 @test_const_as_global2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test_const_as_global2 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: [[L2:%.*]] = load i32, ptr addrspacecast (ptr addrspace(4) @G to ptr), align 4 @@ -98,7 +98,7 @@ } ;. ; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(none) } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CHECK: attributes #[[ATTR2]] = { nosync memory(read) } ; CHECK: attributes #[[ATTR3]] = { nosync memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/misc.ll b/llvm/test/Transforms/Attributor/misc.ll --- a/llvm/test/Transforms/Attributor/misc.ll +++ b/llvm/test/Transforms/Attributor/misc.ll @@ -85,7 +85,7 @@ define internal void @foo(ptr %a) { ; -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -100,10 +100,10 @@ declare void @callback1(ptr) declare void @callback2(ptr) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR1]] = { nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/misc_crash.ll b/llvm/test/Transforms/Attributor/misc_crash.ll --- a/llvm/test/Transforms/Attributor/misc_crash.ll +++ b/llvm/test/Transforms/Attributor/misc_crash.ll @@ -9,7 +9,7 @@ ; CHECK: @[[VAR2:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 0 ;. define i32 addrspace(1)* @foo(i32 addrspace(4)* %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (i32 addrspace(4)* nofree readnone [[ARG:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -22,7 +22,7 @@ } define i32* @func1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@func1 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret i32* getelementptr inbounds ([1 x i32], [1 x i32]* @var1, i32 0, i32 0) @@ -37,7 +37,7 @@ } define internal void @func2a(i32* %0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@func2a ; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: store i32 0, i32* @var2, align 4 @@ -118,7 +118,7 @@ ret i16 %call } define internal i16 @bar3(i16* %p1, i16 %p2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bar3 ; CHECK-SAME: (i16* nocapture nofree readnone [[P1:%.*]], i16 returned [[P2:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret i16 [[P2]] @@ -130,7 +130,7 @@ ; CHECK-SAME: (i8*) declare void @func6(i8*) ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; 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 } ;. diff --git a/llvm/test/Transforms/Attributor/multiple-offsets-pointer-info.ll b/llvm/test/Transforms/Attributor/multiple-offsets-pointer-info.ll --- a/llvm/test/Transforms/Attributor/multiple-offsets-pointer-info.ll +++ b/llvm/test/Transforms/Attributor/multiple-offsets-pointer-info.ll @@ -46,7 +46,7 @@ } define i8 @select_offsets_simplifiable_2(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_2 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -89,7 +89,7 @@ } define i8 @select_offsets_simplifiable_3(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_3 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -113,7 +113,7 @@ ; Similar to select_offsets_not_simplifiable_3 but with uninitialized memory. define i8 @select_offsets_simplifiable_4(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_simplifiable_4 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -135,7 +135,7 @@ } define i8 @select_offsets_not_simplifiable_1(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_1 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -160,7 +160,7 @@ } define i8 @select_offsets_not_simplifiable_2(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_2 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -237,7 +237,7 @@ } define i8 @select_offsets_not_simplifiable_5(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@select_offsets_not_simplifiable_5 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -267,7 +267,7 @@ } define i8 @select_gep_simplifiable_1(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@select_gep_simplifiable_1 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: entry: @@ -291,7 +291,7 @@ } define i8 @select_gep_not_simplifiable_1(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@select_gep_not_simplifiable_1 ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: entry: @@ -318,7 +318,7 @@ ; FIXME: The whole function is just "ret i8 21". define i8 @phi_gep_simplifiable_1(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@phi_gep_simplifiable_1 ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: entry: @@ -364,7 +364,7 @@ ; FIXME: The whole function is just "ret i8 42". define i8 @phi_gep_simplifiable_2(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@phi_gep_simplifiable_2 ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -405,7 +405,7 @@ } define i8 @phi_gep_not_simplifiable_1(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@phi_gep_not_simplifiable_1 ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: entry: @@ -481,7 +481,7 @@ } define i8 @phi_offsets(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@phi_offsets ; CHECK-SAME: (i1 noundef [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -517,9 +517,9 @@ ;. ; CHECK: attributes #[[ATTR0:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CHECK: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CHECK: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/noalias.ll b/llvm/test/Transforms/Attributor/noalias.ll --- a/llvm/test/Transforms/Attributor/noalias.ll +++ b/llvm/test/Transforms/Attributor/noalias.ll @@ -43,7 +43,7 @@ } define void @nocapture(ptr %a){ -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@nocapture ; CHECK-SAME: (ptr nocapture nofree readnone [[A:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret void @@ -157,7 +157,7 @@ ; Returning global pointer. Should not be noalias. define ptr @getter() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@getter ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret ptr @G @@ -167,12 +167,12 @@ ; Returning global pointer. Should not be noalias. define ptr @calle1(){ -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@calle1 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret ptr @G ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@calle1 ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: [[TMP1:%.*]] = call noundef nonnull align 8 dereferenceable(8) ptr @getter() #[[ATTR11:[0-9]+]] @@ -506,7 +506,7 @@ ; TEST 14 i2p casts define internal i32 @p2i(ptr %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@p2i ; CHECK-SAME: (ptr noalias nofree readnone [[ARG:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[P2I:%.*]] = ptrtoint ptr [[ARG]] to i32 @@ -517,7 +517,7 @@ } define i32 @i2p(ptr %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@i2p ; TUNIT-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: [[C:%.*]] = call i32 @p2i(ptr noalias nofree readnone [[ARG]]) #[[ATTR10:[0-9]+]] @@ -525,7 +525,7 @@ ; TUNIT-NEXT: [[CALL:%.*]] = call i32 @ret(ptr nocapture nofree readonly align 4 [[I2P]]) #[[ATTR10]] ; TUNIT-NEXT: ret i32 [[CALL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@i2p ; CGSCC-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: [[C:%.*]] = call i32 @p2i(ptr noalias nofree readnone [[ARG]]) #[[ATTR11]] @@ -539,13 +539,13 @@ ret i32 %call } define internal i32 @ret(ptr %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@ret ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: [[L:%.*]] = load i32, ptr [[ARG]], align 4 ; TUNIT-NEXT: ret i32 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@ret ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: [[L:%.*]] = load i32, ptr [[ARG]], align 4 @@ -632,13 +632,13 @@ @alias_of_p = external global ptr define void @make_alias(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@make_alias ; TUNIT-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR7:[0-9]+]] { ; TUNIT-NEXT: store ptr [[P]], ptr @alias_of_p, align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@make_alias ; CGSCC-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR8:[0-9]+]] { ; CGSCC-NEXT: store ptr [[P]], ptr @alias_of_p, align 8 @@ -649,13 +649,13 @@ } define void @only_store(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@only_store ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR8:[0-9]+]] { ; TUNIT-NEXT: store i32 0, ptr [[P]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@only_store ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR9:[0-9]+]] { ; CGSCC-NEXT: store i32 0, ptr [[P]], align 4 @@ -666,7 +666,7 @@ } define void @test15_caller(ptr noalias %p, i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test15_caller ; TUNIT-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[C]], 0 @@ -678,7 +678,7 @@ ; TUNIT-NEXT: tail call void @make_alias(ptr nofree writeonly [[P]]) #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test15_caller ; CGSCC-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[C]], 0 @@ -723,7 +723,7 @@ ; Therefore, only one of the two conditions of if statementes will be fulfilled. define internal void @test16_sub(ptr noalias %p, i32 %c1, i32 %c2) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test16_sub ; TUNIT-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C1:%.*]], i32 [[C2:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[C1]], 0 @@ -741,7 +741,7 @@ ; TUNIT: if.end3: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test16_sub ; CGSCC-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C1:%.*]], i32 [[C2:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[C1]], 0 @@ -780,13 +780,13 @@ } define void @test16_caller(ptr %p, i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test16_caller ; TUNIT-SAME: (ptr nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: tail call void @test16_sub(ptr noalias nofree writeonly [[P]], i32 [[C]], i32 [[C]]) #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test16_caller ; CGSCC-SAME: (ptr nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: tail call void @test16_sub(ptr noalias nofree writeonly [[P]], i32 [[C]], i32 [[C]]) #[[ATTR13]] @@ -816,7 +816,7 @@ ; } define void @test17_caller(ptr noalias %p, i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test17_caller ; TUNIT-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: entry: @@ -831,7 +831,7 @@ ; TUNIT: l3: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test17_caller ; CGSCC-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: entry: @@ -874,12 +874,12 @@ ; } define void @noreturn() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@noreturn ; TUNIT-SAME: () #[[ATTR9:[0-9]+]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@noreturn ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: ret void @@ -889,7 +889,7 @@ } define void @test18_caller(ptr noalias %p, i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test18_caller ; TUNIT-SAME: (ptr noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: entry: @@ -902,7 +902,7 @@ ; TUNIT-NEXT: tail call void @only_store(ptr nocapture nofree writeonly align 4 [[P]]) #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test18_caller ; CGSCC-SAME: (ptr noalias nofree nonnull writeonly align 4 dereferenceable(4) [[P:%.*]], i32 [[C:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: entry: @@ -929,30 +929,30 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { nounwind uwtable } ; TUNIT: attributes #[[ATTR2]] = { nounwind } ; TUNIT: attributes #[[ATTR3]] = { nounwind ssp uwtable } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR9]] = { nofree nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR8]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR10]] = { nofree nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR11]] = { willreturn memory(readwrite) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR1]] = { nounwind uwtable } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR3]] = { nounwind } ; CGSCC: attributes #[[ATTR4]] = { nounwind ssp uwtable } -; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; CGSCC: attributes #[[ATTR7:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR10]] = { nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR8]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR11]] = { willreturn } ; CGSCC: attributes #[[ATTR12]] = { willreturn memory(readwrite) } ; CGSCC: attributes #[[ATTR13]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/nocapture-1.ll b/llvm/test/Transforms/Attributor/nocapture-1.ll --- a/llvm/test/Transforms/Attributor/nocapture-1.ll +++ b/llvm/test/Transforms/Attributor/nocapture-1.ll @@ -11,7 +11,7 @@ ; CHECK: @[[G3:[a-zA-Z0-9_$"\\.-]+]] = global ptr null ;. define ptr @c1(ptr %q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@c1 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[Q:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret ptr [[Q]] @@ -21,7 +21,7 @@ ; It would also be acceptable to mark %q as readnone. Update @c3 too. define void @c2(ptr %q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@c2 ; CHECK-SAME: (ptr nofree writeonly [[Q:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: store ptr [[Q]], ptr @g, align 8 @@ -32,16 +32,16 @@ } define void @c3(ptr %q) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@c3 ; TUNIT-SAME: (ptr nofree writeonly [[Q:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: call void @c2(ptr nofree writeonly [[Q]]) #[[ATTR14:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@c3 ; CGSCC-SAME: (ptr nofree writeonly [[Q:%.*]]) #[[ATTR2:[0-9]+]] { -; CGSCC-NEXT: call void @c2(ptr nofree writeonly [[Q]]) #[[ATTR14:[0-9]+]] +; CGSCC-NEXT: call void @c2(ptr nofree writeonly [[Q]]) #[[ATTR17:[0-9]+]] ; CGSCC-NEXT: ret void ; call void @c2(ptr %q) @@ -49,7 +49,7 @@ } define i1 @c4(ptr %q, i32 %bitno) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@c4 ; CHECK-SAME: (ptr nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32 @@ -73,7 +73,7 @@ ; c4b is c4 but without the escaping part define i1 @c4b(ptr %q, i32 %bitno) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@c4b ; CHECK-SAME: (ptr nocapture nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32 @@ -98,7 +98,7 @@ @lookup_table = global [2 x i1] [ i1 0, i1 1 ] define i1 @c5(ptr %q, i32 %bitno) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@c5 ; TUNIT-SAME: (ptr nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32 @@ -108,7 +108,7 @@ ; TUNIT-NEXT: [[VAL:%.*]] = load i1, ptr [[LOOKUP]], align 1 ; TUNIT-NEXT: ret i1 [[VAL]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@c5 ; CGSCC-SAME: (ptr nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32 @@ -167,7 +167,7 @@ declare i32 @__gxx_personality_v0(...) define ptr @lookup_bit(ptr %q, i32 %bitno) readnone nounwind { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@lookup_bit ; CHECK-SAME: (ptr nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP:%.*]] = ptrtoint ptr [[Q]] to i32 @@ -184,17 +184,17 @@ } define i1 @c7(ptr %q, i32 %bitno) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@c7 ; TUNIT-SAME: (ptr nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[PTR:%.*]] = call ptr @lookup_bit(ptr noalias nofree readnone [[Q]], i32 [[BITNO]]) #[[ATTR15:[0-9]+]] ; TUNIT-NEXT: [[VAL:%.*]] = load i1, ptr [[PTR]], align 1 ; TUNIT-NEXT: ret i1 [[VAL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@c7 ; CGSCC-SAME: (ptr nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR5:[0-9]+]] { -; CGSCC-NEXT: [[PTR:%.*]] = call ptr @lookup_bit(ptr noalias nofree readnone [[Q]], i32 [[BITNO]]) #[[ATTR17:[0-9]+]] +; CGSCC-NEXT: [[PTR:%.*]] = call ptr @lookup_bit(ptr noalias nofree readnone [[Q]], i32 [[BITNO]]) #[[ATTR18:[0-9]+]] ; CGSCC-NEXT: [[VAL:%.*]] = load i1, ptr [[PTR]], align 1 ; CGSCC-NEXT: ret i1 [[VAL]] ; @@ -205,7 +205,7 @@ define i32 @nc1(ptr %q, ptr %p, i1 %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nc1 ; TUNIT-SAME: (ptr nofree [[Q:%.*]], ptr nocapture nofree [[P:%.*]], i1 [[B:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: e: @@ -219,7 +219,7 @@ ; TUNIT-NEXT: store ptr [[Q]], ptr @g, align 8 ; TUNIT-NEXT: ret i32 [[VAL]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nc1 ; CGSCC-SAME: (ptr nofree [[Q:%.*]], ptr nocapture nofree [[P:%.*]], i1 [[B:%.*]]) #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: e: @@ -246,7 +246,7 @@ } define i32 @nc1_addrspace(ptr %q, ptr addrspace(1) %p, i1 %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nc1_addrspace ; TUNIT-SAME: (ptr nofree [[Q:%.*]], ptr addrspace(1) nocapture nofree [[P:%.*]], i1 [[B:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: e: @@ -261,7 +261,7 @@ ; TUNIT-NEXT: store ptr [[Q]], ptr @g, align 8 ; TUNIT-NEXT: ret i32 [[VAL]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nc1_addrspace ; CGSCC-SAME: (ptr nofree [[Q:%.*]], ptr addrspace(1) nocapture nofree [[P:%.*]], i1 [[B:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: e: @@ -290,16 +290,16 @@ } define void @nc2(ptr %p, ptr %q) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nc2 ; TUNIT-SAME: (ptr nocapture nofree [[P:%.*]], ptr nofree [[Q:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[TMP1:%.*]] = call i32 @nc1(ptr nofree [[Q]], ptr nocapture nofree [[P]], i1 noundef false) #[[ATTR14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nc2 ; CGSCC-SAME: (ptr nocapture nofree align 4 [[P:%.*]], ptr nofree [[Q:%.*]]) #[[ATTR7:[0-9]+]] { -; CGSCC-NEXT: [[TMP1:%.*]] = call i32 @nc1(ptr nofree [[Q]], ptr nocapture nofree align 4 [[P]], i1 noundef false) #[[ATTR14]] +; CGSCC-NEXT: [[TMP1:%.*]] = call i32 @nc1(ptr nofree [[Q]], ptr nocapture nofree align 4 [[P]], i1 noundef false) #[[ATTR17]] ; CGSCC-NEXT: ret void ; %1 = call i32 @nc1(ptr %q, ptr %p, i1 0) ; [#uses=0] @@ -330,7 +330,7 @@ ; CGSCC: Function Attrs: nounwind memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@nc4 ; CGSCC-SAME: (ptr [[P:%.*]]) #[[ATTR8:[0-9]+]] { -; CGSCC-NEXT: call void @external(ptr readonly [[P]]) #[[ATTR18:[0-9]+]] +; CGSCC-NEXT: call void @external(ptr readonly [[P]]) #[[ATTR19:[0-9]+]] ; CGSCC-NEXT: ret void ; call void @external(ptr %p) @@ -360,7 +360,7 @@ ; CGSCC: Function Attrs: nofree nosync nounwind memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test1_1 ; CGSCC-SAME: (ptr nocapture nofree readnone [[X1_1:%.*]], ptr nocapture nofree readnone [[Y1_1:%.*]], i1 [[C:%.*]]) #[[ATTR9:[0-9]+]] { -; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @test1_2(ptr noalias nocapture nofree readnone undef, ptr noalias nofree readnone "no-capture-maybe-returned" [[Y1_1]], i1 [[C]]) #[[ATTR19:[0-9]+]] +; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @test1_2(ptr noalias nocapture nofree readnone undef, ptr noalias nofree readnone "no-capture-maybe-returned" [[Y1_1]], i1 [[C]]) #[[ATTR20:[0-9]+]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: ret void ; @@ -386,7 +386,7 @@ ; CGSCC-SAME: (ptr nocapture nofree readnone [[X1_2:%.*]], ptr nofree readnone returned "no-capture-maybe-returned" [[Y1_2:%.*]], i1 noundef [[C:%.*]]) #[[ATTR9]] { ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] ; CGSCC: t: -; CGSCC-NEXT: call void @test1_1(ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone [[Y1_2]], i1 noundef [[C]]) #[[ATTR19]] +; CGSCC-NEXT: call void @test1_1(ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone [[Y1_2]], i1 noundef [[C]]) #[[ATTR20]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: br label [[F]] ; CGSCC: f: @@ -412,7 +412,7 @@ ; CGSCC: Function Attrs: nofree nosync nounwind memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test2 ; CGSCC-SAME: (ptr nocapture nofree readnone [[X2:%.*]]) #[[ATTR9]] { -; CGSCC-NEXT: call void @test2(ptr noalias nocapture nofree readnone undef) #[[ATTR19]] +; CGSCC-NEXT: call void @test2(ptr noalias nocapture nofree readnone undef) #[[ATTR20]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: ret void ; @@ -432,7 +432,7 @@ ; CGSCC: Function Attrs: nofree nosync nounwind memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test3 ; CGSCC-SAME: (ptr nocapture nofree readnone [[X3:%.*]], ptr nocapture nofree readnone [[Y3:%.*]], ptr nocapture nofree readnone [[Z3:%.*]]) #[[ATTR9]] { -; CGSCC-NEXT: call void @test3(ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone undef) #[[ATTR19]] +; CGSCC-NEXT: call void @test3(ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone undef, ptr noalias nocapture nofree readnone undef) #[[ATTR20]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: ret void ; @@ -452,7 +452,7 @@ ; CGSCC: Function Attrs: nofree nosync nounwind memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test4_1 ; CGSCC-SAME: (ptr nocapture nofree readnone [[X4_1:%.*]], i1 [[C:%.*]]) #[[ATTR9]] { -; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @test4_2(ptr noalias nocapture nofree readnone undef, ptr noalias nofree readnone "no-capture-maybe-returned" [[X4_1]], ptr noalias nocapture nofree readnone undef, i1 [[C]]) #[[ATTR19]] +; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @test4_2(ptr noalias nocapture nofree readnone undef, ptr noalias nofree readnone "no-capture-maybe-returned" [[X4_1]], ptr noalias nocapture nofree readnone undef, i1 [[C]]) #[[ATTR20]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: ret void ; @@ -478,7 +478,7 @@ ; CGSCC-SAME: (ptr nocapture nofree readnone [[X4_2:%.*]], ptr nofree readnone returned "no-capture-maybe-returned" [[Y4_2:%.*]], ptr nocapture nofree readnone [[Z4_2:%.*]], i1 noundef [[C:%.*]]) #[[ATTR9]] { ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] ; CGSCC: t: -; CGSCC-NEXT: call void @test4_1(ptr noalias nocapture nofree noundef readnone align 4294967296 null, i1 noundef [[C]]) #[[ATTR19]] +; CGSCC-NEXT: call void @test4_1(ptr noalias nocapture nofree noundef readnone align 4294967296 null, i1 noundef [[C]]) #[[ATTR20]] ; CGSCC-NEXT: store ptr null, ptr @g, align 8 ; CGSCC-NEXT: br label [[F]] ; CGSCC: f: @@ -522,13 +522,13 @@ } define void @test_cmpxchg(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test_cmpxchg ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(4) [[P:%.*]]) #[[ATTR7:[0-9]+]] { ; TUNIT-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[P]], i32 0, i32 1 acquire monotonic, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test_cmpxchg ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(4) [[P:%.*]]) #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[P]], i32 0, i32 1 acquire monotonic, align 4 @@ -539,13 +539,13 @@ } define void @test_cmpxchg_ptr(ptr %p, ptr %q) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test_cmpxchg_ptr ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(8) [[P:%.*]], ptr nofree [[Q:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[P]], ptr null, ptr [[Q]] acquire monotonic, align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test_cmpxchg_ptr ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(8) [[P:%.*]], ptr nofree [[Q:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: [[TMP1:%.*]] = cmpxchg ptr [[P]], ptr null, ptr [[Q]] acquire monotonic, align 8 @@ -556,13 +556,13 @@ } define void @test_atomicrmw(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test_atomicrmw ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(4) [[P:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[P]], i32 1 seq_cst, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test_atomicrmw ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull dereferenceable(4) [[P:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: [[TMP1:%.*]] = atomicrmw add ptr [[P]], i32 1 seq_cst, align 4 @@ -573,7 +573,7 @@ } define void @test_volatile(ptr %x) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@test_volatile ; TUNIT-SAME: (ptr nofree align 4 [[X:%.*]]) #[[ATTR7]] { ; TUNIT-NEXT: entry: @@ -581,7 +581,7 @@ ; TUNIT-NEXT: store volatile i32 0, ptr [[GEP]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@test_volatile ; CGSCC-SAME: (ptr nofree align 4 [[X:%.*]]) #[[ATTR10]] { ; CGSCC-NEXT: entry: @@ -596,7 +596,7 @@ } define void @nocaptureLaunder(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nocaptureLaunder ; TUNIT-SAME: (ptr nocapture nofree [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: entry: @@ -604,11 +604,11 @@ ; TUNIT-NEXT: store i8 42, ptr [[B]], align 1 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nocaptureLaunder ; CGSCC-SAME: (ptr nocapture nofree [[P:%.*]]) #[[ATTR6]] { ; CGSCC-NEXT: entry: -; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr nofree [[P]]) #[[ATTR17]] +; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr nofree [[P]]) #[[ATTR18]] ; CGSCC-NEXT: store i8 42, ptr [[B]], align 1 ; CGSCC-NEXT: ret void ; @@ -620,17 +620,17 @@ @g2 = global ptr null define void @captureLaunder(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@captureLaunder ; TUNIT-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr nofree [[P]]) #[[ATTR18]] ; TUNIT-NEXT: store ptr [[B]], ptr @g2, align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@captureLaunder ; CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR6]] { -; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr nofree [[P]]) #[[ATTR17]] +; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr nofree [[P]]) #[[ATTR18]] ; CGSCC-NEXT: store ptr [[B]], ptr @g2, align 8 ; CGSCC-NEXT: ret void ; @@ -640,21 +640,13 @@ } define void @nocaptureStrip(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) -; TUNIT-LABEL: define {{[^@]+}}@nocaptureStrip -; TUNIT-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR1]] { -; TUNIT-NEXT: entry: -; TUNIT-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR18]] -; TUNIT-NEXT: store i8 42, ptr [[B]], align 1 -; TUNIT-NEXT: ret void -; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) -; CGSCC-LABEL: define {{[^@]+}}@nocaptureStrip -; CGSCC-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR1]] { -; CGSCC-NEXT: entry: -; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR17]] -; CGSCC-NEXT: store i8 42, ptr [[B]], align 1 -; CGSCC-NEXT: ret void +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) +; CHECK-LABEL: define {{[^@]+}}@nocaptureStrip +; CHECK-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR1]] { +; CHECK-NEXT: entry: +; CHECK-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR18:[0-9]+]] +; CHECK-NEXT: store i8 42, ptr [[B]], align 1 +; CHECK-NEXT: ret void ; entry: %b = call ptr @llvm.strip.invariant.group.p0(ptr %p) @@ -664,19 +656,12 @@ @g3 = global ptr null define void @captureStrip(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) -; TUNIT-LABEL: define {{[^@]+}}@captureStrip -; TUNIT-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] { -; TUNIT-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR18]] -; TUNIT-NEXT: store ptr [[B]], ptr @g3, align 8 -; TUNIT-NEXT: ret void -; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) -; CGSCC-LABEL: define {{[^@]+}}@captureStrip -; CGSCC-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] { -; CGSCC-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR17]] -; CGSCC-NEXT: store ptr [[B]], ptr @g3, align 8 -; CGSCC-NEXT: ret void +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) +; CHECK-LABEL: define {{[^@]+}}@captureStrip +; CHECK-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] { +; CHECK-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr noalias nofree readnone [[P]]) #[[ATTR18]] +; CHECK-NEXT: store ptr [[B]], ptr @g3, align 8 +; CHECK-NEXT: ret void ; %b = call ptr @llvm.strip.invariant.group.p0(ptr %p) store ptr %b, ptr @g3 @@ -684,7 +669,7 @@ } define i1 @captureICmp(ptr %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@captureICmp ; CHECK-SAME: (ptr nofree readnone [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq ptr [[X]], null @@ -695,7 +680,7 @@ } define i1 @captureICmpRev(ptr %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@captureICmpRev ; CHECK-SAME: (ptr nofree readnone [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq ptr null, [[X]] @@ -706,7 +691,7 @@ } define i1 @nocaptureInboundsGEPICmp(ptr %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@nocaptureInboundsGEPICmp ; CHECK-SAME: (ptr nocapture nofree readnone [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret i1 false @@ -717,7 +702,7 @@ } define i1 @nocaptureInboundsGEPICmpRev(ptr %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@nocaptureInboundsGEPICmpRev ; CHECK-SAME: (ptr nocapture nofree readnone [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret i1 true @@ -728,7 +713,7 @@ } define i1 @nocaptureDereferenceableOrNullICmp(ptr dereferenceable_or_null(4) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@nocaptureDereferenceableOrNullICmp ; CHECK-SAME: (ptr nocapture nofree noundef readnone dereferenceable_or_null(4) [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = icmp eq ptr [[X]], null @@ -739,13 +724,13 @@ } define i1 @captureDereferenceableOrNullICmp(ptr dereferenceable_or_null(4) %x) null_pointer_is_valid { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@captureDereferenceableOrNullICmp ; TUNIT-SAME: (ptr nofree noundef readnone dereferenceable_or_null(4) [[X:%.*]]) #[[ATTR8:[0-9]+]] { ; TUNIT-NEXT: [[TMP1:%.*]] = icmp eq ptr [[X]], null ; TUNIT-NEXT: ret i1 [[TMP1]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@captureDereferenceableOrNullICmp ; CGSCC-SAME: (ptr nofree noundef readnone dereferenceable_or_null(4) [[X:%.*]]) #[[ATTR11:[0-9]+]] { ; CGSCC-NEXT: [[TMP1:%.*]] = icmp eq ptr [[X]], null @@ -815,15 +800,15 @@ ; FIXME: Both pointers should be nocapture define void @ptr_uses(ptr %ptr, ptr %wptr) { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@ptr_uses ; TUNIT-SAME: (ptr [[PTR:%.*]], ptr nocapture nofree noundef nonnull writeonly dereferenceable(1) [[WPTR:%.*]]) #[[ATTR11:[0-9]+]] { ; TUNIT-NEXT: store i8 0, ptr [[WPTR]], align 1 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@ptr_uses -; CGSCC-SAME: (ptr [[PTR:%.*]], ptr nocapture nofree noundef nonnull writeonly dereferenceable(1) [[WPTR:%.*]]) #[[ATTR14]] { +; CGSCC-SAME: (ptr [[PTR:%.*]], ptr nocapture nofree noundef nonnull writeonly dereferenceable(1) [[WPTR:%.*]]) #[[ATTR14:[0-9]+]] { ; CGSCC-NEXT: store i8 0, ptr [[WPTR]], align 1 ; CGSCC-NEXT: ret void ; @@ -837,18 +822,18 @@ declare ptr @llvm.launder.invariant.group.p0(ptr) declare ptr @llvm.strip.invariant.group.p0(ptr) ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; TUNIT: attributes #[[ATTR3]] = { memory(read) } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR5]] = { nounwind memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR6]] = { nofree nosync nounwind memory(write) } -; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR8]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } ; TUNIT: attributes #[[ATTR9]] = { nounwind memory(read) } ; TUNIT: attributes #[[ATTR10:[0-9]+]] = { nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR11]] = { nounwind willreturn } +; TUNIT: attributes #[[ATTR11]] = { mustprogress nounwind willreturn } ; TUNIT: attributes #[[ATTR12:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) } ; TUNIT: attributes #[[ATTR13:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; TUNIT: attributes #[[ATTR14]] = { nofree nosync nounwind willreturn } @@ -857,24 +842,25 @@ ; TUNIT: attributes #[[ATTR17]] = { nofree nosync nounwind } ; TUNIT: attributes #[[ATTR18]] = { willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; CGSCC: attributes #[[ATTR4]] = { memory(read) } -; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR8]] = { nounwind memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR9]] = { nofree nosync nounwind memory(write) } -; CGSCC: attributes #[[ATTR10]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR11]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } ; CGSCC: attributes #[[ATTR12]] = { nounwind memory(read) } ; CGSCC: attributes #[[ATTR13:[0-9]+]] = { nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR14]] = { nounwind willreturn } +; CGSCC: attributes #[[ATTR14]] = { mustprogress nounwind willreturn } ; CGSCC: attributes #[[ATTR15:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) } ; CGSCC: attributes #[[ATTR16:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } -; CGSCC: attributes #[[ATTR17]] = { willreturn } -; CGSCC: attributes #[[ATTR18]] = { nounwind } -; CGSCC: attributes #[[ATTR19]] = { nofree nosync nounwind } +; CGSCC: attributes #[[ATTR17]] = { nounwind willreturn } +; CGSCC: attributes #[[ATTR18]] = { willreturn } +; CGSCC: attributes #[[ATTR19]] = { nounwind } +; CGSCC: attributes #[[ATTR20]] = { nofree nosync nounwind } ;. diff --git a/llvm/test/Transforms/Attributor/nocapture-2.ll b/llvm/test/Transforms/Attributor/nocapture-2.ll --- a/llvm/test/Transforms/Attributor/nocapture-2.ll +++ b/llvm/test/Transforms/Attributor/nocapture-2.ll @@ -16,7 +16,7 @@ ; ; no-capture is missing on %p because it is not dereferenceable define i32 @is_null_return(i32* %p) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@is_null_return ; CHECK-SAME: (i32* nofree readnone [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -42,7 +42,7 @@ ; ; no-capture is missing on %p because it is not dereferenceable define i32 @is_null_control(i32* %p) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@is_null_control ; CHECK-SAME: (i32* nofree [[P:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -99,7 +99,7 @@ ; } ; define double* @srec0(double* %a) #0 { -; CHECK: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@srec0 ; CHECK-SAME: (double* nocapture nofree readnone [[A:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -124,7 +124,7 @@ ; Other arguments are possible here due to the no-return behavior. ; define i32* @srec16(i32* %a) #0 { -; CHECK: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@srec16 ; CHECK-SAME: (i32* nocapture nofree readnone [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -428,7 +428,7 @@ ; ; There should *not* be a no-capture attribute on %a define i64* @not_captured_but_returned_0(i64* %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; CHECK-LABEL: define {{[^@]+}}@not_captured_but_returned_0 ; CHECK-SAME: (i64* nofree noundef nonnull returned writeonly align 8 dereferenceable(8) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: entry: @@ -449,7 +449,7 @@ ; ; There should *not* be a no-capture attribute on %a define i64* @not_captured_but_returned_1(i64* %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; CHECK-LABEL: define {{[^@]+}}@not_captured_but_returned_1 ; CHECK-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(16) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -471,7 +471,7 @@ ; } ; define void @test_not_captured_but_returned_calls(i64* %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@test_not_captured_but_returned_calls ; TUNIT-SAME: (i64* nocapture nofree writeonly align 8 [[A:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: entry: @@ -479,7 +479,7 @@ ; TUNIT-NEXT: [[CALL1:%.*]] = call i64* @not_captured_but_returned_1(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]]) #[[ATTR10]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@test_not_captured_but_returned_calls ; CGSCC-SAME: (i64* nofree noundef nonnull writeonly align 8 dereferenceable(16) [[A:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -501,14 +501,14 @@ ; ; There should *not* be a no-capture attribute on %a define i64* @negative_test_not_captured_but_returned_call_0a(i64* %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0a ; TUNIT-SAME: (i64* nofree returned writeonly align 8 "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]]) #[[ATTR10]] ; TUNIT-NEXT: ret i64* [[A]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0a ; CGSCC-SAME: (i64* nofree noundef nonnull writeonly align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -528,7 +528,7 @@ ; ; There should *not* be a no-capture attribute on %a define void @negative_test_not_captured_but_returned_call_0b(i64* %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0b ; TUNIT-SAME: (i64* nofree writeonly align 8 [[A:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: entry: @@ -537,7 +537,7 @@ ; TUNIT-NEXT: store i64 [[TMP0]], i64* [[A]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0b ; CGSCC-SAME: (i64* nofree noundef nonnull writeonly align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -561,14 +561,14 @@ ; ; There should *not* be a no-capture attribute on %a define i64* @negative_test_not_captured_but_returned_call_1a(i64* %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1a ; TUNIT-SAME: (i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[CALL:%.*]] = call noundef nonnull align 8 dereferenceable(8) i64* @not_captured_but_returned_1(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]]) #[[ATTR10]] ; TUNIT-NEXT: ret i64* [[CALL]] ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1a ; CGSCC-SAME: (i64* nofree noundef nonnull writeonly align 8 dereferenceable(16) [[A:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -588,7 +588,7 @@ ; ; There should *not* be a no-capture attribute on %a define void @negative_test_not_captured_but_returned_call_1b(i64* %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(write) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(write) uwtable ; TUNIT-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1b ; TUNIT-SAME: (i64* nofree writeonly align 8 [[A:%.*]]) #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -597,7 +597,7 @@ ; TUNIT-NEXT: store i64 [[TMP0]], i64* [[CALL]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(write) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(write) uwtable ; CGSCC-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1b ; CGSCC-SAME: (i64* nofree noundef nonnull writeonly align 8 dereferenceable(16) [[A:%.*]]) #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -826,12 +826,12 @@ attributes #0 = { noinline nounwind uwtable } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } -; TUNIT: attributes #[[ATTR1]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR3]] = { noinline nounwind uwtable } -; TUNIT: attributes #[[ATTR4]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } -; TUNIT: attributes #[[ATTR5]] = { nofree noinline norecurse nosync nounwind willreturn memory(write) uwtable } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(write) uwtable } ; TUNIT: attributes #[[ATTR6:[0-9]+]] = { memory(read) } ; TUNIT: attributes #[[ATTR7]] = { noinline nounwind memory(read) uwtable } ; TUNIT: attributes #[[ATTR8]] = { nounwind memory(read) } @@ -839,13 +839,13 @@ ; TUNIT: attributes #[[ATTR10]] = { nofree nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR11]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR3]] = { noinline nounwind uwtable } -; CGSCC: attributes #[[ATTR4]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } -; CGSCC: attributes #[[ATTR5]] = { nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable } -; CGSCC: attributes #[[ATTR6]] = { nofree noinline nosync nounwind willreturn memory(write) uwtable } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: write) uwtable } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree noinline nosync nounwind willreturn memory(argmem: write) uwtable } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree noinline nosync nounwind willreturn memory(write) uwtable } ; CGSCC: attributes #[[ATTR7:[0-9]+]] = { memory(read) } ; CGSCC: attributes #[[ATTR8]] = { noinline nounwind memory(read) uwtable } ; CGSCC: attributes #[[ATTR9]] = { nounwind memory(read) } diff --git a/llvm/test/Transforms/Attributor/nodelete.ll b/llvm/test/Transforms/Attributor/nodelete.ll --- a/llvm/test/Transforms/Attributor/nodelete.ll +++ b/llvm/test/Transforms/Attributor/nodelete.ll @@ -6,13 +6,13 @@ %"b" = type { i8 } define hidden i64 @f1() align 2 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@f1 ; TUNIT-SAME: () #[[ATTR0:[0-9]+]] align 2 { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret i64 undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: () #[[ATTR0:[0-9]+]] align 2 { ; CGSCC-NEXT: entry: @@ -27,7 +27,7 @@ } define internal i64 @f2(%"a"* %this) align 2 { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f2 ; CGSCC-SAME: () #[[ATTR0]] align 2 { ; CGSCC-NEXT: entry: @@ -43,7 +43,7 @@ } define internal void @f3(%"b"* %this) align 2 { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f3 ; CGSCC-SAME: () #[[ATTR0]] align 2 { ; CGSCC-NEXT: entry: @@ -58,7 +58,7 @@ } define internal i1 @f4(%"b"* %this) align 2 { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f4 ; CGSCC-SAME: () #[[ATTR0]] align 2 { ; CGSCC-NEXT: entry: @@ -73,7 +73,7 @@ } define internal %"a"* @f5(%"b"* %this) align 2 { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f5 ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] align 2 { ; CGSCC-NEXT: entry: @@ -87,10 +87,10 @@ ret %"a"* %0 } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: diff --git a/llvm/test/Transforms/Attributor/nofpclass.ll b/llvm/test/Transforms/Attributor/nofpclass.ll --- a/llvm/test/Transforms/Attributor/nofpclass.ll +++ b/llvm/test/Transforms/Attributor/nofpclass.ll @@ -129,7 +129,7 @@ ; Return a float trivially nofpclass(nan) (argument attribute) define float @return_nofpclass_nan_arg(float returned nofpclass(nan) %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @return_nofpclass_nan_arg ; CHECK-SAME: (float returned nofpclass(nan) [[P:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: ret float [[P]] @@ -147,7 +147,7 @@ } define float @returned_nnan_fadd(float %arg0, float %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_nnan_fadd ; CHECK-SAME: (float [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FADD:%.*]] = fadd nnan float [[ARG0]], [[ARG1]] @@ -220,12 +220,12 @@ } define float @mutually_recursive0(float %arg) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define nofpclass(all) float @mutually_recursive0 ; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: ret float undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define nofpclass(all) float @mutually_recursive0 ; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: ret float undef @@ -235,12 +235,12 @@ } define float @mutually_recursive1(float %arg) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define nofpclass(all) float @mutually_recursive1 ; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: ret float undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define nofpclass(all) float @mutually_recursive1 ; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: ret float undef @@ -363,7 +363,7 @@ } define internal float @only_nofpclass_inf_callers(float %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define internal float @only_nofpclass_inf_callers ; CHECK-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG]], [[ARG]] @@ -374,13 +374,13 @@ } define float @call_noinf_0(float nofpclass(inf) %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define float @call_noinf_0 ; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR14:[0-9]+]] ; TUNIT-NEXT: ret float [[RESULT]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define float @call_noinf_0 ; CGSCC-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR13]] @@ -391,13 +391,13 @@ } define float @call_noinf_1(float %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define float @call_noinf_1 ; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR14]] ; TUNIT-NEXT: ret float [[RESULT]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define float @call_noinf_1 ; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[RESULT:%.*]] = call float @only_nofpclass_inf_callers(float nofpclass(inf) [[ARG]]) #[[ATTR13]] @@ -409,7 +409,7 @@ ; TODO: Should be able to infer nofpclass(inf) on return define internal float @only_nofpclass_inf_return_users(float %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define internal float @only_nofpclass_inf_return_users ; CHECK-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG]], [[ARG]] @@ -420,13 +420,13 @@ } define float @call_noinf_return_0(float %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define nofpclass(inf) float @call_noinf_return_0 ; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR14]] ; TUNIT-NEXT: ret float [[RESULT]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define nofpclass(inf) float @call_noinf_return_0 ; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR13]] @@ -437,13 +437,13 @@ } define float @call_noinf_return_1(float %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define nofpclass(inf) float @call_noinf_return_1 ; TUNIT-SAME: (float [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR14]] ; TUNIT-NEXT: ret float [[RESULT]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define nofpclass(inf) float @call_noinf_return_1 ; CGSCC-SAME: (float [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[RESULT:%.*]] = call nofpclass(inf) float @only_nofpclass_inf_return_users(float [[ARG]]) #[[ATTR13]] @@ -651,7 +651,7 @@ } define float @returned_load(ptr %ptr) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define float @returned_load ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[PTR:%.*]]) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: [[LOAD:%.*]] = load float, ptr [[PTR]], align 4 @@ -662,7 +662,7 @@ } define float @pass_nofpclass_inf_through_memory(float nofpclass(inf) %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define float @pass_nofpclass_inf_through_memory ; TUNIT-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[ALLOCA:%.*]] = alloca float, align 4 @@ -670,7 +670,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = call float @returned_load(ptr noalias nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[ALLOCA]]) #[[ATTR14]] ; TUNIT-NEXT: ret float [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define float @pass_nofpclass_inf_through_memory ; CGSCC-SAME: (float nofpclass(inf) [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[ALLOCA:%.*]] = alloca float, align 4 @@ -685,7 +685,7 @@ } define float @returned_fabs(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR13]] @@ -696,7 +696,7 @@ } define float @returned_fabs_nosnan(float nofpclass(snan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(snan ninf nzero nsub nnorm) float @returned_fabs_nosnan ; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR13]] @@ -707,7 +707,7 @@ } define float @returned_fabs_noqnan(float nofpclass(qnan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(qnan ninf nzero nsub nnorm) float @returned_fabs_noqnan ; CHECK-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR13]] @@ -718,7 +718,7 @@ } define float @returned_fabs_nonan(float nofpclass(nan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nonan ; CHECK-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR13]] @@ -729,7 +729,7 @@ } define float @returned_fabs_noinf(float nofpclass(inf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf nzero nsub nnorm) float @returned_fabs_noinf ; CHECK-SAME: (float nofpclass(inf) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(inf) [[X]]) #[[ATTR13]] @@ -740,7 +740,7 @@ } define float @returned_fabs_nopos(float nofpclass(psub pnorm pinf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos ; CHECK-SAME: (float nofpclass(pinf psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf psub pnorm) [[X]]) #[[ATTR13]] @@ -751,7 +751,7 @@ } define float @returned_fabs_nopos_nopzero(float nofpclass(psub pnorm pinf pzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopos_nopzero ; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR13]] @@ -762,7 +762,7 @@ } define float @returned_fabs_nopos_nozero(float nofpclass(psub pnorm pinf zero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_nopos_nozero ; CHECK-SAME: (float nofpclass(pinf zero psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf zero psub pnorm) [[X]]) #[[ATTR13]] @@ -773,7 +773,7 @@ } define float @returned_fabs_nopos_nonan(float nofpclass(psub pnorm pinf nan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_nopos_nonan ; CHECK-SAME: (float nofpclass(nan pinf psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan pinf psub pnorm) [[X]]) #[[ATTR13]] @@ -784,7 +784,7 @@ } define float @returned_fabs_noneg(float nofpclass(nsub nnorm ninf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nsub nnorm) [[X]]) #[[ATTR13]] @@ -795,7 +795,7 @@ } define float @returned_fabs_noneg_nonzero(float nofpclass(nsub nnorm ninf nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_noneg_nonzero ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR13]] @@ -806,7 +806,7 @@ } define float @returned_fabs_noneg_nozero(float nofpclass(nsub nnorm ninf zero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf zero nsub nnorm) float @returned_fabs_noneg_nozero ; CHECK-SAME: (float nofpclass(ninf zero nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf zero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf zero nsub nnorm) [[X]]) #[[ATTR13]] @@ -817,7 +817,7 @@ } define float @returned_fabs_noneg_nonan(float nofpclass(nsub nnorm ninf nan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero nsub nnorm) float @returned_fabs_noneg_nonan ; CHECK-SAME: (float nofpclass(nan ninf nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan ninf nsub nnorm) [[X]]) #[[ATTR13]] @@ -828,7 +828,7 @@ } define float @returned_fabs_nonsub_nopnorm_nonzero(float nofpclass(nsub pnorm nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonsub_nopnorm_nonzero ; CHECK-SAME: (float nofpclass(nzero nsub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nsub pnorm) [[X]]) #[[ATTR13]] @@ -839,7 +839,7 @@ } define float @returned_fabs_nopsub_nonnorm_nopzero(float nofpclass(psub nnorm pzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nopsub_nonnorm_nopzero ; CHECK-SAME: (float nofpclass(pzero psub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pzero psub nnorm) [[X]]) #[[ATTR13]] @@ -850,7 +850,7 @@ } define float @returned_fabs_nonnorm_nozero(float nofpclass(nnorm nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fabs_nonnorm_nozero ; CHECK-SAME: (float nofpclass(nzero nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nzero nnorm) [[X]]) #[[ATTR13]] @@ -861,7 +861,7 @@ } define float @returned_fneg(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @returned_fneg ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -872,7 +872,7 @@ } define float @returned_fneg_nosnan(float nofpclass(snan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(snan) float @returned_fneg_nosnan ; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -883,7 +883,7 @@ } define float @returned_fneg_noqnan(float nofpclass(qnan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(qnan) float @returned_fneg_noqnan ; CHECK-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -894,7 +894,7 @@ } define float @returned_fneg_nosnan_ninf_flag(float nofpclass(snan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(snan inf) float @returned_fneg_nosnan_ninf_flag ; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg ninf float [[X]] @@ -905,7 +905,7 @@ } define float @returned_fneg_nonan(float nofpclass(nan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_fneg_nonan ; CHECK-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -916,7 +916,7 @@ } define float @returned_fneg_noinf(float nofpclass(inf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf) float @returned_fneg_noinf ; CHECK-SAME: (float nofpclass(inf) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -927,7 +927,7 @@ } define float @returned_fneg_noneg(float nofpclass(ninf nsub nnorm nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_noneg ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -938,7 +938,7 @@ } define float @returned_fneg_noneg_nnan_flag(float nofpclass(ninf nsub nnorm nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @returned_fneg_noneg_nnan_flag ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg nnan float [[X]] @@ -949,7 +949,7 @@ } define float @returned_fneg_nonsubnnorm(float nofpclass(nsub nnorm) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(psub pnorm) float @returned_fneg_nonsubnnorm ; CHECK-SAME: (float nofpclass(nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -960,7 +960,7 @@ } define float @returned_fneg_nopos(float nofpclass(pinf psub pnorm pzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(ninf nzero nsub nnorm) float @returned_fneg_nopos ; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -971,7 +971,7 @@ } define float @returned_fneg_nopnormpsub(float nofpclass(psub pnorm) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nsub nnorm) float @returned_fneg_nopnormpsub ; CHECK-SAME: (float nofpclass(psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -982,7 +982,7 @@ } define float @returned_fneg_mixed(float nofpclass(psub nnorm nzero qnan ninf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(qnan pinf pzero nsub pnorm) float @returned_fneg_mixed ; CHECK-SAME: (float nofpclass(qnan ninf nzero psub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FNEG:%.*]] = fneg float [[X]] @@ -993,7 +993,7 @@ } define float @returned_fneg_fabs(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR13]] @@ -1006,7 +1006,7 @@ } define float @returned_fneg_fabs_nosnan(float nofpclass(snan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(snan pinf pzero psub pnorm) float @returned_fneg_fabs_nosnan ; CHECK-SAME: (float nofpclass(snan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(snan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(snan) [[X]]) #[[ATTR13]] @@ -1019,7 +1019,7 @@ } define float @returned_fneg_fabs_noqnan(float nofpclass(qnan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_noqnan ; CHECK-SAME: (float nofpclass(qnan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan) [[X]]) #[[ATTR13]] @@ -1032,7 +1032,7 @@ } define float @returned_fneg_fabs_nonan(float nofpclass(nan) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan pinf pzero psub pnorm) float @returned_fneg_fabs_nonan ; CHECK-SAME: (float nofpclass(nan) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(nan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(nan) [[X]]) #[[ATTR13]] @@ -1045,7 +1045,7 @@ } define float @returned_fneg_fabs_noneg(float nofpclass(ninf nsub nnorm nzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_noneg ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(ninf nzero nsub nnorm) [[X]]) #[[ATTR13]] @@ -1058,7 +1058,7 @@ } define float @returned_fneg_fabs_nopos(float nofpclass(pinf psub pnorm pzero) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(pinf pzero psub pnorm) float @returned_fneg_fabs_nopos ; CHECK-SAME: (float nofpclass(pinf pzero psub pnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(pinf pzero psub pnorm) [[X]]) #[[ATTR13]] @@ -1071,7 +1071,7 @@ } define float @returned_fneg_fabs_mixed(float nofpclass(psub nnorm nzero qnan ninf) %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(qnan pinf pzero psub pnorm) float @returned_fneg_fabs_mixed ; CHECK-SAME: (float nofpclass(qnan ninf nzero psub nnorm) [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(qnan ninf nzero nsub nnorm) float @llvm.fabs.f32(float nofpclass(qnan ninf nzero psub nnorm) [[X]]) #[[ATTR13]] @@ -1084,7 +1084,7 @@ } define float @returned_fneg_fabs_ninf_flag_fabs(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fabs ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call ninf nofpclass(inf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR13]] @@ -1097,7 +1097,7 @@ } define float @returned_fneg_fabs_ninf_flag_fneg(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf pzero psub pnorm) float @returned_fneg_fabs_ninf_flag_fneg ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FABS:%.*]] = call nofpclass(ninf nzero nsub nnorm) float @llvm.fabs.f32(float [[X]]) #[[ATTR13]] @@ -1110,7 +1110,7 @@ } define float @uitofp_i32_to_f32(i32 %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) float @uitofp_i32_to_f32 ; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = uitofp i32 [[ARG]] to float @@ -1121,7 +1121,7 @@ } define float @sitofp_i32_to_f32(i32 %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan inf nzero sub) float @sitofp_i32_to_f32 ; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = sitofp i32 [[ARG]] to float @@ -1132,7 +1132,7 @@ } define <2 x float> @uitofp_v2i32_to_v2f32(<2 x i32> %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan inf nzero sub nnorm) <2 x float> @uitofp_v2i32_to_v2f32 ; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = uitofp <2 x i32> [[ARG]] to <2 x float> @@ -1143,7 +1143,7 @@ } define <2 x float> @sitofp_v2i32_to_v2i32(<2 x i32> %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan inf nzero sub) <2 x float> @sitofp_v2i32_to_v2i32 ; CHECK-SAME: (<2 x i32> [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = sitofp <2 x i32> [[ARG]] to <2 x float> @@ -1154,7 +1154,7 @@ } define half @uitofp_i17_to_f16(i17 %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) half @uitofp_i17_to_f16 ; CHECK-SAME: (i17 [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = uitofp i17 [[ARG]] to half @@ -1165,7 +1165,7 @@ } define half @sitofp_i17_to_f16(i17 %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan nzero sub) half @sitofp_i17_to_f16 ; CHECK-SAME: (i17 [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = sitofp i17 [[ARG]] to half @@ -1176,7 +1176,7 @@ } define <2 x half> @uitofp_v2i17_to_v2f16(<2 x i17> %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) <2 x half> @uitofp_v2i17_to_v2f16 ; CHECK-SAME: (<2 x i17> [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = uitofp <2 x i17> [[ARG]] to <2 x half> @@ -1187,7 +1187,7 @@ } define <2 x half> @sitofp_v2i17_to_v2i17(<2 x i17> %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan nzero sub) <2 x half> @sitofp_v2i17_to_v2i17 ; CHECK-SAME: (<2 x i17> [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CVT:%.*]] = sitofp <2 x i17> [[ARG]] to <2 x half> @@ -1259,7 +1259,7 @@ } define float @returned_extractelement_dynamic_index(<4 x float> nofpclass(nan) %vec, i32 %idx) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_dynamic_index ; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]], i32 [[IDX:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 [[IDX]] @@ -1270,7 +1270,7 @@ } define float @returned_extractelement_index0(<4 x float> nofpclass(nan) %vec) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_index0 ; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 0 @@ -1281,7 +1281,7 @@ } define float @returned_extractelement_index_oob(<4 x float> nofpclass(nan) %vec) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_extractelement_index_oob ; CHECK-SAME: (<4 x float> nofpclass(nan) [[VEC:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement <4 x float> [[VEC]], i32 5 @@ -1292,7 +1292,7 @@ } define float @returned_extractelement_scalable( nofpclass(nan) %vec) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @returned_extractelement_scalable ; CHECK-SAME: ( nofpclass(nan) [[VEC:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[EXTRACT:%.*]] = extractelement [[VEC]], i32 0 @@ -1303,7 +1303,7 @@ } define float @returned_extractvalue([4 x float] nofpclass(nan) %array) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan) float @returned_extractvalue ; CHECK-SAME: ([4 x float] nofpclass(nan) [[ARRAY:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[EXTRACT:%.*]] = extractvalue [4 x float] [[ARRAY]], 0 @@ -1314,7 +1314,7 @@ } define float @return_nofpclass_freeze_nan_arg(float nofpclass(nan) %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define noundef float @return_nofpclass_freeze_nan_arg ; CHECK-SAME: (float nofpclass(nan) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FREEZE:%.*]] = freeze float [[ARG]] @@ -1325,7 +1325,7 @@ } define float @return_nofpclass_extractelement_freeze_pinf_arg(<2 x float> nofpclass(pinf) %arg) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define noundef float @return_nofpclass_extractelement_freeze_pinf_arg ; CHECK-SAME: (<2 x float> nofpclass(pinf) [[ARG:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[FREEZE:%.*]] = freeze <2 x float> [[ARG]] @@ -1338,7 +1338,7 @@ } define <4 x float> @insertelement_constant_chain() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan ninf nzero sub) <4 x float> @insertelement_constant_chain ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: [[INS_0:%.*]] = insertelement <4 x float> poison, float 1.000000e+00, i32 0 @@ -1355,7 +1355,7 @@ } define @insertelement_scalable_constant_chain() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define @insertelement_scalable_constant_chain ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: [[INS_0:%.*]] = insertelement poison, float 1.000000e+00, i32 0 @@ -1372,7 +1372,7 @@ } define <4 x float> @insertelement_unknown_base(<4 x float> %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @insertelement_unknown_base ; CHECK-SAME: (<4 x float> [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 1 @@ -1383,7 +1383,7 @@ } define float @insertelement_extractelement_same(<4 x float> %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan inf nzero sub norm) float @insertelement_extractelement_same ; CHECK-SAME: (<4 x float> [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 1 @@ -1396,7 +1396,7 @@ } define float @insertelement_extractelement_different(<4 x float> nofpclass(zero) %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(zero) float @insertelement_extractelement_different ; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 1 @@ -1409,7 +1409,7 @@ } define float @insertelement_extractelement_unknown(<4 x float> nofpclass(zero) %arg0, i32 %idx) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @insertelement_extractelement_unknown ; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]], i32 [[IDX:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 1 @@ -1422,7 +1422,7 @@ } define <4 x float> @insertelement_index_oob_chain() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @insertelement_index_oob_chain ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> zeroinitializer, float 0x7FF0000000000000, i32 4 @@ -1433,7 +1433,7 @@ } define <2 x float> @multiple_extractelement(<4 x float> nofpclass(zero) %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(zero) <2 x float> @multiple_extractelement ; CHECK-SAME: (<4 x float> nofpclass(zero) [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[INSERT:%.*]] = insertelement <4 x float> [[ARG0]], float 0.000000e+00, i32 1 @@ -1453,7 +1453,7 @@ ; FIXME: Doesn't actually reach computeKnownFPClass define <4 x float> @shufflevector_constexpr() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_constexpr ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: ret <4 x float> @@ -1462,7 +1462,7 @@ } define <4 x float> @shufflevector_concat_disjoint(<2 x float> nofpclass(nan) %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_concat_disjoint ; CHECK-SAME: (<2 x float> nofpclass(nan) [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1473,7 +1473,7 @@ } define <4 x float> @shufflevector_concat_overlap(<2 x float> nofpclass(nan norm psub) %arg0, <2 x float> nofpclass(inf nan sub) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nan psub) <4 x float> @shufflevector_concat_overlap ; CHECK-SAME: (<2 x float> nofpclass(nan psub norm) [[ARG0:%.*]], <2 x float> nofpclass(nan inf sub) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1484,7 +1484,7 @@ } define <4 x float> @shufflevector_unknown_lhs(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_unknown_lhs ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1495,7 +1495,7 @@ } define <4 x float> @shufflevector_unknown_rhs(<2 x float> nofpclass(inf) %arg0, <2 x float> %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_unknown_rhs ; CHECK-SAME: (<2 x float> nofpclass(inf) [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1506,7 +1506,7 @@ } define <4 x float> @shufflevector_unknown_all(<2 x float> %arg0, <2 x float> %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_unknown_all ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1517,7 +1517,7 @@ } define <4 x float> @shufflevector_only_demand_lhs(<2 x float> nofpclass(inf) %arg0, <2 x float> %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf) <4 x float> @shufflevector_only_demand_lhs ; CHECK-SAME: (<2 x float> nofpclass(inf) [[ARG0:%.*]], <2 x float> [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1528,7 +1528,7 @@ } define <4 x float> @shufflevector_only_demand_rhs(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf) <4 x float> @shufflevector_only_demand_rhs ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1539,7 +1539,7 @@ } define <4 x float> @shufflevector_undef_demanded(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_undef_demanded ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> poison @@ -1550,7 +1550,7 @@ } define <4 x float> @shufflevector_zeroinit_demanded(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define <4 x float> @shufflevector_zeroinit_demanded ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> zeroinitializer @@ -1561,7 +1561,7 @@ } define float @shufflevector_extractelt0(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @shufflevector_extractelt0 ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1574,7 +1574,7 @@ } define float @shufflevector_extractelt1(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(inf) float @shufflevector_extractelt1 ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1587,7 +1587,7 @@ } define float @shufflevector_extractelt2(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @shufflevector_extractelt2 ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1600,7 +1600,7 @@ } define float @shufflevector_extractelt3(<2 x float> %arg0, <2 x float> nofpclass(inf) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @shufflevector_extractelt3 ; CHECK-SAME: (<2 x float> [[ARG0:%.*]], <2 x float> nofpclass(inf) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SHUFFLE:%.*]] = shufflevector <2 x float> [[ARG0]], <2 x float> [[ARG1]], <4 x i32> @@ -1613,7 +1613,7 @@ } define float @constrained_sitofp(i32 %arg) strictfp { -; CHECK: Function Attrs: nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define nofpclass(nan nzero sub) float @constrained_sitofp ; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR5:[0-9]+]] { ; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(nan nzero sub) float @llvm.experimental.constrained.sitofp.f32.i32(i32 [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR13]] @@ -1624,7 +1624,7 @@ } define float @constrained_uitofp(i32 %arg) strictfp { -; CHECK: Function Attrs: nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind strictfp willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define nofpclass(nan ninf nzero sub nnorm) float @constrained_uitofp ; CHECK-SAME: (i32 [[ARG:%.*]]) #[[ATTR5]] { ; CHECK-NEXT: [[VAL:%.*]] = call nofpclass(nan ninf nzero sub nnorm) float @llvm.experimental.constrained.uitofp.f32.i32(i32 [[ARG]], metadata !"round.dynamic", metadata !"fpexcept.strict") #[[ATTR13]] @@ -1635,7 +1635,7 @@ } define float @fadd_p0(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0 ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+00 @@ -1646,7 +1646,7 @@ } define float @fadd_n0(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_n0 ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+00 @@ -1657,7 +1657,7 @@ } define float @fsub_p0(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0 ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+00 @@ -1668,7 +1668,7 @@ } define float @fsub_n0(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fsub_n0 ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+00 @@ -1679,7 +1679,7 @@ } define float @fsub_p0_commute(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0_commute ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]] @@ -1690,7 +1690,7 @@ } define float @fsub_n0_commute(float %arg0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_n0_commute ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]] @@ -1701,7 +1701,7 @@ } define float @fadd_p0_ftz_daz(float %arg0) #3 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR6:[0-9]+]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+00 @@ -1712,7 +1712,7 @@ } define float @fadd_n0_ftz_daz(float %arg0) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_n0_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR7:[0-9]+]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+00 @@ -1723,7 +1723,7 @@ } define float @fsub_p0_ftz_daz(float %arg0) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+00 @@ -1734,7 +1734,7 @@ } define float @fsub_n0_ftz_daz(float %arg0) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_n0_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+00 @@ -1745,7 +1745,7 @@ } define float @fsub_p0_commute_ftz_daz(float %arg0) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0_commute_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]] @@ -1756,7 +1756,7 @@ } define float @fsub_n0_commute_ftz_daz(float %arg0) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_n0_commute_ftz_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]] @@ -1767,7 +1767,7 @@ } define float @fadd_p0_ieee_daz(float %arg0) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR8:[0-9]+]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+00 @@ -1778,7 +1778,7 @@ } define float @fadd_p0_dapz_ieee(float %arg0) #4 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_p0_dapz_ieee ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR9:[0-9]+]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], 0.000000e+00 @@ -1789,7 +1789,7 @@ } define float @fadd_n0_ieee_daz(float %arg0) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_n0_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], -0.000000e+00 @@ -1800,7 +1800,7 @@ } define float @fsub_p0_ieee_daz(float %arg0) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], 0.000000e+00 @@ -1811,7 +1811,7 @@ } define float @fsub_n0_ieee_daz(float %arg0) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fsub_n0_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float [[ARG0]], -0.000000e+00 @@ -1822,7 +1822,7 @@ } define float @fsub_p0_commute_ieee_daz(float %arg0) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_p0_commute_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float 0.000000e+00, [[ARG0]] @@ -1833,7 +1833,7 @@ } define float @fsub_n0_commute_ieee_daz(float %arg0) #1 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fsub_n0_commute_ieee_daz ; CHECK-SAME: (float [[ARG0:%.*]]) #[[ATTR10:[0-9]+]] { ; CHECK-NEXT: [[SUB:%.*]] = fsub float -0.000000e+00, [[ARG0]] @@ -1844,7 +1844,7 @@ } define float @fadd_never_negzero_or_negsub(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub ; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1855,7 +1855,7 @@ } define float @fadd_never_negzero_or_negsub_daz(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub_daz ; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1866,7 +1866,7 @@ } define float @fadd_never_negzero_or_negsub_dapz(float nofpclass(nzero nsub) %a, float nofpclass(nzero nsub) %b) #5 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_negsub_dapz ; CHECK-SAME: (float nofpclass(nzero nsub) [[A:%.*]], float nofpclass(nzero nsub) [[B:%.*]]) #[[ATTR11:[0-9]+]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1877,7 +1877,7 @@ } define float @fadd_never_negzero_or_possub(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_possub ; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1888,7 +1888,7 @@ } define float @fadd_never_negzero_or_possub_daz(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_never_negzero_or_possub_daz ; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1899,7 +1899,7 @@ } define float @fadd_never_negzero_or_possub_dapz(float nofpclass(nzero psub) %a, float nofpclass(nzero psub) %b) #5 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_possub_dapz ; CHECK-SAME: (float nofpclass(nzero psub) [[A:%.*]], float nofpclass(nzero psub) [[B:%.*]]) #[[ATTR11]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1910,7 +1910,7 @@ } define float @fadd_never_negzero_or_sub_daz(float nofpclass(nzero sub) %a, float nofpclass(nzero sub) %b) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_sub_daz ; CHECK-SAME: (float nofpclass(nzero sub) [[A:%.*]], float nofpclass(nzero sub) [[B:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1921,7 +1921,7 @@ } define float @fadd_never_negzero_or_sub_dapz(float nofpclass(nzero sub) %a, float nofpclass(nzero sub) %b) #5 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_never_negzero_or_sub_dapz ; CHECK-SAME: (float nofpclass(nzero sub) [[A:%.*]], float nofpclass(nzero sub) [[B:%.*]]) #[[ATTR11]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[A]], [[B]] @@ -1932,7 +1932,7 @@ } define float @fadd_known_positive_lhs(float nofpclass(ninf nsub nnorm) %arg0, float %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_lhs ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1943,7 +1943,7 @@ } define float @fadd_known_positive_rhs(float %arg0, float nofpclass(ninf nsub nnorm) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_rhs ; CHECK-SAME: (float [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1954,7 +1954,7 @@ } define float @fadd_known_positive(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1965,7 +1965,7 @@ } define float @fadd_known_positive_daz(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm) %arg1) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_daz ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1976,7 +1976,7 @@ } define float @fadd_known_positive_nzero_lhs(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_nzero_lhs ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nsub nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1987,7 +1987,7 @@ } define float @fadd_known_positive_nzero_rhs(float nofpclass(ninf nsub nnorm) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_nzero_rhs ; CHECK-SAME: (float nofpclass(ninf nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -1998,7 +1998,7 @@ } define float @fadd_known_positive_nzero(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_nzero ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2009,7 +2009,7 @@ } define float @fadd_known_positive_nzero_ftz_daz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_nzero_ftz_daz ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2020,7 +2020,7 @@ } define float @fadd_known_positive_nzero_ftz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #1 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_nzero_ftz ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR10]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2031,7 +2031,7 @@ } define float @fadd_known_positive_nzero_daz(float nofpclass(ninf nsub nnorm nzero) %arg0, float nofpclass(ninf nsub nnorm nzero) %arg1) #2 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_nzero_daz ; CHECK-SAME: (float nofpclass(ninf nzero nsub nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nsub nnorm) [[ARG1:%.*]]) #[[ATTR8]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2042,7 +2042,7 @@ } define float @fadd_known_positive_normal(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_normal ; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2053,7 +2053,7 @@ } define float @fadd_known_positive_normal_daz(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_normal_daz ; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2064,7 +2064,7 @@ } define float @fadd_known_positive_normal_except0_daz(float nofpclass(ninf nnorm) %arg0, float nofpclass(ninf nnorm) %arg1) #0 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define float @fadd_known_positive_normal_except0_daz ; CHECK-SAME: (float nofpclass(ninf nnorm) [[ARG0:%.*]], float nofpclass(ninf nnorm) [[ARG1:%.*]]) #[[ATTR7]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] @@ -2075,7 +2075,7 @@ } define float @fadd_known_positive_normal_dapz(float nofpclass(ninf nnorm nzero) %arg0, float nofpclass(ninf nnorm nzero) %arg1) #3 { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define nofpclass(nzero) float @fadd_known_positive_normal_dapz ; CHECK-SAME: (float nofpclass(ninf nzero nnorm) [[ARG0:%.*]], float nofpclass(ninf nzero nnorm) [[ARG1:%.*]]) #[[ATTR6]] { ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[ARG0]], [[ARG1]] diff --git a/llvm/test/Transforms/Attributor/nofree.ll b/llvm/test/Transforms/Attributor/nofree.ll --- a/llvm/test/Transforms/Attributor/nofree.ll +++ b/llvm/test/Transforms/Attributor/nofree.ll @@ -15,7 +15,7 @@ ; TEST 1 (positive case) define void @only_return() #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@only_return ; CHECK-SAME: () #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: ret void @@ -104,12 +104,12 @@ define void @mutual_recursion1() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@mutual_recursion1 ; TUNIT-SAME: () #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@mutual_recursion1 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: ret void @@ -119,12 +119,12 @@ } define void @mutual_recursion2() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@mutual_recursion2 ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@mutual_recursion2 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: ret void @@ -187,12 +187,12 @@ declare void @nofree_function() nofree readnone #0 define void @call_nofree_function() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@call_nofree_function ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@call_nofree_function ; CGSCC-SAME: () #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: ret void @@ -245,7 +245,7 @@ declare float @llvm.floor.f32(float) define void @call_floor(float %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@call_floor ; CHECK-SAME: (float [[A:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: ret void @@ -255,7 +255,7 @@ } define float @call_floor2(float %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@call_floor2 ; CHECK-SAME: (float [[A:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: [[C:%.*]] = tail call nofpclass(sub) float @llvm.floor.f32(float [[A]]) #[[ATTR11:[0-9]+]] @@ -269,12 +269,12 @@ ; Check propagation. define void @f1() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@f1 ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: ret void @@ -284,12 +284,12 @@ } define void @f2() #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@f2 ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@f2 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: ret void @@ -440,8 +440,8 @@ ; TUNIT: attributes #[[ATTR0]] = { nounwind } ; TUNIT: attributes #[[ATTR1]] = { noinline nounwind uwtable } ; TUNIT: attributes #[[ATTR2]] = { nobuiltin nounwind } -; TUNIT: attributes #[[ATTR3]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } -; TUNIT: attributes #[[ATTR4]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR5:[0-9]+]] = { nofree noinline nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; TUNIT: attributes #[[ATTR7]] = { nofree nounwind } @@ -453,9 +453,9 @@ ; CGSCC: attributes #[[ATTR0]] = { nounwind } ; CGSCC: attributes #[[ATTR1]] = { noinline nounwind uwtable } ; CGSCC: attributes #[[ATTR2]] = { nobuiltin nounwind } -; CGSCC: attributes #[[ATTR3]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR4:[0-9]+]] = { nofree noinline nounwind memory(none) uwtable } -; CGSCC: attributes #[[ATTR5]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; CGSCC: attributes #[[ATTR7]] = { nofree nounwind } ; CGSCC: attributes #[[ATTR8:[0-9]+]] = { nobuiltin nofree nounwind } diff --git a/llvm/test/Transforms/Attributor/nonnull.ll b/llvm/test/Transforms/Attributor/nonnull.ll --- a/llvm/test/Transforms/Attributor/nonnull.ll +++ b/llvm/test/Transforms/Attributor/nonnull.ll @@ -20,7 +20,7 @@ ; Return a pointer trivially nonnull (argument attribute) define ptr @test2(ptr nonnull %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nofree nonnull readnone returned "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: ret ptr [[P]] @@ -29,15 +29,15 @@ } define ptr @test2A(i1 %c, ptr %ret) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@test2A ; CHECK-SAME: (i1 noundef [[C:%.*]], ptr nofree nonnull readnone returned "no-capture-maybe-returned" [[RET:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]] ; CHECK: A: -; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13:[0-9]+]] [ "nonnull"(ptr [[RET]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15:[0-9]+]] [ "nonnull"(ptr [[RET]]) ] ; CHECK-NEXT: ret ptr [[RET]] ; CHECK: B: -; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(ptr [[RET]]) ] +; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[RET]]) ] ; CHECK-NEXT: ret ptr [[RET]] ; br i1 %c, label %A, label %B @@ -50,15 +50,15 @@ } define ptr @test2B(i1 %c, ptr %ret) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@test2B ; CHECK-SAME: (i1 noundef [[C:%.*]], ptr nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[RET:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]] ; CHECK: A: -; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "dereferenceable"(ptr [[RET]], i32 4) ] +; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "dereferenceable"(ptr [[RET]], i32 4) ] ; CHECK-NEXT: ret ptr [[RET]] ; CHECK: B: -; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "dereferenceable"(ptr [[RET]], i32 4) ] +; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "dereferenceable"(ptr [[RET]], i32 4) ] ; CHECK-NEXT: ret ptr [[RET]] ; br i1 %c, label %A, label %B @@ -106,12 +106,12 @@ ; nonnull if neither can ever return null. (In this case, they ; just never return period.) define ptr @test4_helper() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4_helper ; TUNIT-SAME: () #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4_helper ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret ptr undef @@ -121,12 +121,12 @@ } define ptr @test4() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret ptr undef @@ -138,7 +138,7 @@ ; Given a mutual recursive set of functions which *can* return null ; make sure we haven't marked them as nonnull. define ptr @test5_helper(i1 %c) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test5_helper ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]] @@ -147,7 +147,7 @@ ; TUNIT: end: ; TUNIT-NEXT: ret ptr null ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test5_helper ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]] @@ -165,12 +165,12 @@ } define ptr @test5(i1 %c) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test5 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: ret ptr null ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test5 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: ret ptr null @@ -237,7 +237,7 @@ } define ptr @test7(ptr %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test7 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: ret ptr [[A]] @@ -246,7 +246,7 @@ } define ptr @test8(ptr %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test8 ; CHECK-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 1 @@ -257,7 +257,7 @@ } define ptr @test9(ptr %a, i64 %n) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test9 ; CHECK-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[N]] @@ -270,11 +270,11 @@ ; ATTRIBUTOR_OPM: define ptr @test10 ; ATTRIBUTOR_NPM: define nonnull ptr @test10 define ptr @test10(ptr %a, i64 %n) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@test10 ; CHECK-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[N]], 0 -; CHECK-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR13]] +; CHECK-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR15]] ; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[N]] ; CHECK-NEXT: ret ptr [[B]] ; @@ -402,11 +402,11 @@ ; TUNIT-NEXT: br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]] ; TUNIT: bb4: ; TUNIT-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1 -; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR14:[0-9]+]] +; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR16:[0-9]+]] ; TUNIT-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1 ; TUNIT-NEXT: br label [[BB9]] ; TUNIT: bb6: -; TUNIT-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR14]] +; TUNIT-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]] ; TUNIT-NEXT: ret ptr [[TMP7]] ; TUNIT: bb9: ; TUNIT-NEXT: [[TMP10:%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ] @@ -424,11 +424,11 @@ ; CGSCC-NEXT: br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]] ; CGSCC: bb4: ; CGSCC-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1 -; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR14:[0-9]+]] +; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR16:[0-9]+]] ; CGSCC-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1 ; CGSCC-NEXT: br label [[BB9]] ; CGSCC: bb6: -; CGSCC-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR14]] +; CGSCC-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]] ; CGSCC-NEXT: ret ptr [[TMP7]] ; CGSCC: bb9: ; CGSCC-NEXT: [[TMP10:%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ] @@ -464,14 +464,14 @@ ; TUNIT-LABEL: define {{[^@]+}}@f2 ; TUNIT-SAME: (ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR6]] { ; TUNIT-NEXT: bb: -; TUNIT-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR14]] +; TUNIT-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]] ; TUNIT-NEXT: ret ptr [[TMP]] ; ; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@f2 ; CGSCC-SAME: (ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: bb: -; CGSCC-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR14]] +; CGSCC-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]] ; CGSCC-NEXT: ret ptr [[TMP]] ; bb: @@ -485,14 +485,14 @@ ; TUNIT-LABEL: define {{[^@]+}}@f3 ; TUNIT-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR6]] { ; TUNIT-NEXT: bb: -; TUNIT-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR14]] +; TUNIT-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]] ; TUNIT-NEXT: ret ptr [[TMP]] ; ; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@f3 ; CGSCC-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: bb: -; CGSCC-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR14]] +; CGSCC-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]] ; CGSCC-NEXT: ret ptr [[TMP]] ; bb: @@ -524,25 +524,25 @@ ; fun2(nonnull %a, %b) ; We can say that %a is nonnull but %b is not. define void @f16(ptr %a, ptr %b, i8 %c) { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@f16 -; TUNIT-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7:[0-9]+]] { +; TUNIT-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR8:[0-9]+]] { ; TUNIT-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; TUNIT-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; TUNIT: if.then: -; TUNIT-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR7]] +; TUNIT-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR7:[0-9]+]] ; TUNIT-NEXT: ret void ; TUNIT: if.else: ; TUNIT-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr [[B]]) #[[ATTR7]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@f16 -; CGSCC-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR6:[0-9]+]] { +; CGSCC-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; CGSCC-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CGSCC: if.then: -; CGSCC-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR6]] +; CGSCC-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr nonnull [[B]]) #[[ATTR6:[0-9]+]] ; CGSCC-NEXT: ret void ; CGSCC: if.else: ; CGSCC-NEXT: tail call void @fun2(ptr nonnull [[A]], ptr [[B]]) #[[ATTR6]] @@ -566,9 +566,9 @@ ; We can say that %a is nonnull define void @f17(ptr %a, i8 %c) { ; -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@f17 -; TUNIT-SAME: (ptr nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; TUNIT-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; TUNIT: if.then: @@ -581,9 +581,9 @@ ; TUNIT-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR7]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@f17 -; CGSCC-SAME: (ptr nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i8 [[C]], 0 ; CGSCC-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CGSCC: if.then: @@ -620,9 +620,9 @@ ; fun1(nonnull %a) define void @f18(ptr %a, ptr %b, i8 %c) { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@f18 -; TUNIT-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: [[CMP1:%.*]] = icmp eq i8 [[C]], 0 ; TUNIT-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; TUNIT: if.then: @@ -644,9 +644,9 @@ ; TUNIT-NEXT: tail call void @fun1(ptr nonnull [[A]]) #[[ATTR7]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@f18 -; CGSCC-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr nonnull [[A:%.*]], ptr [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: [[CMP1:%.*]] = icmp eq i8 [[C]], 0 ; CGSCC-NEXT: br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; CGSCC: if.then: @@ -856,7 +856,7 @@ define i8 @parent7(ptr %a) { ; CHECK-LABEL: define {{[^@]+}}@parent7 ; CHECK-SAME: (ptr nonnull [[A:%.*]]) { -; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull readonly [[A]]) #[[ATTR13]] +; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull readonly [[A]]) #[[ATTR15]] ; CHECK-NEXT: call void @use1nonnull(ptr nonnull [[A]]) ; CHECK-NEXT: ret i8 [[RET]] ; @@ -914,7 +914,7 @@ } define ptr @gep1(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@gep1 ; CHECK-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: [[Q:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 1 @@ -926,15 +926,15 @@ define ptr @gep1_no_null_opt(ptr %p) #0 { ; Should't be able to derive nonnull based on gep. -; TUNIT: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@gep1_no_null_opt -; TUNIT-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR9:[0-9]+]] { +; TUNIT-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR10:[0-9]+]] { ; TUNIT-NEXT: [[Q:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 1 ; TUNIT-NEXT: ret ptr [[Q]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@gep1_no_null_opt -; CGSCC-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR8:[0-9]+]] { +; CGSCC-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR9:[0-9]+]] { ; CGSCC-NEXT: [[Q:%.*]] = getelementptr inbounds i32, ptr [[P]], i32 1 ; CGSCC-NEXT: ret ptr [[Q]] ; @@ -943,7 +943,7 @@ } define ptr addrspace(3) @gep2(ptr addrspace(3) %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@gep2 ; CHECK-SAME: (ptr addrspace(3) nofree readnone "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: [[Q:%.*]] = getelementptr inbounds i32, ptr addrspace(3) [[P]], i32 1 @@ -955,7 +955,7 @@ ; FIXME: We should propagate dereferenceable here but *not* nonnull define ptr addrspace(3) @as(ptr addrspace(3) dereferenceable(4) %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@as ; CHECK-SAME: (ptr addrspace(3) nofree noundef nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: ret ptr addrspace(3) [[P]] @@ -965,7 +965,7 @@ ; CHECK-NOT: @g2() define internal ptr @g2() { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@g2 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret ptr inttoptr (i64 4 to ptr) @@ -974,15 +974,15 @@ } define ptr @g1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@g1 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret ptr inttoptr (i64 4 to ptr) ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@g1 -; CGSCC-SAME: () #[[ATTR9:[0-9]+]] { -; CGSCC-NEXT: [[C:%.*]] = call noundef nonnull align 4 ptr @g2() #[[ATTR13]] +; CGSCC-SAME: () #[[ATTR10:[0-9]+]] { +; CGSCC-NEXT: [[C:%.*]] = call noundef nonnull align 4 ptr @g2() #[[ATTR15]] ; CGSCC-NEXT: ret ptr [[C]] ; %c = call ptr @g2() @@ -1045,7 +1045,7 @@ define internal void @naked(ptr dereferenceable(4) %a) naked { ; CHECK: Function Attrs: naked ; CHECK-LABEL: define {{[^@]+}}@naked -; CHECK-SAME: (ptr dereferenceable(4) [[A:%.*]]) #[[ATTR10:[0-9]+]] { +; CHECK-SAME: (ptr dereferenceable(4) [[A:%.*]]) #[[ATTR11:[0-9]+]] { ; CHECK-NEXT: call void @use_i32_ptr(ptr [[A]]) ; CHECK-NEXT: ret void ; @@ -1057,7 +1057,7 @@ ; ; CHECK: Function Attrs: noinline optnone ; CHECK-LABEL: define {{[^@]+}}@optnone -; CHECK-SAME: (ptr dereferenceable(4) [[A:%.*]]) #[[ATTR11:[0-9]+]] { +; CHECK-SAME: (ptr dereferenceable(4) [[A:%.*]]) #[[ATTR12:[0-9]+]] { ; CHECK-NEXT: call void @use_i32_ptr(ptr [[A]]) ; CHECK-NEXT: ret void ; @@ -1096,9 +1096,9 @@ declare i32 @g(ptr) willreturn nounwind define i32 @nonnull_exec_ctx_1(ptr %a, i32 %b) { ; -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1 -; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: en: ; TUNIT-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; TUNIT-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1112,9 +1112,9 @@ ; TUNIT-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; TUNIT-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1 -; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: en: ; CGSCC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; CGSCC-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1146,9 +1146,9 @@ define i32 @nonnull_exec_ctx_1b(ptr %a, i32 %b) { ; -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b -; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: en: ; TUNIT-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; TUNIT-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1164,9 +1164,9 @@ ; TUNIT-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; TUNIT-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b -; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: en: ; CGSCC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; CGSCC-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1203,9 +1203,9 @@ define i32 @nonnull_exec_ctx_2(ptr %a, i32 %b) willreturn nounwind { ; -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2 -; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: en: ; TUNIT-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; TUNIT-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1219,9 +1219,9 @@ ; TUNIT-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; TUNIT-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2 -; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: en: ; CGSCC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; CGSCC-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1253,9 +1253,9 @@ define i32 @nonnull_exec_ctx_2b(ptr %a, i32 %b) willreturn nounwind { ; -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b -; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { +; TUNIT-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR8]] { ; TUNIT-NEXT: en: ; TUNIT-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; TUNIT-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1271,9 +1271,9 @@ ; TUNIT-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]] ; TUNIT-NEXT: br i1 [[TMP9]], label [[EX]], label [[HD]] ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b -; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] { +; CGSCC-SAME: (ptr nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] { ; CGSCC-NEXT: en: ; CGSCC-NEXT: [[TMP3:%.*]] = icmp eq i32 [[B]], 0 ; CGSCC-NEXT: br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]] @@ -1390,10 +1390,10 @@ ; We should not mark the return of @strrchr as `nonnull`, it may well be NULL! define ptr @mybasename(ptr nofree readonly %str) { -; CHECK: Function Attrs: nofree nounwind willreturn memory(read) +; CHECK: Function Attrs: mustprogress nofree nounwind willreturn memory(read) ; CHECK-LABEL: define {{[^@]+}}@mybasename -; CHECK-SAME: (ptr nofree readonly [[STR:%.*]]) #[[ATTR12:[0-9]+]] { -; CHECK-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR13]] +; CHECK-SAME: (ptr nofree readonly [[STR:%.*]]) #[[ATTR14:[0-9]+]] { +; CHECK-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR15]] ; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[CALL]], null ; CHECK-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 1 ; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], ptr [[ADD_PTR]], ptr [[STR]] @@ -1416,14 +1416,14 @@ ; ; TUNIT-LABEL: define {{[^@]+}}@nonnull_assume_pos ; TUNIT-SAME: (ptr nocapture nofree nonnull readnone [[ARG:%.*]]) { -; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(ptr [[ARG]]) ] +; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[ARG]]) ] ; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[ARG]]) #[[ATTR5]] ; TUNIT-NEXT: [[TMP1:%.*]] = call ptr @unknown() ; TUNIT-NEXT: ret void ; ; CGSCC-LABEL: define {{[^@]+}}@nonnull_assume_pos ; CGSCC-SAME: (ptr nocapture nofree nonnull readnone [[ARG:%.*]]) { -; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(ptr [[ARG]]) ] +; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[ARG]]) ] ; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[ARG]]) #[[ATTR4]] ; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @unknown() ; CGSCC-NEXT: ret void @@ -1485,7 +1485,7 @@ declare void @use_i8_ptr_ret(ptr nofree nocapture readnone) nounwind willreturn define ptr @nonnull_function_ptr_1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@nonnull_function_ptr_1 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret ptr @nonnull_function_ptr_1 @@ -1495,12 +1495,12 @@ declare ptr @function_decl() define ptr @nonnull_function_ptr_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@nonnull_function_ptr_2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret ptr @function_decl ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@nonnull_function_ptr_2 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret ptr @function_decl @@ -1525,34 +1525,38 @@ attributes #1 = { nounwind willreturn} ;. ; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR4]] = { noreturn } ; TUNIT: attributes #[[ATTR5]] = { nounwind } ; TUNIT: attributes #[[ATTR6]] = { nofree nosync nounwind memory(argmem: read) } ; TUNIT: attributes #[[ATTR7]] = { nounwind willreturn } -; TUNIT: attributes #[[ATTR8:[0-9]+]] = { nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } -; TUNIT: attributes #[[ATTR10]] = { naked } -; TUNIT: attributes #[[ATTR11]] = { noinline optnone } -; TUNIT: attributes #[[ATTR12]] = { nofree nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR13]] = { willreturn } -; TUNIT: attributes #[[ATTR14]] = { nofree nosync nounwind } +; TUNIT: attributes #[[ATTR8]] = { mustprogress nounwind willreturn } +; TUNIT: attributes #[[ATTR9:[0-9]+]] = { nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; TUNIT: attributes #[[ATTR11]] = { naked } +; TUNIT: attributes #[[ATTR12]] = { noinline optnone } +; TUNIT: attributes #[[ATTR13:[0-9]+]] = { nofree nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR14]] = { mustprogress nofree nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR15]] = { willreturn } +; TUNIT: attributes #[[ATTR16]] = { nofree nosync nounwind } ;. ; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ; CGSCC: attributes #[[ATTR3]] = { noreturn } ; CGSCC: attributes #[[ATTR4]] = { nounwind } ; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind memory(argmem: read) } ; CGSCC: attributes #[[ATTR6]] = { nounwind willreturn } -; CGSCC: attributes #[[ATTR7:[0-9]+]] = { nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } -; CGSCC: attributes #[[ATTR9]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR10]] = { naked } -; CGSCC: attributes #[[ATTR11]] = { noinline optnone } -; CGSCC: attributes #[[ATTR12]] = { nofree nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR13]] = { willreturn } -; CGSCC: attributes #[[ATTR14]] = { nofree nosync nounwind } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nounwind willreturn } +; CGSCC: attributes #[[ATTR8:[0-9]+]] = { nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR11]] = { naked } +; CGSCC: attributes #[[ATTR12]] = { noinline optnone } +; CGSCC: attributes #[[ATTR13:[0-9]+]] = { nofree nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR14]] = { mustprogress nofree nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR15]] = { willreturn } +; CGSCC: attributes #[[ATTR16]] = { nofree nosync nounwind } ;. diff --git a/llvm/test/Transforms/Attributor/norecurse.ll b/llvm/test/Transforms/Attributor/norecurse.ll --- a/llvm/test/Transforms/Attributor/norecurse.ll +++ b/llvm/test/Transforms/Attributor/norecurse.ll @@ -1,9 +1,9 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals -; RUN: opt -opaque-pointers=0 -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,TUNIT +; RUN: opt -opaque-pointers=0 -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,TUNIT ; RUN: opt -opaque-pointers=0 -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define i32 @leaf() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@leaf ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret i32 1 @@ -12,7 +12,7 @@ } define i32 @self_rec() { -; CHECK: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@self_rec ; CHECK-SAME: () #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: ret i32 4 @@ -22,12 +22,12 @@ } define i32 @indirect_rec() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@indirect_rec ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@indirect_rec ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret i32 undef @@ -36,12 +36,12 @@ ret i32 %a } define i32 @indirect_rec2() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@indirect_rec2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@indirect_rec2 ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret i32 undef @@ -66,7 +66,7 @@ declare i32 @k() readnone define void @intrinsic(i8* %dest, i8* %src, i32 %len) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@intrinsic ; CHECK-SAME: (i8* nocapture nofree writeonly [[DEST:%.*]], i8* nocapture nofree readonly [[SRC:%.*]], i32 [[LEN:%.*]]) #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture nofree writeonly [[DEST]], i8* noalias nocapture nofree readonly [[SRC]], i32 [[LEN]], i1 noundef false) #[[ATTR9:[0-9]+]] @@ -157,7 +157,7 @@ } define void @f(i32 %x) { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@f ; TUNIT-SAME: (i32 [[X:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -170,7 +170,7 @@ ; TUNIT: if.end: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f ; CGSCC-SAME: (i32 [[X:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -198,7 +198,7 @@ } define void @g() norecurse { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@g ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -241,7 +241,7 @@ ; Call an unknown function in a dead block. declare void @unknown() define i32 @call_unknown_in_dead_block() local_unnamed_addr { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@call_unknown_in_dead_block ; CHECK-SAME: () local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: ret i32 0 @@ -307,11 +307,11 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nosync memory(none) } ; TUNIT: attributes #[[ATTR3:[0-9]+]] = { memory(none) } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR6]] = { norecurse nosync memory(none) } ; TUNIT: attributes #[[ATTR7]] = { null_pointer_is_valid } @@ -319,11 +319,11 @@ ; TUNIT: attributes #[[ATTR9]] = { willreturn } ; TUNIT: attributes #[[ATTR10]] = { nosync } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nosync memory(none) } ; CGSCC: attributes #[[ATTR3:[0-9]+]] = { memory(none) } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR6]] = { norecurse nosync memory(none) } ; CGSCC: attributes #[[ATTR7]] = { null_pointer_is_valid } diff --git a/llvm/test/Transforms/Attributor/noreturn.ll b/llvm/test/Transforms/Attributor/noreturn.ll --- a/llvm/test/Transforms/Attributor/noreturn.ll +++ b/llvm/test/Transforms/Attributor/noreturn.ll @@ -15,7 +15,7 @@ ; } ; define void @srec0() #0 { -; CHECK: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@srec0 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -34,7 +34,7 @@ ; } ; define i32 @srec16(i32 %a) #0 { -; CHECK: Function Attrs: nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@srec16 ; CHECK-SAME: (i32 [[A:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -126,7 +126,7 @@ ; } ; define i32 @multiple_noreturn_calls(i32 %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse noreturn nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse noreturn nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@multiple_noreturn_calls ; TUNIT-SAME: (i32 [[A:%.*]]) #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -139,7 +139,7 @@ ; TUNIT: cond.end: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@multiple_noreturn_calls ; CGSCC-SAME: (i32 [[A:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -174,7 +174,7 @@ ; FIXME: we should derive "UB" as an argument and report it to the user on request. define i32 @endless_loop_but_willreturn() willreturn { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@endless_loop_but_willreturn ; TUNIT-SAME: () #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -182,7 +182,7 @@ ; TUNIT: while.body: ; TUNIT-NEXT: br label [[WHILE_BODY]] ; -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@endless_loop_but_willreturn ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -199,13 +199,13 @@ ; TEST 6b: willreturn means *not* no-return or UB define i32 @UB_and_willreturn() willreturn { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@UB_and_willreturn ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@UB_and_willreturn ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -217,14 +217,14 @@ attributes #0 = { noinline nounwind uwtable } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } -; TUNIT: attributes #[[ATTR1]] = { nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR2]] = { nofree noinline norecurse noreturn nosync nounwind memory(none) uwtable } -; TUNIT: attributes #[[ATTR3]] = { nofree noinline norecurse noreturn nosync nounwind willreturn memory(none) uwtable } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree noinline norecurse noreturn nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } -; CGSCC: attributes #[[ATTR1]] = { nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree noinline noreturn nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR2]] = { nofree noinline norecurse noreturn nosync nounwind memory(none) uwtable } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/nosync.ll b/llvm/test/Transforms/Attributor/nosync.ll --- a/llvm/test/Transforms/Attributor/nosync.ll +++ b/llvm/test/Transforms/Attributor/nosync.ll @@ -30,7 +30,7 @@ ; CHECK: @[[A:[a-zA-Z0-9_$"\\.-]+]] = common global i32 0, align 4 ;. define i32* @foo(%struct.ST* %s) nounwind uwtable readnone optsize ssp { -; CHECK: Function Attrs: nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (%struct.ST* nofree readnone "no-capture-maybe-returned" [[S:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -50,7 +50,7 @@ ; } define i32 @load_monotonic(i32* nocapture readonly %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@load_monotonic ; CHECK-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic i32, i32* [[TMP0]] monotonic, align 4 @@ -68,7 +68,7 @@ ; } define void @store_monotonic(i32* nocapture %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@store_monotonic ; CHECK-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: store atomic i32 10, i32* [[TMP0]] monotonic, align 4 @@ -86,7 +86,7 @@ ; } define i32 @load_acquire(i32* nocapture readonly %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@load_acquire ; CHECK-SAME: (i32* nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[TMP0:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: [[TMP2:%.*]] = load atomic i32, i32* [[TMP0]] acquire, align 4 @@ -103,7 +103,7 @@ ; } define void @load_release(i32* nocapture %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@load_release ; CHECK-SAME: (i32* nocapture nofree noundef writeonly align 4 [[TMP0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: store atomic volatile i32 10, i32* [[TMP0]] release, align 4 @@ -116,7 +116,7 @@ ; TEST 6 - negative volatile, relaxed atomic define void @load_volatile_release(i32* nocapture %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@load_volatile_release ; CHECK-SAME: (i32* nocapture nofree noundef writeonly align 4 [[TMP0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: store atomic volatile i32 10, i32* [[TMP0]] release, align 4 @@ -133,7 +133,7 @@ ; } define void @volatile_store(i32* %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@volatile_store ; CHECK-SAME: (i32* nofree noundef align 4 [[TMP0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: store volatile i32 14, i32* [[TMP0]], align 4 @@ -151,7 +151,7 @@ ; } define i32 @volatile_load(i32* %0) norecurse nounwind uwtable { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable ; CHECK-LABEL: define {{[^@]+}}@volatile_load ; CHECK-SAME: (i32* nofree noundef align 4 [[TMP0:%.*]]) #[[ATTR2]] { ; CHECK-NEXT: [[TMP2:%.*]] = load volatile i32, i32* [[TMP0]], align 4 @@ -249,7 +249,7 @@ %"struct.std::__atomic_base" = type { i8 } define void @foo1(i32* %0, %"struct.std::atomic"* %1) { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@foo1 ; CHECK-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) [[TMP1:%.*]]) #[[ATTR6:[0-9]+]] { ; CHECK-NEXT: store i32 100, i32* [[TMP0]], align 4 @@ -296,7 +296,7 @@ ; TEST 13 - Fence syncscope("singlethread") seq_cst define void @foo1_singlethread(i32* %0, %"struct.std::atomic"* %1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CHECK-LABEL: define {{[^@]+}}@foo1_singlethread ; CHECK-SAME: (i32* nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) [[TMP1:%.*]]) #[[ATTR8:[0-9]+]] { ; CHECK-NEXT: store i32 100, i32* [[TMP0]], align 4 @@ -349,7 +349,7 @@ ; It is odd to add nocapture but a result of the llvm.memcpy nocapture. ; define i32 @memcpy_volatile(i8* %ptr1, i8* %ptr2) { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@memcpy_volatile ; CHECK-SAME: (i8* nocapture nofree writeonly [[PTR1:%.*]], i8* nocapture nofree readonly [[PTR2:%.*]]) #[[ATTR10:[0-9]+]] { ; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture nofree writeonly [[PTR1]], i8* noalias nocapture nofree readonly [[PTR2]], i32 noundef 8, i1 noundef true) #[[ATTR20:[0-9]+]] @@ -364,7 +364,7 @@ ; It is odd to add nocapture but a result of the llvm.memset nocapture. ; define i32 @memset_non_volatile(i8* %ptr1, i8 %val) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@memset_non_volatile ; CHECK-SAME: (i8* nocapture nofree writeonly [[PTR1:%.*]], i8 [[VAL:%.*]]) #[[ATTR11:[0-9]+]] { ; CHECK-NEXT: call void @llvm.memset.p0i8.i32(i8* nocapture nofree writeonly [[PTR1]], i8 [[VAL]], i32 noundef 8, i1 noundef false) #[[ATTR20]] @@ -423,7 +423,7 @@ ; TEST 19 - positive, readnone & non-convergent intrinsic. define i32 @cos_test(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cos_test ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR15:[0-9]+]] { ; CHECK-NEXT: ret i32 4 @@ -433,7 +433,7 @@ } define float @cos_test2(float %x) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cos_test2 ; CHECK-SAME: (float [[X:%.*]]) #[[ATTR15]] { ; CHECK-NEXT: [[C:%.*]] = call nofpclass(inf) float @llvm.cos.f32(float [[X]]) #[[ATTR20]] @@ -443,22 +443,22 @@ ret float %c } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } -; CHECK: attributes #[[ATTR2]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } +; CHECK: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) uwtable } +; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) uwtable } ; CHECK: attributes #[[ATTR3]] = { noinline nosync nounwind uwtable } ; CHECK: attributes #[[ATTR4]] = { noinline nounwind uwtable } ; CHECK: attributes #[[ATTR5]] = { nofree noinline nounwind memory(argmem: readwrite) uwtable } -; CHECK: attributes #[[ATTR6]] = { nofree norecurse nounwind willreturn } +; CHECK: attributes #[[ATTR6]] = { mustprogress nofree norecurse nounwind willreturn } ; CHECK: attributes #[[ATTR7]] = { nofree norecurse nounwind } -; CHECK: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind willreturn } +; CHECK: attributes #[[ATTR8]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; CHECK: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind } -; CHECK: attributes #[[ATTR10]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } -; CHECK: attributes #[[ATTR11]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CHECK: attributes #[[ATTR10]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; CHECK: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CHECK: attributes #[[ATTR12:[0-9]+]] = { convergent memory(none) } ; CHECK: attributes #[[ATTR13]] = { memory(none) } ; CHECK: attributes #[[ATTR14]] = { nounwind } -; CHECK: attributes #[[ATTR15]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR15]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CHECK: attributes #[[ATTR16:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; CHECK: attributes #[[ATTR17:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } ; CHECK: attributes #[[ATTR18:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } diff --git a/llvm/test/Transforms/Attributor/nounwind.ll b/llvm/test/Transforms/Attributor/nounwind.ll --- a/llvm/test/Transforms/Attributor/nounwind.ll +++ b/llvm/test/Transforms/Attributor/nounwind.ll @@ -4,7 +4,7 @@ ; TEST 1 define i32 @foo1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@foo1 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret i32 1 @@ -14,12 +14,12 @@ ; TEST 2 define i32 @scc1_foo() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@scc1_foo ; TUNIT-SAME: () #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@scc1_foo ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret i32 1 @@ -31,12 +31,12 @@ ; TEST 3 define i32 @scc1_bar() { -; TUNIT: Function Attrs: nofree nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@scc1_bar ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@scc1_bar ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret i32 1 @@ -145,8 +145,8 @@ declare void @__cxa_end_catch() ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ;. diff --git a/llvm/test/Transforms/Attributor/pointer-info.ll b/llvm/test/Transforms/Attributor/pointer-info.ll --- a/llvm/test/Transforms/Attributor/pointer-info.ll +++ b/llvm/test/Transforms/Attributor/pointer-info.ll @@ -6,7 +6,7 @@ %struct.test.a = type { %struct.test.b, i32, ptr} define void @foo(ptr %ptr) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (ptr nocapture nofree readnone [[PTR:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -17,7 +17,7 @@ ; TUNIT-NEXT: tail call void @bar(ptr noalias nocapture nofree noundef nonnull readonly byval([[STRUCT_TEST_A]]) align 8 dereferenceable(24) [[TMP0]]) #[[ATTR2:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (ptr nocapture nofree writeonly [[PTR:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -41,7 +41,7 @@ } define void @bar(ptr noundef byval(%struct.test.a) align 8 %dev) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@bar ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly byval([[STRUCT_TEST_A:%.*]]) align 8 dereferenceable(24) [[DEV:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [[STRUCT_TEST_B:%.*]], ptr [[DEV]], i64 0, i32 1 @@ -53,11 +53,11 @@ ret void } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR2]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/potential.ll b/llvm/test/Transforms/Attributor/potential.ll --- a/llvm/test/Transforms/Attributor/potential.ll +++ b/llvm/test/Transforms/Attributor/potential.ll @@ -9,7 +9,7 @@ ; bool potential_test1(bool c) { return iszero(c ? 1 : -1); } define internal i1 @iszero1(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@iszero1 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -20,12 +20,12 @@ } define i1 @potential_test1(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test1 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: ret i1 false ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test1 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[ARG:%.*]] = select i1 [[C]], i32 -1, i32 1 @@ -47,7 +47,7 @@ ; int potential_test2(int x) { return call_with_two_values(1) + call_with_two_values(-1); } define internal i32 @iszero2(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@iszero2 ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -60,7 +60,7 @@ } define internal i32 @call_with_two_values(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@call_with_two_values ; TUNIT-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call i32 @iszero2(i32 noundef [[C]]) #[[ATTR1:[0-9]+]], !range [[RNG0:![0-9]+]] @@ -69,7 +69,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = add i32 [[CSRET1]], [[CSRET2]] ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@call_with_two_values ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @iszero2(i32 noundef [[C]]) #[[ATTR2]] @@ -86,7 +86,7 @@ } define i32 @potential_test2(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test2 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call i32 @call_with_two_values(i32 noundef 1) #[[ATTR1]], !range [[RNG1:![0-9]+]] @@ -94,7 +94,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = add i32 [[CSRET1]], [[CSRET2]] ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test2 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @call_with_two_values(i32 noundef 1) #[[ATTR2]] @@ -120,7 +120,7 @@ ; int potential_test3() { return zero_or_one(iszero(0))+zero_or_one(iszero(1)); } define internal i32 @iszero3(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@iszero3 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -133,7 +133,7 @@ } define internal i32 @less_than_two(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@less_than_two ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp slt i32 [[C]], 2 @@ -146,12 +146,12 @@ } define i32 @potential_test3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test3 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret i32 2 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test3 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: [[CMP1:%.*]] = call i32 @iszero3(i32 noundef 0) #[[ATTR2]] @@ -181,7 +181,7 @@ ; int potential_test7(int c) { return return1or3(c) == return3or4(c); } define i32 @potential_test4(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test4 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR1]] @@ -189,7 +189,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = zext i1 [[FALSE]] to i32 ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test4 ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR2]] @@ -204,7 +204,7 @@ } define i32 @potential_test5(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test5 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR1]] @@ -213,7 +213,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = zext i1 [[FALSE]] to i32 ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test5 ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR2]] @@ -230,14 +230,14 @@ } define i1 @potential_test6(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test6 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR1]] ; TUNIT-NEXT: [[RET:%.*]] = icmp eq i32 [[CSRET1]], 3 ; TUNIT-NEXT: ret i1 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test6 ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR2]] @@ -250,7 +250,7 @@ } define i1 @potential_test7(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test7 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR1]] @@ -258,7 +258,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = icmp eq i32 [[CSRET1]], [[CSRET2]] ; TUNIT-NEXT: ret i1 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test7 ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @return1or3(i32 [[C]]) #[[ATTR2]] @@ -273,7 +273,7 @@ } define internal i32 @return1or3(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@return1or3 ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -286,7 +286,7 @@ } define internal i32 @return2or4(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@return2or4 ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -299,7 +299,7 @@ } define internal i32 @return3or4(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@return3or4 ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 0 @@ -316,7 +316,7 @@ ; propagate argument to callsite argument define internal i1 @cmp_with_four(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cmp_with_four ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp eq i32 [[C]], 4 @@ -327,7 +327,7 @@ } define internal i1 @wrapper(i32 %c) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@wrapper ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[RET:%.*]] = call i1 @cmp_with_four(i32 noundef [[C]]) #[[ATTR2]] @@ -338,12 +338,12 @@ } define i1 @potential_test8() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test8 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret i1 false ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test8 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: [[RES1:%.*]] = call i1 @wrapper(i32 noundef 1) #[[ATTR2]] @@ -362,7 +362,7 @@ } define i1 @potential_test9() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@potential_test9 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -405,7 +405,7 @@ ; and returned value of @potential_test10 can be simplified to 0(false) define internal i32 @may_return_undef(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@may_return_undef ; CHECK-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: switch i32 [[C]], label [[OTHERWISE:%.*]] [ @@ -430,14 +430,14 @@ } define i1 @potential_test10(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test10 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[RET:%.*]] = call i32 @may_return_undef(i32 [[C]]) #[[ATTR1]] ; TUNIT-NEXT: [[CMP:%.*]] = icmp eq i32 [[RET]], 0 ; TUNIT-NEXT: ret i1 [[CMP]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test10 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[RET:%.*]] = call i32 @may_return_undef(i32 noundef [[C]]) #[[ATTR2]] @@ -450,7 +450,7 @@ } define i32 @optimize_undef_1(i1 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@optimize_undef_1 ; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -469,7 +469,7 @@ } define i32 @optimize_undef_2(i1 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@optimize_undef_2 ; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -488,7 +488,7 @@ } define i32 @optimize_undef_3(i1 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@optimize_undef_3 ; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -511,7 +511,7 @@ ; FIXME: returned value can be simplified to 0 define i32 @potential_test11(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test11 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[ZERO1:%.*]] = call i32 @optimize_undef_1(i1 [[C]]) #[[ATTR1]], !range [[RNG0]] @@ -521,7 +521,7 @@ ; TUNIT-NEXT: [[ACC2:%.*]] = add i32 [[ACC1]], [[ZERO3]] ; TUNIT-NEXT: ret i32 [[ACC2]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test11 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[ZERO1:%.*]] = call i32 @optimize_undef_1(i1 noundef [[C]]) #[[ATTR2]] @@ -540,7 +540,7 @@ } define i32 @optimize_poison_1(i1 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@optimize_poison_1 ; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -560,12 +560,12 @@ ; FIXME: returned value can be simplified to 0 define i32 @potential_test12(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test12 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test12 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[ZERO:%.*]] = call i32 @optimize_poison_1(i1 noundef [[C]]) #[[ATTR2]] @@ -581,7 +581,7 @@ ; However, we should not simplify `and i32 %c, 3` to `%c` define internal i32 @potential_test13_callee(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@potential_test13_callee ; CHECK-SAME: (i32 [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[RET:%.*]] = and i32 [[C]], 3 @@ -592,13 +592,13 @@ } define i32 @potential_test13_caller1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test13_caller1 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 noundef 0) #[[ATTR1]], !range [[RNG0]] ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test13_caller1 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 noundef 0) #[[ATTR2]] @@ -609,13 +609,13 @@ } define i32 @potential_test13_caller2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test13_caller2 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 noundef 1) #[[ATTR1]], !range [[RNG0]] ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test13_caller2 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 noundef 1) #[[ATTR2]] @@ -626,13 +626,13 @@ } define i32 @potential_test13_caller3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@potential_test13_caller3 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 undef) #[[ATTR1]], !range [[RNG0]] ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@potential_test13_caller3 ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: [[RET:%.*]] = call i32 @potential_test13_callee(i32 undef) #[[ATTR2]] @@ -643,7 +643,7 @@ } define i1 @potential_test14(i1 %c0, i1 %c1, i1 %c2, i1 %c3) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@potential_test14 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[X0:%.*]] = select i1 [[C0]], i32 0, i32 1 @@ -662,7 +662,7 @@ } define i1 @potential_test15(i1 %c0, i1 %c1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@potential_test15 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[X0:%.*]] = select i1 [[C0]], i32 0, i32 1 @@ -677,7 +677,7 @@ } define i1 @potential_test16(i1 %c0, i1 %c1) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@potential_test16 ; CHECK-SAME: (i1 [[C0:%.*]], i1 [[C1:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[X1:%.*]] = select i1 [[C1]], i32 0, i32 1 @@ -691,11 +691,11 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { 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 } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { willreturn } ;. ; TUNIT: [[RNG0]] = !{i32 0, i32 2} diff --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll --- a/llvm/test/Transforms/Attributor/range.ll +++ b/llvm/test/Transforms/Attributor/range.ll @@ -5,7 +5,7 @@ ; FIXME: CGSCC is not looking at callees and calleers even though it could be allowed. define i32 @test0(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@test0 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0:![0-9]+]] @@ -16,13 +16,13 @@ } define i32 @test0-range-check(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test0-range-check ; TUNIT-SAME: (ptr nocapture nofree readonly align 4 [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[A:%.*]] = tail call i32 @test0(ptr nocapture nofree readonly align 4 [[P]]) #[[ATTR3:[0-9]+]], !range [[RNG0]] ; TUNIT-NEXT: ret i32 [[A]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test0-range-check ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: [[A:%.*]] = tail call i32 @test0(ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P]]) #[[ATTR5:[0-9]+]] @@ -269,7 +269,7 @@ ret void } define i32 @test1(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@test1 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[LOAD_10_100:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG1:![0-9]+]] @@ -285,14 +285,14 @@ define i1 @test1-check(ptr %p) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test1-check ; TUNIT-SAME: (ptr nocapture nofree readonly align 4 [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[RES:%.*]] = tail call i32 @test1(ptr nocapture nofree readonly align 4 [[P]]) #[[ATTR3]], !range [[RNG2:![0-9]+]] ; TUNIT-NEXT: [[CMP:%.*]] = icmp eq i32 [[RES]], 500 ; TUNIT-NEXT: ret i1 [[CMP]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test1-check ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[RES:%.*]] = tail call i32 @test1(ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P]]) #[[ATTR5]] @@ -317,7 +317,7 @@ ; } define i32 @test2(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -334,7 +334,7 @@ } define i32 @test2_check(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@test2_check ; TUNIT-SAME: (ptr nocapture nofree readonly align 4 [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -349,7 +349,7 @@ ; TUNIT-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ] ; TUNIT-NEXT: ret i32 [[RETVAL_0]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@test2_check ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -408,7 +408,7 @@ declare dso_local void @unkown() define internal i32 @r1(i32) local_unnamed_addr { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@r1 ; TUNIT-SAME: () local_unnamed_addr #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: br label [[TMP4:%.*]] @@ -427,7 +427,7 @@ ; TUNIT-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100 ; TUNIT-NEXT: br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@r1 ; CGSCC-SAME: () local_unnamed_addr #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: br label [[TMP4:%.*]] @@ -510,7 +510,7 @@ ; } ; } define dso_local i32 @test4-f1(i32 %u) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4-f1 ; TUNIT-SAME: (i32 [[U:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -522,7 +522,7 @@ ; TUNIT-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[U]], [[IF_THEN]] ], [ 0, [[ENTRY:%.*]] ] ; TUNIT-NEXT: ret i32 [[RETVAL_0]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4-f1 ; CGSCC-SAME: (i32 [[U:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -549,14 +549,14 @@ define dso_local i32 @test4-g1(i32 %u) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4-g1 ; TUNIT-SAME: (i32 [[U:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[CALL:%.*]] = tail call i32 @test4-f1(i32 [[U]]) #[[ATTR3]] ; TUNIT-NEXT: ret i32 [[CALL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4-g1 ; CGSCC-SAME: (i32 [[U:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -579,7 +579,7 @@ ; } ; } define dso_local i32 @test4-f2(i32 %u) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4-f2 ; TUNIT-SAME: (i32 [[U:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -594,7 +594,7 @@ ; TUNIT-NEXT: [[RETVAL_0:%.*]] = phi i32 [ [[ADD]], [[IF_THEN]] ], [ 1, [[IF_ELSE]] ] ; TUNIT-NEXT: ret i32 [[RETVAL_0]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4-f2 ; CGSCC-SAME: (i32 [[U:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -627,14 +627,14 @@ define dso_local i32 @test4-g2(i32 %u) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test4-g2 ; TUNIT-SAME: (i32 [[U:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) #[[ATTR3]], !range [[RNG3:![0-9]+]] ; TUNIT-NEXT: ret i32 [[CALL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test4-g2 ; CGSCC-SAME: (i32 [[U:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -718,7 +718,7 @@ ; FIXME: All but the return is not needed anymore define dso_local zeroext i1 @phi(i32 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@phi ; TUNIT-SAME: (i32 [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: bb: @@ -750,7 +750,7 @@ ; TUNIT-NEXT: [[DOT0:%.*]] = phi i1 [ true, [[BB11]] ], [ false, [[BB12]] ] ; TUNIT-NEXT: ret i1 [[DOT0]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@phi ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: bb: @@ -822,7 +822,7 @@ } define dso_local i1 @select(i32 %a) local_unnamed_addr #0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@select ; TUNIT-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -834,7 +834,7 @@ ; TUNIT-NEXT: [[CMP6:%.*]] = icmp eq i32 [[Y_0]], 5 ; TUNIT-NEXT: ret i1 [[CMP6]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@select ; CGSCC-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -857,7 +857,7 @@ } define dso_local i32 @select_zext(i32 %a) local_unnamed_addr #0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@select_zext ; TUNIT-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -870,7 +870,7 @@ ; TUNIT-NEXT: [[DOT13:%.*]] = zext i1 [[CMP6]] to i32 ; TUNIT-NEXT: ret i32 [[DOT13]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@select_zext ; CGSCC-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -895,7 +895,7 @@ } define dso_local i64 @select_int2ptr_bitcast_ptr2int(i32 %a) local_unnamed_addr #0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@select_int2ptr_bitcast_ptr2int ; TUNIT-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -909,7 +909,7 @@ ; TUNIT-NEXT: [[P2I:%.*]] = ptrtoint ptr [[I2P]] to i64 ; TUNIT-NEXT: ret i64 [[P2I]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@select_int2ptr_bitcast_ptr2int ; CGSCC-SAME: (i32 [[A:%.*]]) local_unnamed_addr #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -938,14 +938,14 @@ ; } define i1 @f_fcmp(float %a, float %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@f_fcmp ; TUNIT-SAME: (float [[A:%.*]], float [[B:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R:%.*]] = fcmp uge float [[A]], [[B]] ; TUNIT-NEXT: [[S:%.*]] = select i1 [[R]], i1 [[R]], i1 false ; TUNIT-NEXT: ret i1 [[S]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@f_fcmp ; CGSCC-SAME: (float [[A:%.*]], float [[B:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = fcmp uge float [[A]], [[B]] @@ -957,14 +957,14 @@ ret i1 %s } define i1 @d_fcmp(double %a, double %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@d_fcmp ; TUNIT-SAME: (double [[A:%.*]], double [[B:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R:%.*]] = fcmp oeq double [[A]], [[B]] ; TUNIT-NEXT: [[S:%.*]] = select i1 [[R]], i1 [[R]], i1 false ; TUNIT-NEXT: ret i1 [[S]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@d_fcmp ; CGSCC-SAME: (double [[A:%.*]], double [[B:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = fcmp oeq double [[A]], [[B]] @@ -976,14 +976,14 @@ ret i1 %s } define i1 @dp_icmp(ptr %a, ptr %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@dp_icmp ; TUNIT-SAME: (ptr nofree readnone [[A:%.*]], ptr nofree readnone [[B:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R:%.*]] = icmp sge ptr [[A]], [[B]] ; TUNIT-NEXT: [[S:%.*]] = select i1 [[R]], i1 [[R]], i1 false ; TUNIT-NEXT: ret i1 [[S]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@dp_icmp ; CGSCC-SAME: (ptr nofree readnone [[A:%.*]], ptr nofree readnone [[B:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = icmp sge ptr [[A]], [[B]] @@ -995,14 +995,14 @@ ret i1 %s } define i1 @ip_icmp(ptr %a, ptr %b) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ip_icmp ; TUNIT-SAME: (ptr nofree readnone [[A:%.*]], ptr nofree readnone [[B:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R:%.*]] = icmp ult ptr [[A]], [[B]] ; TUNIT-NEXT: [[S:%.*]] = select i1 [[R]], i1 [[R]], i1 false ; TUNIT-NEXT: ret i1 [[S]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ip_icmp ; CGSCC-SAME: (ptr nofree readnone [[A:%.*]], ptr nofree readnone [[B:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = icmp ult ptr [[A]], [[B]] @@ -1014,7 +1014,7 @@ ret i1 %s } define i1 @fcmp_caller(float %fa, float %fb, double %da, double %db, ptr %dpa, ptr %dpb, ptr %ipa, ptr %ipb) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@fcmp_caller ; TUNIT-SAME: (float [[FA:%.*]], float [[FB:%.*]], double [[DA:%.*]], double [[DB:%.*]], ptr nofree readnone [[DPA:%.*]], ptr nofree readnone [[DPB:%.*]], ptr nofree readnone [[IPA:%.*]], ptr nofree readnone [[IPB:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R1:%.*]] = call i1 @f_fcmp(float [[FA]], float [[FB]]) #[[ATTR3]] @@ -1026,7 +1026,7 @@ ; TUNIT-NEXT: [[O3:%.*]] = or i1 [[O1]], [[O2]] ; TUNIT-NEXT: ret i1 [[O3]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@fcmp_caller ; CGSCC-SAME: (float [[FA:%.*]], float [[FB:%.*]], double [[DA:%.*]], double [[DB:%.*]], ptr nofree readnone [[DPA:%.*]], ptr nofree readnone [[DPB:%.*]], ptr nofree readnone [[IPA:%.*]], ptr nofree readnone [[IPB:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[R1:%.*]] = call i1 @f_fcmp(float [[FA]], float [[FB]]) #[[ATTR5]] @@ -1049,12 +1049,12 @@ } define i8 @ret_two() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ret_two ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 2 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ret_two ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: ret i8 2 @@ -1062,12 +1062,12 @@ ret i8 2 } define i8 @ret_undef() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ret_undef ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 undef ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ret_undef ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: ret i8 undef @@ -1077,12 +1077,12 @@ ; Verify we collapse undef to a value and return something non-undef here. define i8 @undef_collapse_1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@undef_collapse_1 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@undef_collapse_1 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[C:%.*]] = call i8 @ret_undef() #[[ATTR5]] @@ -1096,12 +1096,12 @@ ; Verify we collapse undef to a value and return something non-undef here. define i8 @undef_collapse_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@undef_collapse_2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@undef_collapse_2 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[C:%.*]] = call i8 @ret_two() #[[ATTR5]] @@ -1115,12 +1115,12 @@ define i8 @undef_collapse_caller() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@undef_collapse_caller ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@undef_collapse_caller ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[C1:%.*]] = call i8 @undef_collapse_1() #[[ATTR5]] @@ -1135,13 +1135,13 @@ } define i32 @ret1or2(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ret1or2 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[S:%.*]] = select i1 [[C]], i32 1, i32 2 ; TUNIT-NEXT: ret i32 [[S]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ret1or2 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[S:%.*]] = select i1 [[C]], i32 1, i32 2 @@ -1152,7 +1152,7 @@ } define i1 @callee_range_1(i1 %c1, i1 %c2, i1 %c3) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callee_range_1 ; TUNIT-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #[[ATTR3]] @@ -1164,7 +1164,7 @@ ; TUNIT-NEXT: [[F:%.*]] = and i1 [[I1]], [[I2]] ; TUNIT-NEXT: ret i1 [[F]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callee_range_1 ; CGSCC-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #[[ATTR5]] @@ -1188,7 +1188,7 @@ define i1 @callee_range_2(i1 %c1, i1 %c2) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@callee_range_2 ; TUNIT-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #[[ATTR3]] @@ -1199,7 +1199,7 @@ ; TUNIT-NEXT: [[F:%.*]] = and i1 [[I1]], [[I2]] ; TUNIT-NEXT: ret i1 [[F]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callee_range_2 ; CGSCC-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #[[ATTR5]] @@ -1221,12 +1221,12 @@ define i32 @ret100() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ret100 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i32 100 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ret100 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: ret i32 100 @@ -1236,7 +1236,7 @@ define i1 @ctx_adjustment(i32 %V) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ctx_adjustment ; TUNIT-SAME: (i32 [[V:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[C1:%.*]] = icmp sge i32 [[V]], 100 @@ -1250,7 +1250,7 @@ ; TUNIT-NEXT: [[C2:%.*]] = icmp sge i32 [[PHI]], 100 ; TUNIT-NEXT: ret i1 [[C2]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ctx_adjustment ; CGSCC-SAME: (i32 [[V:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[C1:%.*]] = icmp sge i32 [[V]], 100 @@ -1280,13 +1280,13 @@ define i32 @func(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@func ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[RET:%.*]] = select i1 [[C]], i32 0, i32 1 ; TUNIT-NEXT: ret i32 [[RET]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@func ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[RET:%.*]] = select i1 [[C]], i32 0, i32 1 @@ -1297,7 +1297,7 @@ } define i32 @simplify_callsite_argument(i1 %d) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@simplify_callsite_argument ; TUNIT-SAME: (i1 [[D:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[C:%.*]] = select i1 [[D]], i1 true, i1 false @@ -1309,7 +1309,7 @@ ; TUNIT-NEXT: [[RET2:%.*]] = call i32 @func(i1 noundef false) #[[ATTR3]] ; TUNIT-NEXT: ret i32 [[RET2]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@simplify_callsite_argument ; CGSCC-SAME: (i1 [[D:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[C:%.*]] = select i1 [[D]], i1 true, i1 false @@ -1333,7 +1333,7 @@ define internal i32 @less_than_65536(i32 %arg) { ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@less_than_65536 ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[SHRINKED:%.*]] = udiv i32 [[ARG]], 65536 @@ -1344,7 +1344,7 @@ } define internal i1 @is_less_than_65536(i32 %arg) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@is_less_than_65536 ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp ult i32 [[ARG]], 65536 @@ -1355,12 +1355,12 @@ } define i1 @check_divided_range(i32 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@check_divided_range ; TUNIT-SAME: (i32 [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@check_divided_range ; CGSCC-SAME: (i32 [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @less_than_65536(i32 noundef 0) #[[ATTR5]] @@ -1380,7 +1380,7 @@ define internal i32 @cast_and_return(i1 %c) { ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cast_and_return ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[RET:%.*]] = zext i1 [[C]] to i32 @@ -1391,7 +1391,7 @@ } define internal i1 @is_less_than_3(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@is_less_than_3 ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp slt i32 [[C]], 3 @@ -1402,12 +1402,12 @@ } define i1 @check_casted_range(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@check_casted_range ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@check_casted_range ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @cast_and_return(i1 noundef true) #[[ATTR5]] @@ -1424,7 +1424,7 @@ } define internal i32 @less_than_100_1(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@less_than_100_1 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: switch i32 [[C]], label [[OTHERWISE:%.*]] [ @@ -1479,7 +1479,7 @@ } define internal i1 @is_less_than_100_1(i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@is_less_than_100_1 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp slt i32 [[C]], 100 @@ -1490,12 +1490,12 @@ } define i1 @propagate_range1(i32 %c){ -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@propagate_range1 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@propagate_range1 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[CSRET:%.*]] = call i32 @less_than_100_1(i32 noundef [[C]]) #[[ATTR5]] @@ -1509,7 +1509,7 @@ define internal i32 @less_than_100_2(i32 %c) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@less_than_100_2 ; TUNIT-SAME: (i32 noundef [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: switch i32 [[C]], label [[OTHERWISE:%.*]] [ @@ -1538,7 +1538,7 @@ ; TUNIT: otherwise: ; TUNIT-NEXT: ret i32 99 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@less_than_100_2 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: switch i32 [[C]], label [[OTHERWISE:%.*]] [ @@ -1594,13 +1594,13 @@ define internal i1 @is_less_than_100_2(i32 %c) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@is_less_than_100_2 ; TUNIT-SAME: (i32 noundef [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[CMP:%.*]] = icmp slt i32 [[C]], 100 ; TUNIT-NEXT: ret i1 [[CMP]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@is_less_than_100_2 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CMP:%.*]] = icmp slt i32 [[C]], 100 @@ -1611,7 +1611,7 @@ } define i1 @propagate_range2(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@propagate_range2 ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[CSRET1:%.*]] = call noundef i32 @less_than_100_2(i32 noundef 0) #[[ATTR3]] @@ -1621,7 +1621,7 @@ ; TUNIT-NEXT: [[TRUE:%.*]] = and i1 [[TRUE1]], [[TRUE2]] ; TUNIT-NEXT: ret i1 [[TRUE]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@propagate_range2 ; CGSCC-SAME: (i32 noundef [[C:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[CSRET1:%.*]] = call i32 @less_than_100_2(i32 noundef 0) #[[ATTR5]] @@ -1640,13 +1640,13 @@ } define internal i1 @non_zero(i8 %v) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@non_zero ; TUNIT-SAME: (i8 [[V:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[R:%.*]] = icmp ne i8 [[V]], 0 ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@non_zero ; CGSCC-SAME: (i8 [[V:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = icmp ne i8 [[V]], 0 @@ -1658,7 +1658,7 @@ ; Avoid range metadata for %l below define i1 @context(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@context ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[L:%.*]] = load i8, ptr [[P]], align 1 @@ -1670,7 +1670,7 @@ ; TUNIT: f: ; TUNIT-NEXT: ret i1 false ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@context ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: [[L:%.*]] = load i8, ptr [[P]], align 1 @@ -1807,15 +1807,15 @@ !0 = !{i32 0, i32 10} !1 = !{i32 10, i32 100} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR5]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll b/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll --- a/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll +++ b/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll @@ -225,7 +225,7 @@ } define ptr @external_sink_ret2_nrw(ptr %n0, ptr %r0, ptr %w0) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@external_sink_ret2_nrw ; CHECK-SAME: (ptr nofree [[N0:%.*]], ptr nocapture nofree readonly [[R0:%.*]], ptr nofree returned writeonly "no-capture-maybe-returned" [[W0:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -351,13 +351,13 @@ ; for a subset relation. ;. ; TUNIT: attributes #[[ATTR0]] = { nofree nosync nounwind memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn } ;. ; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind } ; CGSCC: attributes #[[ATTR3]] = { nounwind } ; CGSCC: attributes #[[ATTR4]] = { nounwind memory(readwrite) } diff --git a/llvm/test/Transforms/Attributor/readattrs.ll b/llvm/test/Transforms/Attributor/readattrs.ll --- a/llvm/test/Transforms/Attributor/readattrs.ll +++ b/llvm/test/Transforms/Attributor/readattrs.ll @@ -26,7 +26,7 @@ } define ptr @test2(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@test2 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: store i32 0, ptr @x, align 4 @@ -37,7 +37,7 @@ } define i1 @test3(ptr %p, ptr %q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test3 ; CHECK-SAME: (ptr nofree readnone [[P:%.*]], ptr nofree readnone [[Q:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[A:%.*]] = icmp ult ptr [[P]], [[Q]] @@ -62,7 +62,7 @@ ; Missed optz'n: we could make %q readnone, but don't break test6! define void @test5(ptr %p, ptr %q) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@test5 ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[P:%.*]], ptr nofree writeonly [[Q:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: store ptr [[Q]], ptr [[P]], align 8 @@ -88,7 +88,7 @@ ; inalloca parameters are always considered written define void @test7_1(ptr inalloca(i32) %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test7_1 ; CHECK-SAME: (ptr nocapture nofree nonnull writeonly inalloca(i32) dereferenceable(4) [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: ret void @@ -97,7 +97,7 @@ } define ptr @test8_1(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test8_1 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -108,14 +108,14 @@ } define void @test8_2(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test8_2 ; TUNIT-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: store i32 10, ptr [[P]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test8_2 ; CGSCC-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -135,13 +135,13 @@ ; CHECK-NOT: readnone ; CHECK-NOT: readonly define void @test9(<4 x ptr> %ptrs, <4 x i32>%val) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@test9 ; TUNIT-SAME: (<4 x ptr> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL]], <4 x ptr> [[PTRS]], i32 noundef 4, <4 x i1> noundef ) #[[ATTR12:[0-9]+]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@test9 ; CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: call void @llvm.masked.scatter.v4i32.v4p0(<4 x i32> [[VAL]], <4 x ptr> [[PTRS]], i32 noundef 4, <4 x i1> noundef ) #[[ATTR13]] @@ -154,13 +154,13 @@ ; CHECK: declare <4 x i32> @llvm.masked.gather declare <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr>, i32, <4 x i1>, <4 x i32>) define <4 x i32> @test10(<4 x ptr> %ptrs) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@test10 ; TUNIT-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR6:[0-9]+]] { ; TUNIT-NEXT: [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> [[PTRS]], i32 noundef 4, <4 x i1> noundef , <4 x i32> undef) #[[ATTR12]] ; TUNIT-NEXT: ret <4 x i32> [[RES]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@test10 ; CGSCC-SAME: (<4 x ptr> [[PTRS:%.*]]) #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0(<4 x ptr> [[PTRS]], i32 noundef 4, <4 x i1> noundef , <4 x i32> undef) #[[ATTR13]] @@ -209,13 +209,13 @@ } define i32 @volatile_load(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@volatile_load ; TUNIT-SAME: (ptr nofree noundef align 4 [[P:%.*]]) #[[ATTR9:[0-9]+]] { ; TUNIT-NEXT: [[LOAD:%.*]] = load volatile i32, ptr [[P]], align 4 ; TUNIT-NEXT: ret i32 [[LOAD]] ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@volatile_load ; CGSCC-SAME: (ptr nofree noundef align 4 [[P:%.*]]) #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: [[LOAD:%.*]] = load volatile i32, ptr [[P]], align 4 @@ -282,7 +282,7 @@ } define void @byval_not_readonly_2(ptr byval(i8) %written) readonly { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@byval_not_readonly_2 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly byval(i8) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1 @@ -310,7 +310,7 @@ } define void @byval_not_readnone_2(ptr byval(i8) %written) readnone { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@byval_not_readnone_2 ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly byval(i8) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1 @@ -321,7 +321,7 @@ } define void @byval_no_fnarg(ptr byval(i8) %written) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@byval_no_fnarg ; CHECK-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly byval(i8) dereferenceable(1) [[WRITTEN:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: store i8 0, ptr [[WRITTEN]], align 1 @@ -392,7 +392,7 @@ @constant_mem = external dso_local constant i32, align 4 define i32 @read_only_constant_mem() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@read_only_constant_mem ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: [[L:%.*]] = load i32, ptr @constant_mem, align 4 @@ -402,32 +402,32 @@ ret i32 %l } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR2]] = { memory(read) } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR4:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(write) } ; TUNIT: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(read) } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; TUNIT: attributes #[[ATTR7]] = { nounwind memory(argmem: read) } ; TUNIT: attributes #[[ATTR8]] = { nounwind memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR9]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR9]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR10]] = { memory(none) } ; TUNIT: attributes #[[ATTR11]] = { nounwind memory(read) } ; TUNIT: attributes #[[ATTR12]] = { willreturn } ; TUNIT: attributes #[[ATTR13]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR2]] = { memory(read) } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR5:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR6:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(read) } -; CGSCC: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; CGSCC: attributes #[[ATTR8]] = { nounwind memory(argmem: read) } ; CGSCC: attributes #[[ATTR9]] = { nounwind memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR10]] = { nofree norecurse nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree norecurse nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR11]] = { memory(none) } ; CGSCC: attributes #[[ATTR12]] = { nounwind memory(read) } ; CGSCC: attributes #[[ATTR13]] = { willreturn } diff --git a/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll b/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll --- a/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll +++ b/llvm/test/Transforms/Attributor/reduced/assertion_unassigned_range.ll @@ -3,7 +3,7 @@ ; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC define i1 @_ZNK6openmc4Cell16contains_complexENS_8PositionES1_i() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@_ZNK6openmc4Cell16contains_complexENS_8PositionES1_i ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -18,7 +18,7 @@ ret i1 false } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll b/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll --- a/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll +++ b/llvm/test/Transforms/Attributor/reduced/pred_iterator_crash.ll @@ -22,7 +22,7 @@ } define internal fastcc void @__omp_outlined__() { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@__omp_outlined__ ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: br label [[TMP2:%.*]] @@ -46,7 +46,7 @@ ; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ;. ; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse 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: ; TUNIT: {{.*}} diff --git a/llvm/test/Transforms/Attributor/returned.ll b/llvm/test/Transforms/Attributor/returned.ll --- a/llvm/test/Transforms/Attributor/returned.ll +++ b/llvm/test/Transforms/Attributor/returned.ll @@ -41,7 +41,7 @@ ; CHECK: @[[_ZTI1Y:[a-zA-Z0-9_$"\\.-]+]] = external dso_local constant { ptr, ptr, ptr }, align 8 ;. define i32 @sink_r0(i32 %r) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@sink_r0 ; CHECK-SAME: (i32 returned [[R:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -325,7 +325,7 @@ ; return a == b ? r : ptr_scc_r2(a, b, r); ; } define ptr @ptr_sink_r0(ptr %r) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@ptr_sink_r0 ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[R:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -508,13 +508,13 @@ ; } ; define ptr @rt1(ptr %a) #0 { -; TUNIT: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@rt1 ; TUNIT-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@rt1 ; CGSCC-SAME: (ptr nocapture nofree nonnull readnone align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -791,7 +791,7 @@ ; } ; define double @select_and_phi(double %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@select_and_phi ; CHECK-SAME: (double returned [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -880,7 +880,7 @@ ; } ; define ptr @bitcast(ptr %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@bitcast ; CHECK-SAME: (ptr nofree readnone returned "no-capture-maybe-returned" [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -901,7 +901,7 @@ ; } ; define ptr @bitcasts_select_and_phi(ptr %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@bitcasts_select_and_phi ; CHECK-SAME: (ptr nofree readnone returned [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -939,7 +939,7 @@ ; } ; define ptr @ret_arg_arg_undef(ptr %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@ret_arg_arg_undef ; CHECK-SAME: (ptr nofree readnone returned [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -983,7 +983,7 @@ ; } ; define ptr @ret_undef_arg_arg(ptr %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@ret_undef_arg_arg ; CHECK-SAME: (ptr nofree readnone returned [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1027,7 +1027,7 @@ ; } ; define ptr @ret_undef_arg_undef(ptr %b) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@ret_undef_arg_undef ; CHECK-SAME: (ptr nofree readnone returned [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1158,7 +1158,7 @@ ; TEST inconsistent IR in dead code. ; define i32 @deadblockcall1(i32 %A) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@deadblockcall1 ; CHECK-SAME: (i32 returned [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1176,7 +1176,7 @@ declare i32 @deadblockcall_helper(i32 returned %A); define i32 @deadblockcall2(i32 %A) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@deadblockcall2 ; CHECK-SAME: (i32 returned [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1197,7 +1197,7 @@ } define i32 @deadblockphi1(i32 %A) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@deadblockphi1 ; CHECK-SAME: (i32 returned [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1223,7 +1223,7 @@ } define i32 @deadblockphi2(i32 %A) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@deadblockphi2 ; CHECK-SAME: (i32 returned [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: entry: @@ -1389,7 +1389,7 @@ @G = external global i8 define ptr @ret_const() #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@ret_const ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret ptr @G @@ -1397,12 +1397,12 @@ ret ptr @G } define ptr @use_const() #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@use_const ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret ptr @G ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@use_const ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef nonnull dereferenceable(1) ptr @ret_const() #[[ATTR9:[0-9]+]] @@ -1412,12 +1412,12 @@ ret ptr %c } define ptr @dont_use_const() #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@dont_use_const ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret ptr @G ; -; CGSCC: Function Attrs: nofree noinline nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@dont_use_const ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[C:%.*]] = musttail call noundef nonnull dereferenceable(1) ptr @ret_const() #[[ATTR9]] @@ -1469,26 +1469,26 @@ attributes #0 = { noinline nounwind uwtable } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR1]] = { nofree noinline nosync nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR2]] = { nofree noinline norecurse nosync nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR3]] = { nofree noinline nosync nounwind memory(argmem: read) uwtable } -; TUNIT: attributes #[[ATTR4]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR5]] = { noinline nounwind uwtable } ; TUNIT: attributes #[[ATTR6]] = { noinline norecurse nounwind uwtable } ; TUNIT: attributes #[[ATTR7]] = { noreturn } ; TUNIT: attributes #[[ATTR8]] = { norecurse } -; TUNIT: attributes #[[ATTR9:[0-9]+]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR9:[0-9]+]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR10]] = { nofree nosync nounwind } ; TUNIT: attributes #[[ATTR11]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind memory(none) uwtable } ; CGSCC: attributes #[[ATTR2]] = { nofree noinline nosync nounwind memory(argmem: read) uwtable } -; CGSCC: attributes #[[ATTR3]] = { nofree noinline nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree noinline nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR4]] = { noinline nounwind uwtable } ; CGSCC: attributes #[[ATTR5]] = { noreturn } -; CGSCC: attributes #[[ATTR6:[0-9]+]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR6:[0-9]+]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR7]] = { nofree nosync nounwind } ; CGSCC: attributes #[[ATTR8]] = { nounwind } ; CGSCC: attributes #[[ATTR9]] = { willreturn } diff --git a/llvm/test/Transforms/Attributor/undefined_behavior.ll b/llvm/test/Transforms/Attributor/undefined_behavior.ll --- a/llvm/test/Transforms/Attributor/undefined_behavior.ll +++ b/llvm/test/Transforms/Attributor/undefined_behavior.ll @@ -11,7 +11,7 @@ ; -- Load tests -- define void @load_wholly_unreachable() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@load_wholly_unreachable ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: unreachable @@ -21,7 +21,7 @@ } define void @loads_wholly_unreachable() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@loads_wholly_unreachable ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: unreachable @@ -33,7 +33,7 @@ define void @load_single_bb_unreachable(i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@load_single_bb_unreachable ; CHECK-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -53,7 +53,7 @@ ; Note that while the load is removed (because it's unused), the block ; is not changed to unreachable define void @load_null_pointer_is_defined() null_pointer_is_valid { -; CHECK: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@load_null_pointer_is_defined ; CHECK-SAME: () #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: ret void @@ -63,7 +63,7 @@ } define internal ptr @ret_null() { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ret_null ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: ret ptr null @@ -72,12 +72,12 @@ } define void @load_null_propagated() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@load_null_propagated ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@load_null_propagated ; CGSCC-SAME: () #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: ret void @@ -90,7 +90,7 @@ ; -- Store tests -- define void @store_wholly_unreachable() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@store_wholly_unreachable ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: unreachable @@ -100,13 +100,13 @@ } define void @store_wholly_unreachable_volatile() { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile ; TUNIT-SAME: () #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: store volatile i32 5, ptr null, align 4294967296 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@store_wholly_unreachable_volatile ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: store volatile i32 5, ptr null, align 4294967296 @@ -117,7 +117,7 @@ } define void @store_single_bb_unreachable(i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@store_single_bb_unreachable ; CHECK-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -135,13 +135,13 @@ } define void @store_null_pointer_is_defined() null_pointer_is_valid { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@store_null_pointer_is_defined ; TUNIT-SAME: () #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: store i32 5, ptr null, align 4294967296 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@store_null_pointer_is_defined ; CGSCC-SAME: () #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: store i32 5, ptr null, align 4294967296 @@ -155,12 +155,12 @@ ; ATTRIBUTOR-LABEL: @store_null_propagated( ; ATTRIBUTOR-NEXT: unreachable ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@store_null_propagated ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@store_null_propagated ; CGSCC-SAME: () #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: [[PTR:%.*]] = call noalias align 4294967296 ptr @ret_null() #[[ATTR10:[0-9]+]] @@ -174,12 +174,12 @@ ; -- AtomicRMW tests -- define void @atomicrmw_wholly_unreachable() { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable ; TUNIT-SAME: () #[[ATTR2]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: unreachable @@ -189,7 +189,7 @@ } define void @atomicrmw_single_bb_unreachable(i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable ; TUNIT-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -198,7 +198,7 @@ ; TUNIT: e: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable ; CGSCC-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -216,13 +216,13 @@ } define void @atomicrmw_null_pointer_is_defined() null_pointer_is_valid { -; TUNIT: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn ; TUNIT-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined ; TUNIT-SAME: () #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: [[A:%.*]] = atomicrmw add ptr null, i32 1 acquire, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn ; CGSCC-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined ; CGSCC-SAME: () #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: [[A:%.*]] = atomicrmw add ptr null, i32 1 acquire, align 4 @@ -236,12 +236,12 @@ ; ATTRIBUTOR-LABEL: @atomicrmw_null_propagated( ; ATTRIBUTOR-NEXT: unreachable ; -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomicrmw_null_propagated ; TUNIT-SAME: () #[[ATTR2]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@atomicrmw_null_propagated ; CGSCC-SAME: () #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: [[PTR:%.*]] = call noalias ptr @ret_null() #[[ATTR10]] @@ -256,12 +256,12 @@ ; -- AtomicCmpXchg tests -- define void @atomiccmpxchg_wholly_unreachable() { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable ; TUNIT-SAME: () #[[ATTR2]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: unreachable @@ -271,7 +271,7 @@ } define void @atomiccmpxchg_single_bb_unreachable(i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable ; TUNIT-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -280,7 +280,7 @@ ; TUNIT: e: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable ; CGSCC-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: br i1 [[COND]], label [[T:%.*]], label [[E:%.*]] @@ -298,13 +298,13 @@ } define void @atomiccmpxchg_null_pointer_is_defined() null_pointer_is_valid { -; TUNIT: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn ; TUNIT-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: [[A:%.*]] = cmpxchg ptr null, i32 2, i32 3 acq_rel monotonic, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nounwind null_pointer_is_valid willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn ; CGSCC-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: [[A:%.*]] = cmpxchg ptr null, i32 2, i32 3 acq_rel monotonic, align 4 @@ -318,12 +318,12 @@ ; ATTRIBUTOR-LABEL: @atomiccmpxchg_null_propagated( ; ATTRIBUTOR-NEXT: unreachable ; -; TUNIT: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated ; TUNIT-SAME: () #[[ATTR2]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated ; CGSCC-SAME: () #[[ATTR7]] { ; CGSCC-NEXT: [[PTR:%.*]] = call noalias ptr @ret_null() #[[ATTR10]] @@ -340,7 +340,7 @@ ; Note: The unreachable on %t and %e is _not_ from AAUndefinedBehavior define i32 @cond_br_on_undef() { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@cond_br_on_undef ; TUNIT-SAME: () #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: unreachable @@ -349,7 +349,7 @@ ; TUNIT: e: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cond_br_on_undef ; CGSCC-SAME: () #[[ATTR8:[0-9]+]] { ; CGSCC-NEXT: unreachable @@ -369,7 +369,7 @@ ; Valid branch - verify that this is not converted ; to unreachable. define void @cond_br_on_undef2(i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef2 ; CHECK-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]] @@ -394,7 +394,7 @@ } define i1 @ret_undef() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ret_undef ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret i1 undef @@ -403,7 +403,7 @@ } define void @cond_br_on_undef_interproc() { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: unreachable @@ -412,7 +412,7 @@ ; TUNIT: e: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[COND:%.*]] = call i1 @ret_undef() #[[ATTR10]] @@ -431,7 +431,7 @@ } define i1 @ret_undef2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ret_undef2 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: br i1 true, label [[T:%.*]], label [[E:%.*]] @@ -449,7 +449,7 @@ ; More complicated interproc deduction of undef define void @cond_br_on_undef_interproc2() { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2 ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: unreachable @@ -458,7 +458,7 @@ ; TUNIT: e: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[COND:%.*]] = call i1 @ret_undef2() #[[ATTR10]] @@ -479,7 +479,7 @@ ; Branch on undef that depends on propagation of ; undef of a previous instruction. define i32 @cond_br_on_undef3() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef3 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: [[COND:%.*]] = icmp ne i32 1, undef @@ -500,7 +500,7 @@ ; Branch on undef because of uninitialized value. ; FIXME: Currently it doesn't propagate the undef. define i32 @cond_br_on_undef_uninit() { -; TUNIT: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: unreachable @@ -509,7 +509,7 @@ ; TUNIT: e: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree norecurse noreturn nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit ; CGSCC-SAME: () #[[ATTR8]] { ; CGSCC-NEXT: unreachable @@ -533,7 +533,7 @@ ; MODULE-NOT: @callee( define internal i32 @callee(i1 %C, ptr %A) { ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callee ; CGSCC-SAME: () #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -555,12 +555,12 @@ } define i32 @foo() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[X:%.*]] = call noundef i32 @callee() #[[ATTR10]] @@ -575,13 +575,13 @@ ; Tests for argument position define void @arg_nonnull_1(ptr nonnull %a) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_1 ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6:[0-9]+]] { ; TUNIT-NEXT: store i32 0, ptr [[A]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_1 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR9:[0-9]+]] { ; CGSCC-NEXT: store i32 0, ptr [[A]], align 4 @@ -592,13 +592,13 @@ } define void @arg_nonnull_1_noundef_1(ptr nonnull noundef %a) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1 ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR6]] { ; TUNIT-NEXT: store i32 0, ptr [[A]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_1_noundef_1 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[A:%.*]]) #[[ATTR9]] { ; CGSCC-NEXT: store i32 0, ptr [[A]], align 4 @@ -609,7 +609,7 @@ } define void @arg_nonnull_12(ptr nonnull %a, ptr nonnull %b, ptr %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_12 ; TUNIT-SAME: (ptr nocapture nofree nonnull writeonly [[A:%.*]], ptr nocapture nofree nonnull writeonly [[B:%.*]], ptr nofree writeonly [[C:%.*]]) #[[ATTR6]] { ; TUNIT-NEXT: [[D:%.*]] = icmp eq ptr [[C]], null @@ -623,7 +623,7 @@ ; TUNIT: ret: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_12 ; CGSCC-SAME: (ptr nocapture nofree nonnull writeonly [[A:%.*]], ptr nocapture nofree nonnull writeonly [[B:%.*]], ptr nofree writeonly [[C:%.*]]) #[[ATTR9]] { ; CGSCC-NEXT: [[D:%.*]] = icmp eq ptr [[C]], null @@ -650,7 +650,7 @@ } define void @arg_nonnull_12_noundef_2(ptr nonnull %a, ptr noundef nonnull %b, ptr %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2 ; TUNIT-SAME: (ptr nocapture nofree nonnull writeonly [[A:%.*]], ptr nocapture nofree noundef nonnull writeonly [[B:%.*]], ptr nofree writeonly [[C:%.*]]) #[[ATTR6]] { ; TUNIT-NEXT: [[D:%.*]] = icmp eq ptr [[C]], null @@ -664,7 +664,7 @@ ; TUNIT: ret: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_12_noundef_2 ; CGSCC-SAME: (ptr nocapture nofree nonnull writeonly [[A:%.*]], ptr nocapture nofree noundef nonnull writeonly [[B:%.*]], ptr nofree writeonly [[C:%.*]]) #[[ATTR9]] { ; CGSCC-NEXT: [[D:%.*]] = icmp eq ptr [[C]], null @@ -692,12 +692,12 @@ ; Pass null directly to argument with nonnull attribute define void @arg_nonnull_violation1_1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation1_1 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: unreachable @@ -707,12 +707,12 @@ } define void @arg_nonnull_violation1_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2 ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation1_2 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: unreachable @@ -723,12 +723,12 @@ ; A case that depends on value simplification define void @arg_nonnull_violation2_1(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation2_1 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: unreachable @@ -739,12 +739,12 @@ } define void @arg_nonnull_violation2_2(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation2_2 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: unreachable @@ -756,7 +756,7 @@ ; Cases for single and multiple violation at a callsite define void @arg_nonnull_violation3_1(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1 ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[PTR:%.*]] = alloca i32, align 4 @@ -770,7 +770,7 @@ ; TUNIT: ret: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation3_1 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[PTR:%.*]] = alloca i32, align 4 @@ -803,7 +803,7 @@ } define void @arg_nonnull_violation3_2(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2 ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[PTR:%.*]] = alloca i32, align 4 @@ -817,7 +817,7 @@ ; TUNIT: ret: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@arg_nonnull_violation3_2 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[PTR:%.*]] = alloca i32, align 4 @@ -852,7 +852,7 @@ ; Tests for returned position define nonnull ptr @returned_nonnnull(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@returned_nonnnull ; CHECK-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ @@ -879,7 +879,7 @@ } define noundef ptr @returned_noundef(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@returned_noundef ; CHECK-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ @@ -906,7 +906,7 @@ } define nonnull noundef ptr @returned_nonnnull_noundef(i32 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@returned_nonnnull_noundef ; CHECK-SAME: (i32 noundef [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: switch i32 [[C]], label [[ONDEFAULT:%.*]] [ @@ -933,7 +933,7 @@ } define noundef i32 @returned_nonnnull_noundef_int() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@returned_nonnnull_noundef_int ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret i32 0 @@ -963,7 +963,7 @@ } define i32 @argument_noundef1(i32 noundef %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@argument_noundef1 ; CHECK-SAME: (i32 noundef returned [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret i32 [[C]] @@ -972,12 +972,12 @@ } define i32 @violate_noundef_nonpointer() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@violate_noundef_nonpointer ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret i32 undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@violate_noundef_nonpointer ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: unreachable @@ -987,7 +987,7 @@ } define ptr @argument_noundef2(ptr noundef %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@argument_noundef2 ; CHECK-SAME: (ptr nofree noundef readnone returned "no-capture-maybe-returned" [[C:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret ptr [[C]] @@ -996,12 +996,12 @@ } define ptr @violate_noundef_pointer() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@violate_noundef_pointer ; TUNIT-SAME: () #[[ATTR0]] { ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@violate_noundef_pointer ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: ret ptr undef @@ -1011,7 +1011,7 @@ } define internal noundef i32 @assumed_undef_is_ok(i1 %c, i32 %arg) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@assumed_undef_is_ok ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: br i1 [[C]], label [[REC:%.*]], label [[RET:%.*]] @@ -1033,12 +1033,12 @@ } define noundef i32 @assumed_undef_is_ok_caller(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@assumed_undef_is_ok_caller ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@assumed_undef_is_ok_caller ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CALL:%.*]] = call i32 @assumed_undef_is_ok(i1 noundef [[C]]) #[[ATTR10]] @@ -1049,25 +1049,25 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nounwind null_pointer_is_valid willreturn } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; TUNIT: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) } -; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nounwind null_pointer_is_valid willreturn } -; CGSCC: attributes #[[ATTR7]] = { nofree nounwind willreturn } -; CGSCC: attributes #[[ATTR8]] = { nofree norecurse noreturn nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR9]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind null_pointer_is_valid willreturn memory(write) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nounwind null_pointer_is_valid willreturn } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree nounwind willreturn } +; CGSCC: attributes #[[ATTR8]] = { mustprogress nofree norecurse noreturn nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR9]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } ; CGSCC: attributes #[[ATTR10]] = { willreturn } ; CGSCC: attributes #[[ATTR11]] = { nounwind willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/value-simplify-assume.ll b/llvm/test/Transforms/Attributor/value-simplify-assume.ll --- a/llvm/test/Transforms/Attributor/value-simplify-assume.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-assume.ll @@ -14,7 +14,7 @@ ; CHECK: @[[GSTATIC_INT2:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 0, align 4 ;. define i1 @readI1p(ptr %p) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CHECK-LABEL: define {{[^@]+}}@readI1p ; CHECK-SAME: (ptr nocapture nofree noundef nonnull readonly dereferenceable(1) [[P:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: [[L:%.*]] = load i1, ptr [[P]], align 1 @@ -44,13 +44,13 @@ } define i1 @drop_assume_1c_nr() norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@drop_assume_1c_nr ; TUNIT-SAME: () #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR6:[0-9]+]] ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@drop_assume_1c_nr ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR7:[0-9]+]] @@ -163,7 +163,7 @@ } define i1 @drop_assume_1_nr(i1 %arg) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@drop_assume_1_nr ; TUNIT-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -171,7 +171,7 @@ ; TUNIT-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR6]] ; TUNIT-NEXT: ret i1 [[ARG]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@drop_assume_1_nr ; CGSCC-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -268,7 +268,7 @@ } define i1 @assume_1_nr(i1 %arg, i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_1_nr ; TUNIT-SAME: (i1 returned [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -282,7 +282,7 @@ ; TUNIT: m: ; TUNIT-NEXT: ret i1 [[ARG]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_1_nr ; CGSCC-SAME: (i1 returned [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -312,7 +312,7 @@ } define void @assume_1b_nr(i1 %arg, i1 %cond) norecurse { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@assume_1b_nr ; CHECK-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3:[0-9]+]] { ; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]] @@ -339,7 +339,7 @@ } define i1 @assume_2_nr(i1 %arg, i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_2_nr ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -355,7 +355,7 @@ ; TUNIT-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR6]] ; TUNIT-NEXT: ret i1 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_2_nr ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -387,7 +387,7 @@ } define void @assume_2b_nr(i1 %arg, i1 %cond) norecurse { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@assume_2b_nr ; CHECK-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -416,7 +416,7 @@ } define i1 @assume_3_nr(i1 %arg, i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_3_nr ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -431,7 +431,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7:[0-9]+]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_3_nr ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -466,7 +466,7 @@ } define i1 @assume_4_nr(i1 %arg, i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_4_nr ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -483,7 +483,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_4_nr ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -518,7 +518,7 @@ } define i1 @assume_5_nr(i1 %arg, i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_5_nr ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -539,7 +539,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_5_nr ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -586,7 +586,7 @@ } define i1 @assume_5c_nr(i1 %cond) norecurse { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_5c_nr ; TUNIT-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -608,7 +608,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_5c_nr ; CGSCC-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -673,13 +673,13 @@ } define i1 @drop_assume_1c() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@drop_assume_1c ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR6]] ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@drop_assume_1c ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR7]] @@ -783,7 +783,7 @@ } define i1 @drop_assume_1(i1 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@drop_assume_1 ; TUNIT-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -791,7 +791,7 @@ ; TUNIT-NEXT: call void @llvm.assume(i1 noundef [[ARG]]) #[[ATTR6]] ; TUNIT-NEXT: ret i1 [[ARG]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@drop_assume_1 ; CGSCC-SAME: (i1 returned [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -885,7 +885,7 @@ } define i1 @assume_1(i1 %arg, i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_1 ; TUNIT-SAME: (i1 returned [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -899,7 +899,7 @@ ; TUNIT: m: ; TUNIT-NEXT: ret i1 [[ARG]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_1 ; CGSCC-SAME: (i1 returned [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -929,7 +929,7 @@ } define void @assume_1b(i1 %arg, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@assume_1b ; CHECK-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: br i1 [[COND]], label [[T:%.*]], label [[F:%.*]] @@ -956,7 +956,7 @@ } define i1 @assume_2(i1 %arg, i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_2 ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -972,7 +972,7 @@ ; TUNIT-NEXT: call void @llvm.assume(i1 noundef [[L]]) #[[ATTR6]] ; TUNIT-NEXT: ret i1 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_2 ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1004,7 +1004,7 @@ } define void @assume_2b(i1 %arg, i1 %cond) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CHECK-LABEL: define {{[^@]+}}@assume_2b ; CHECK-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; CHECK-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1033,7 +1033,7 @@ } define i1 @assume_3(i1 %arg, i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_3 ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1048,7 +1048,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_3 ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1083,7 +1083,7 @@ } define i1 @assume_4(i1 %arg, i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_4 ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1100,7 +1100,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_4 ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1135,7 +1135,7 @@ } define i1 @assume_5(i1 %arg, i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_5 ; TUNIT-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1156,7 +1156,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_5 ; CGSCC-SAME: (i1 [[ARG:%.*]], i1 noundef [[COND:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1203,7 +1203,7 @@ } define i1 @assume_5c(i1 %cond) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@assume_5c ; TUNIT-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1225,7 +1225,7 @@ ; TUNIT-NEXT: [[R:%.*]] = call i1 @readI1p(ptr noalias nocapture nofree noundef nonnull readonly dereferenceable(1) [[STACK]]) #[[ATTR7]] ; TUNIT-NEXT: ret i1 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@assume_5c ; CGSCC-SAME: (i1 noundef [[COND:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: [[STACK:%.*]] = alloca i1, align 1 @@ -1274,7 +1274,7 @@ define i32 @assume_read_global_good() { ; ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@assume_read_global_good ; TUNIT-SAME: () #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: [[LGS1:%.*]] = load i32, ptr @Gstatic_int1, align 4 @@ -1286,7 +1286,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add i32 [[LGS2]], [[LGS3]] ; TUNIT-NEXT: ret i32 [[ADD]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@assume_read_global_good ; CGSCC-SAME: () #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: [[LGS1:%.*]] = load i32, ptr @Gstatic_int1, align 4 @@ -1312,7 +1312,7 @@ ; TODO: Technically we could still utilize the assumption if we employ AA. define i32 @assume_read_global_bad(ptr %p) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@assume_read_global_bad ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[LGS1:%.*]] = load i32, ptr @Gstatic_int2, align 4 @@ -1323,7 +1323,7 @@ ; TUNIT-NEXT: store i32 17, ptr @Gstatic_int2, align 4 ; TUNIT-NEXT: ret i32 [[LGS2]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@assume_read_global_bad ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[P:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: [[LGS1:%.*]] = load i32, ptr @Gstatic_int2, align 4 @@ -1345,14 +1345,14 @@ define void @assume_write_globals() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@assume_write_globals ; TUNIT-SAME: () #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: store i32 42, ptr @Gstatic_int1, align 4 ; TUNIT-NEXT: store i32 42, ptr @Gstatic_int2, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@assume_write_globals ; CGSCC-SAME: () #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: store i32 42, ptr @Gstatic_int1, align 4 @@ -1366,20 +1366,20 @@ ;. ; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR2]] = { norecurse } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; TUNIT: attributes #[[ATTR6]] = { willreturn } ; TUNIT: attributes #[[ATTR7]] = { nofree nosync nounwind willreturn } ;. ; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; CGSCC: attributes #[[ATTR2]] = { norecurse } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } -; CGSCC: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR7]] = { willreturn } ;. diff --git a/llvm/test/Transforms/Attributor/value-simplify-gpu.ll b/llvm/test/Transforms/Attributor/value-simplify-gpu.ll --- a/llvm/test/Transforms/Attributor/value-simplify-gpu.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-gpu.ll @@ -90,7 +90,7 @@ } define internal void @level2Kernelall_early() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_early ; CHECK-SAME: () #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: entry: @@ -163,7 +163,7 @@ } define internal void @level2Kernelall_late() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@level2Kernelall_late ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -255,14 +255,14 @@ } define internal void @level2all_early(ptr %addr) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@level2all_early ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: store i32 1, ptr addrspacecast (ptr addrspace(3) @ReachableNonKernel to ptr), align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@level2all_early ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -333,14 +333,14 @@ } define internal void @level2all_late(ptr %addr) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@level2all_late ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: store i32 1, ptr addrspacecast (ptr addrspace(3) @UnreachableNonKernel to ptr), align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@level2all_late ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[ADDR:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -359,14 +359,14 @@ ;. ; TUNIT: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } ; TUNIT: attributes #[[ATTR1]] = { norecurse nosync nounwind } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR4]] = { nosync nounwind } ; TUNIT: attributes #[[ATTR5]] = { nounwind } ;. ; CGSCC: attributes #[[ATTR0]] = { norecurse nosync nounwind "kernel" } ; CGSCC: attributes #[[ATTR1]] = { norecurse nosync nounwind } -; CGSCC: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR3]] = { nosync nounwind } ; CGSCC: attributes #[[ATTR4]] = { nounwind } ; CGSCC: attributes #[[ATTR5]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/value-simplify-instances.ll b/llvm/test/Transforms/Attributor/value-simplify-instances.ll --- a/llvm/test/Transforms/Attributor/value-simplify-instances.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-instances.ll @@ -13,7 +13,7 @@ ; CHECK: @[[G3:[a-zA-Z0-9_$"\\.-]+]] = private global i1 undef ;. define internal i1 @recursive_inst_comparator(ptr %a, ptr %b) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@recursive_inst_comparator ; CHECK-SAME: (ptr noalias nofree readnone [[A:%.*]], ptr noalias nofree readnone [[B:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr [[A]], [[B]] @@ -394,7 +394,7 @@ } define i32 @non_unique_phi_ops(ptr %ptr) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@non_unique_phi_ops ; TUNIT-SAME: (ptr nocapture nofree readonly [[PTR:%.*]]) #[[ATTR6:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -416,7 +416,7 @@ ; TUNIT: end: ; TUNIT-NEXT: ret i32 [[P]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@non_unique_phi_ops ; CGSCC-SAME: (ptr nocapture nofree readonly [[PTR:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -461,19 +461,19 @@ } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR1]] = { nofree nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR3]] = { nofree nosync nounwind memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind } ; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR7]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; CGSCC: attributes #[[ATTR5]] = { nounwind } ;. diff --git a/llvm/test/Transforms/Attributor/value-simplify-local-remote.ll b/llvm/test/Transforms/Attributor/value-simplify-local-remote.ll --- a/llvm/test/Transforms/Attributor/value-simplify-local-remote.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-local-remote.ll @@ -13,7 +13,7 @@ %struct2 = type <{ ptr, i64, i64, i32, [4 x i8] }> define i64 @t1(ptr %first, ptr %first.addr, ptr %0) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@t1 ; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[FIRST:%.*]], ptr nocapture nofree readnone [[FIRST_ADDR:%.*]], ptr nocapture nofree readnone [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -24,7 +24,7 @@ ; TUNIT-NEXT: [[CALL:%.*]] = call ptr @foo.4(ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[FIRST]]) #[[ATTR3:[0-9]+]] ; TUNIT-NEXT: ret i64 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@t1 ; CGSCC-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[FIRST:%.*]], ptr nocapture nofree readnone [[FIRST_ADDR:%.*]], ptr nocapture nofree readnone [[TMP0:%.*]]) #[[ATTR0:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -49,7 +49,7 @@ } define internal ptr @foo.4(ptr %__first) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@foo.4 ; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[__FIRST:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -57,7 +57,7 @@ ; TUNIT-NEXT: store ptr [[__FIRST]], ptr [[__FIRST]], align 8 ; TUNIT-NEXT: ret ptr undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@foo.4 ; CGSCC-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[__FIRST:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -75,7 +75,7 @@ } define internal ptr @bar(ptr %QQfirst) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@bar ; CGSCC-SAME: (ptr noalias nofree noundef nonnull readnone returned align 8 dereferenceable(8) "no-capture-maybe-returned" [[QQFIRST:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -101,7 +101,7 @@ } define ptr @t2(ptr %this, ptr %this.addr, ptr %this1) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@t2 ; TUNIT-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -110,7 +110,7 @@ ; TUNIT-NEXT: [[TEST_RET:%.*]] = extractvalue [[S]] [[CALL]], 0 ; TUNIT-NEXT: ret ptr [[TEST_RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@t2 ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -128,7 +128,7 @@ } define internal %S @foo.1(ptr %foo.this) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@foo.1 ; TUNIT-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[FOO_THIS:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -138,7 +138,7 @@ ; TUNIT-NEXT: [[FOO_RET:%.*]] = load [[S]], ptr [[RETVAL]], align 8 ; TUNIT-NEXT: ret [[S]] [[FOO_RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@foo.1 ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[FOO_THIS:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -157,7 +157,7 @@ } define internal void @bar.2(ptr %bar.this, ptr %bar.data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@bar.2 ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_THIS:%.*]], ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_DATA:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -165,7 +165,7 @@ ; TUNIT-NEXT: call void @baz(ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_THIS]], ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_DATA]]) #[[ATTR4]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@bar.2 ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_THIS:%.*]], ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAR_DATA:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -180,14 +180,14 @@ } define internal void @baz(ptr %baz.this, ptr %baz.data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@baz ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAZ_THIS:%.*]], ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAZ_DATA:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: store ptr [[BAZ_DATA]], ptr [[BAZ_THIS]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@baz ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[BAZ_THIS:%.*]], ptr nofree writeonly [[BAZ_DATA:%.*]]) #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -200,7 +200,7 @@ } define ptr @foo(ptr %this, ptr %this.addr, ptr %this1) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@foo ; TUNIT-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -209,7 +209,7 @@ ; TUNIT-NEXT: [[FOO_RET:%.*]] = extractvalue [[S]] [[CALL]], 0 ; TUNIT-NEXT: ret ptr [[FOO_RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@foo ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -227,7 +227,7 @@ } define internal %S @bar.5(ptr %this) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@bar.5 ; TUNIT-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -237,7 +237,7 @@ ; TUNIT-NEXT: [[BAR_RET:%.*]] = load [[S]], ptr [[RETVAL]], align 8 ; TUNIT-NEXT: ret [[S]] [[BAR_RET]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@bar.5 ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -257,7 +257,7 @@ } define internal void @baz.6(ptr %this, ptr %data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@baz.6 ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree noundef nonnull align 8 dereferenceable(8) [[DATA:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -265,7 +265,7 @@ ; TUNIT-NEXT: call void @boom(ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS]], ptr nofree noundef nonnull align 8 dereferenceable(8) [[DATA]]) #[[ATTR4]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@baz.6 ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree noundef nonnull align 8 dereferenceable(8) [[DATA:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -280,7 +280,7 @@ } define internal void @boom(ptr %this, ptr %data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@boom ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree noundef nonnull align 8 dereferenceable(8) [[DATA:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -290,7 +290,7 @@ ; TUNIT-NEXT: store ptr [[V]], ptr [[THIS]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@boom ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree [[DATA:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -475,7 +475,7 @@ } define double @t4(ptr %this, ptr %this.addr, ptr %this1) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@t4 ; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -484,7 +484,7 @@ ; TUNIT-NEXT: [[CALL:%.*]] = call [[S:%.*]] @t4a(ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS]]) #[[ATTR3]] ; TUNIT-NEXT: ret double 0.000000e+00 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@t4 ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]], ptr nocapture nofree readnone [[THIS_ADDR:%.*]], ptr nocapture nofree readnone [[THIS1:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -504,7 +504,7 @@ } define internal %S @t4a(ptr %this) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@t4a ; TUNIT-SAME: (ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -514,7 +514,7 @@ ; TUNIT-NEXT: call void @t4b(ptr noalias nocapture nofree noundef nonnull writeonly align 8 [[RETVAL]]) #[[ATTR4]] ; TUNIT-NEXT: ret [[S]] undef ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@t4a ; CGSCC-SAME: (ptr nofree noundef nonnull align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -539,7 +539,7 @@ } define internal void @t4b(ptr %this, ptr %data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@t4b ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -548,7 +548,7 @@ ; TUNIT-NEXT: call void @t4c(ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS]]) #[[ATTR4]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@t4b ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree noundef nonnull writeonly align 8 dereferenceable(8) [[DATA:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: entry: @@ -570,7 +570,7 @@ } define internal void @t4c(ptr %this, ptr %data) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@t4c ; TUNIT-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: entry: @@ -578,7 +578,7 @@ ; TUNIT-NEXT: [[DATA_ADDR:%.*]] = alloca ptr, i32 0, align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@t4c ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[THIS:%.*]], ptr nofree writeonly [[DATA:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -611,17 +611,17 @@ !6 = !{i32 7, !"Dwarf Version", i32 2} !7 = !{i32 2, !"Debug Info Version", i32 3} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR2]] = { nofree norecurse noreturn nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR4]] = { nofree nosync nounwind willreturn } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR5]] = { nofree norecurse noreturn nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR6]] = { nounwind willreturn } ; CGSCC: attributes #[[ATTR7]] = { willreturn } diff --git a/llvm/test/Transforms/Attributor/value-simplify-pointer-info-struct.ll b/llvm/test/Transforms/Attributor/value-simplify-pointer-info-struct.ll --- a/llvm/test/Transforms/Attributor/value-simplify-pointer-info-struct.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-pointer-info-struct.ll @@ -34,7 +34,7 @@ ; CHECK: @[[GLOBALS:[a-zA-Z0-9_$"\\.-]+]] = internal constant [[STRUCT_S:%.*]] { i32 42, double 3.140000e+00, ptr null, i32 0 }, align 8 ;. define i32 @testOneFieldGlobalS(i32 %cmpx) { -; CHECK: Function Attrs: nofree norecurse nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS ; CHECK-SAME: (i32 [[CMPX:%.*]]) #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: entry: @@ -93,7 +93,7 @@ } define i32 @testOneFieldGlobalS_type_mismatch() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_type_mismatch ; CHECK-SAME: () #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: entry: @@ -150,7 +150,7 @@ } define i32 @testOneFieldGlobalS_byte_offset_wrong() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_byte_offset_wrong ; CHECK-SAME: () #[[ATTR2]] { ; CHECK-NEXT: entry: @@ -209,8 +209,8 @@ } ;. ; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree norecurse nosync nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR1]] = { nofree norecurse nounwind willreturn memory(none) } -; CHECK: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR2]] = { 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: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/value-simplify-pointer-info-vec.ll b/llvm/test/Transforms/Attributor/value-simplify-pointer-info-vec.ll --- a/llvm/test/Transforms/Attributor/value-simplify-pointer-info-vec.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-pointer-info-vec.ll @@ -5,7 +5,7 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" define i32 @vec_write_0() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@vec_write_0 ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret i32 0 @@ -20,7 +20,7 @@ } define i32 @vec_write_1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@vec_write_1 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: ret i32 10 @@ -36,7 +36,7 @@ ; TODO: We should support this. define i32 @vec_write_2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@vec_write_2 ; CHECK-SAME: () #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = alloca <2 x i32>, align 8 @@ -56,7 +56,7 @@ ret i32 %add } ;. -; CHECK: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CHECK: attributes #[[ATTR0]] = { 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: ; CGSCC: {{.*}} diff --git a/llvm/test/Transforms/Attributor/value-simplify-pointer-info.ll b/llvm/test/Transforms/Attributor/value-simplify-pointer-info.ll --- a/llvm/test/Transforms/Attributor/value-simplify-pointer-info.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-pointer-info.ll @@ -59,7 +59,7 @@ ; CHECK: @[[GC:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 undef, align 4 ;. define void @write_arg(ptr %p, i32 %v) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CHECK-LABEL: define {{[^@]+}}@write_arg ; CHECK-SAME: (ptr nocapture nofree noundef nonnull writeonly align 4 dereferenceable(4) [[P:%.*]], i32 [[V:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: @@ -105,7 +105,7 @@ ; return r; ; } define void @local_alloca_simplifiable_1(ptr noalias sret(%struct.S) align 4 %agg.result) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@local_alloca_simplifiable_1 ; TUNIT-SAME: (ptr noalias nocapture nofree nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]]) #[[ATTR1:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -133,7 +133,7 @@ ; TUNIT-NEXT: call void @llvm.lifetime.end.p0(i64 noundef 24, ptr noalias nocapture nofree noundef nonnull align 4 dereferenceable(24) [[S]]) #[[ATTR17]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@local_alloca_simplifiable_1 ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]]) #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -249,7 +249,7 @@ ; } ; define void @local_alloca_simplifiable_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@local_alloca_simplifiable_2 ; TUNIT-SAME: () #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -323,7 +323,7 @@ ; TUNIT-NEXT: call void @llvm.lifetime.end.p0(i64 noundef 1024, ptr noalias nocapture nofree noundef nonnull align 16 dereferenceable(1024) [[BYTES]]) #[[ATTR17]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@local_alloca_simplifiable_2 ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -509,7 +509,7 @@ ; } ; define i32 @local_alloca_simplifiable_3() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@local_alloca_simplifiable_3 ; CHECK-SAME: () #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: br label [[SPLIT:%.*]] @@ -530,7 +530,7 @@ ; } ; define i32 @local_alloca_simplifiable_4() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@local_alloca_simplifiable_4 ; CHECK-SAME: () #[[ATTR4]] { ; CHECK-NEXT: ret i32 undef @@ -547,7 +547,7 @@ ; return *p; ; } define i32 @multi_obj_simplifiable_1(i32 %cnd) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@multi_obj_simplifiable_1 ; TUNIT-SAME: (i32 [[CND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -563,7 +563,7 @@ ; TUNIT-NEXT: call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noalias nocapture nofree noundef nonnull align 4 dereferenceable(4) [[L]]) #[[ATTR17]] ; TUNIT-NEXT: ret i32 5 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@multi_obj_simplifiable_1 ; CGSCC-SAME: (i32 [[CND:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -609,7 +609,7 @@ ; } ; define i32 @multi_obj_simplifiable_2(i32 %cnd) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@multi_obj_simplifiable_2 ; TUNIT-SAME: (i32 [[CND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -625,7 +625,7 @@ ; TUNIT-NEXT: call void @llvm.lifetime.end.p0(i64 noundef 4, ptr noalias nocapture nofree noundef nonnull align 4 dereferenceable(4) [[L]]) #[[ATTR17]] ; TUNIT-NEXT: ret i32 5 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@multi_obj_simplifiable_2 ; CGSCC-SAME: (i32 [[CND:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -680,7 +680,7 @@ ; } ; define void @static_global_simplifiable_1(ptr noalias sret(%struct.S) align 4 %agg.result) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@static_global_simplifiable_1 ; TUNIT-SAME: (ptr noalias nocapture nofree nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]]) #[[ATTR5:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -700,7 +700,7 @@ ; TUNIT-NEXT: store i32 4, ptr [[I3]], align 4, !tbaa [[TBAA14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@static_global_simplifiable_1 ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -784,7 +784,7 @@ ; } ; define void @static_global_simplifiable_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@static_global_simplifiable_2 ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: entry: @@ -853,7 +853,7 @@ ; TUNIT: for.end35: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@static_global_simplifiable_2 ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -1027,13 +1027,13 @@ ; return Flag3; ; } define i32 @static_global_simplifiable_3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@static_global_simplifiable_3 ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: store i32 1, ptr @Flag3, align 4, !tbaa [[TBAA3]] ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@static_global_simplifiable_3 ; CGSCC-SAME: () #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: store i32 1, ptr @Flag3, align 4, !tbaa [[TBAA3]] @@ -1062,7 +1062,7 @@ ; } ; define void @noalias_arg_simplifiable_1(ptr noalias sret(%struct.S) align 4 %agg.result, ptr byval(%struct.S) align 8 %s) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@noalias_arg_simplifiable_1 ; TUNIT-SAME: (ptr noalias nocapture nofree nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]], ptr noalias nocapture nofree nonnull byval([[STRUCT_S]]) align 8 dereferenceable(24) [[S:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -1108,7 +1108,7 @@ ; TUNIT-NEXT: store i32 [[ADD15]], ptr [[I316]], align 4, !tbaa [[TBAA14]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@noalias_arg_simplifiable_1 ; CGSCC-SAME: (ptr noalias nocapture nofree noundef nonnull writeonly sret([[STRUCT_S:%.*]]) align 4 dereferenceable(24) [[AGG_RESULT:%.*]], ptr noalias nocapture nofree noundef nonnull byval([[STRUCT_S]]) align 8 dereferenceable(24) [[S:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: entry: @@ -1213,7 +1213,7 @@ ; } ; define void @noalias_arg_simplifiable_2(ptr %Bytes) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@noalias_arg_simplifiable_2 ; TUNIT-SAME: (ptr nocapture nofree [[BYTES:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -1290,7 +1290,7 @@ ; TUNIT: for.end37: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@noalias_arg_simplifiable_2 ; CGSCC-SAME: (ptr nocapture nofree [[BYTES:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: entry: @@ -1533,7 +1533,7 @@ } define i8 @local_alloca_not_simplifiable_2(i64 %index1, i64 %index2, i1 %cnd) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@local_alloca_not_simplifiable_2 ; TUNIT-SAME: (i64 [[INDEX1:%.*]], i64 [[INDEX2:%.*]], i1 noundef [[CND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -1552,7 +1552,7 @@ ; TUNIT-NEXT: [[I:%.*]] = load i8, ptr [[BYTES]], align 16 ; TUNIT-NEXT: ret i8 [[I]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@local_alloca_not_simplifiable_2 ; CGSCC-SAME: (i64 [[INDEX1:%.*]], i64 [[INDEX2:%.*]], i1 noundef [[CND:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -1596,7 +1596,7 @@ ; We could simplify these if we separate accessed bins wrt. alignment (here mod 4). define i32 @unknown_access_mixed_simplifiable(i32 %arg1, i32 %arg2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@unknown_access_mixed_simplifiable ; CHECK-SAME: (i32 [[ARG1:%.*]], i32 [[ARG2:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -1632,7 +1632,7 @@ ; The access to bc4b could go anywhere, nothing is simplifiable. define i32 @unknown_access_mixed_not_simplifiable(i32 %arg1, i32 %arg2, i32 %arg3) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@unknown_access_mixed_not_simplifiable ; CHECK-SAME: (i32 [[ARG1:%.*]], i32 [[ARG2:%.*]], i32 [[ARG3:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -1682,14 +1682,14 @@ ; } ; define i32 @global_not_simplifiable_1(i32 %cnd) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@global_not_simplifiable_1 ; TUNIT-SAME: (i32 [[CND:%.*]]) #[[ATTR6:[0-9]+]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: [[I:%.*]] = load i32, ptr @Flag0, align 4, !tbaa [[TBAA3]] ; TUNIT-NEXT: ret i32 [[I]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@global_not_simplifiable_1 ; CGSCC-SAME: (i32 [[CND:%.*]]) #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -1799,13 +1799,13 @@ ret i32 %i } define void @static_global_not_simplifiable_2_helper() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@static_global_not_simplifiable_2_helper ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: store i32 2, ptr @Flag4, align 4, !tbaa [[TBAA3]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@static_global_not_simplifiable_2_helper ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: store i32 2, ptr @Flag4, align 4, !tbaa [[TBAA3]] @@ -1817,7 +1817,7 @@ ; Similiar to static_global_simplifiable_3 but with a may-store. define i32 @static_global_not_simplifiable_3(i1 %c, ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@static_global_not_simplifiable_3 ; TUNIT-SAME: (i1 [[C:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[SEL:%.*]] = select i1 [[C]], ptr @Flag3, ptr [[P]] @@ -1825,7 +1825,7 @@ ; TUNIT-NEXT: [[I:%.*]] = load i32, ptr @Flag3, align 4, !tbaa [[TBAA3]] ; TUNIT-NEXT: ret i32 [[I]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@static_global_not_simplifiable_3 ; CGSCC-SAME: (i1 [[C:%.*]], ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: [[SEL:%.*]] = select i1 [[C]], ptr @Flag3, ptr [[P]] @@ -1853,14 +1853,14 @@ ; ; FIXME: We could replace these loads. define i32 @write_read_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@write_read_global ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: store i32 7, ptr @Gint1, align 4 ; TUNIT-NEXT: [[L:%.*]] = load i32, ptr @Gint1, align 4 ; TUNIT-NEXT: ret i32 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@write_read_global ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: store i32 7, ptr @Gint1, align 4 @@ -1872,13 +1872,13 @@ ret i32 %l } define void @write_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@write_global ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: store i32 7, ptr @Gint2, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@write_global ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: store i32 7, ptr @Gint2, align 4 @@ -1888,13 +1888,13 @@ ret void } define i32 @read_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@read_global ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: [[L:%.*]] = load i32, ptr @Gint2, align 4 ; TUNIT-NEXT: ret i32 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@read_global ; CGSCC-SAME: () #[[ATTR7]] { ; CGSCC-NEXT: [[L:%.*]] = load i32, ptr @Gint2, align 4 @@ -1904,12 +1904,12 @@ ret i32 %l } define i32 @write_read_static_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@write_read_static_global ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: ret i32 7 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@write_read_static_global ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: ret i32 7 @@ -1919,13 +1919,13 @@ ret i32 %l } define void @write_static_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@write_static_global ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: store i32 7, ptr @Gstatic_int2, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@write_static_global ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: store i32 7, ptr @Gstatic_int2, align 4 @@ -1935,13 +1935,13 @@ ret void } define i32 @read_static_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@read_static_global ; TUNIT-SAME: () #[[ATTR6]] { ; TUNIT-NEXT: [[L:%.*]] = load i32, ptr @Gstatic_int2, align 4 ; TUNIT-NEXT: ret i32 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@read_static_global ; CGSCC-SAME: () #[[ATTR7]] { ; CGSCC-NEXT: [[L:%.*]] = load i32, ptr @Gstatic_int2, align 4 @@ -1951,12 +1951,12 @@ ret i32 %l } define i32 @write_read_static_undef_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@write_read_static_undef_global ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: ret i32 7 ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@write_read_static_undef_global ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: ret i32 7 @@ -1966,12 +1966,12 @@ ret i32 %l } define void @write_static_undef_global() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@write_static_undef_global ; TUNIT-SAME: () #[[ATTR5]] { ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@write_static_undef_global ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: store i32 7, ptr @Gstatic_undef_int2, align 4 @@ -1981,7 +1981,7 @@ ret void } define i32 @read_static_undef_global() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@read_static_undef_global ; CHECK-SAME: () #[[ATTR4]] { ; CHECK-NEXT: ret i32 7 @@ -1991,7 +1991,7 @@ } define i32 @single_read_of_static_global() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@single_read_of_static_global ; CHECK-SAME: () #[[ATTR4]] { ; CHECK-NEXT: ret i32 0 @@ -2001,7 +2001,7 @@ } define i8 @phi_store() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@phi_store ; CHECK-SAME: () #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -2040,7 +2040,7 @@ ; FIXME: This function returns 1. define i8 @phi_no_store_1() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@phi_no_store_1 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -2061,7 +2061,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add i8 [[L11]], [[L12]] ; TUNIT-NEXT: ret i8 [[ADD]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@phi_no_store_1 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -2104,7 +2104,7 @@ ; FIXME: This function returns 1. define i8 @phi_no_store_2() { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@phi_no_store_2 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -2125,7 +2125,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add i8 [[L21]], [[L22]] ; TUNIT-NEXT: ret i8 [[ADD]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@phi_no_store_2 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -2166,7 +2166,7 @@ } define i8 @phi_no_store_3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@phi_no_store_3 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -2192,7 +2192,7 @@ ; TUNIT-NEXT: [[ADD2:%.*]] = add i8 [[ADD]], [[L34]] ; TUNIT-NEXT: ret i8 [[ADD2]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@phi_no_store_3 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: entry: @@ -2243,14 +2243,14 @@ } define i8 @cast_and_load_1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@cast_and_load_1 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: store i32 42, ptr @bytes1, align 4 ; TUNIT-NEXT: [[L:%.*]] = load i8, ptr @bytes1, align 4 ; TUNIT-NEXT: ret i8 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@cast_and_load_1 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: store i32 42, ptr @bytes1, align 4 @@ -2263,14 +2263,14 @@ } define i64 @cast_and_load_2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@cast_and_load_2 ; TUNIT-SAME: () #[[ATTR3]] { ; TUNIT-NEXT: store i32 42, ptr @bytes2, align 4 ; TUNIT-NEXT: [[L:%.*]] = load i64, ptr @bytes2, align 4 ; TUNIT-NEXT: ret i64 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@cast_and_load_2 ; CGSCC-SAME: () #[[ATTR5]] { ; CGSCC-NEXT: store i32 42, ptr @bytes2, align 4 @@ -2656,7 +2656,7 @@ } define internal fastcc void @nested_memory_callee(ptr nocapture readonly %S) nofree norecurse nounwind uwtable { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn uwtable +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn uwtable ; TUNIT-LABEL: define {{[^@]+}}@nested_memory_callee ; TUNIT-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]], ptr [[TMP2:%.*]]) #[[ATTR11:[0-9]+]] { ; TUNIT-NEXT: entry: @@ -2678,7 +2678,7 @@ ; TUNIT-NEXT: store float [[CONV]], ptr [[TMP7]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn uwtable +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn uwtable ; CGSCC-LABEL: define {{[^@]+}}@nested_memory_callee ; CGSCC-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]], ptr [[TMP2:%.*]]) #[[ATTR12:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -2717,7 +2717,7 @@ ; Make sure the access %1 is not forwarded to the loads %2 and %3 as the indices are ; varying and the accesses thus not "exact". This used to simplify %cmp12 to true. define hidden void @no_propagation_of_unknown_index_access(ptr %in, ptr %out, i32 %idx) #0 { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@no_propagation_of_unknown_index_access ; TUNIT-SAME: (ptr nocapture nofree readonly [[IN:%.*]], ptr nocapture nofree writeonly [[OUT:%.*]], i32 [[IDX:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -2759,7 +2759,7 @@ ; TUNIT-NEXT: [[INC16]] = add nsw i32 [[I3_0]], 1 ; TUNIT-NEXT: br label [[FOR_COND4]], !llvm.loop [[TBAA12]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@no_propagation_of_unknown_index_access ; CGSCC-SAME: (ptr nocapture nofree readonly [[IN:%.*]], ptr nocapture nofree writeonly [[OUT:%.*]], i32 [[IDX:%.*]]) #[[ATTR13:[0-9]+]] { ; CGSCC-NEXT: entry: @@ -2909,7 +2909,7 @@ ; Ensure we do not return %bad or %l, but %sel define i32 @scope_value_traversal(i32 %bad, i1 %c, i1 %c2) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@scope_value_traversal ; TUNIT-SAME: (i32 [[BAD:%.*]], i1 [[C:%.*]], i1 [[C2:%.*]]) #[[ATTR4]] { ; TUNIT-NEXT: [[A:%.*]] = alloca i32, align 4 @@ -2919,7 +2919,7 @@ ; TUNIT-NEXT: [[SEL:%.*]] = select i1 [[C]], i32 [[BAD]], i32 [[L]] ; TUNIT-NEXT: ret i32 [[SEL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@scope_value_traversal ; CGSCC-SAME: (i32 [[BAD:%.*]], i1 [[C:%.*]], i1 [[C2:%.*]]) #[[ATTR16:[0-9]+]] { ; CGSCC-NEXT: [[A:%.*]] = alloca i32, align 4 @@ -2938,7 +2938,7 @@ } define void @scope_value_traversal_helper(ptr %a, i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; TUNIT-LABEL: define {{[^@]+}}@scope_value_traversal_helper ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[L:%.*]] = load i32, ptr [[A]], align 4 @@ -2946,7 +2946,7 @@ ; TUNIT-NEXT: store i32 [[SEL]], ptr [[A]], align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) ; CGSCC-LABEL: define {{[^@]+}}@scope_value_traversal_helper ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull align 4 dereferenceable(4) [[A:%.*]], i1 [[C:%.*]]) #[[ATTR13]] { ; CGSCC-NEXT: [[L:%.*]] = load i32, ptr [[A]], align 4 @@ -2961,7 +2961,7 @@ } define i8 @gep_index_from_binary_operator(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@gep_index_from_binary_operator ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -2980,7 +2980,7 @@ } define i8 @gep_index_from_memory(i1 %cnd1, i1 %cnd2) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@gep_index_from_memory ; CHECK-SAME: (i1 [[CND1:%.*]], i1 [[CND2:%.*]]) #[[ATTR4]] { ; CHECK-NEXT: entry: @@ -3047,7 +3047,7 @@ @GC = internal global i32 undef, align 4 define void @atomicrmw(ptr %p, i32 %i, i1 %cnd) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@atomicrmw ; TUNIT-SAME: (ptr nofree [[P:%.*]], i32 [[I:%.*]], i1 noundef [[CND:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: br i1 [[CND]], label [[T:%.*]], label [[M:%.*]] @@ -3057,7 +3057,7 @@ ; TUNIT-NEXT: [[ARMW:%.*]] = atomicrmw add ptr @GC, i32 [[I]] monotonic, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@atomicrmw ; CGSCC-SAME: (ptr nofree [[P:%.*]], i32 [[I:%.*]], i1 noundef [[CND:%.*]]) #[[ATTR5]] { ; CGSCC-NEXT: br i1 [[CND]], label [[T:%.*]], label [[M:%.*]] @@ -3124,18 +3124,18 @@ !30 = distinct !{!30, !17} !31 = distinct !{!31, !17} ;. -; TUNIT: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; TUNIT: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind memory(write) } ; TUNIT: attributes #[[ATTR8:[0-9]+]] = { allockind("alloc,uninitialized") allocsize(0) "alloc-family"="malloc" } ; TUNIT: attributes #[[ATTR9:[0-9]+]] = { allockind("free") "alloc-family"="malloc" } ; TUNIT: attributes #[[ATTR10:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" } -; TUNIT: attributes #[[ATTR11]] = { nofree norecurse nosync nounwind willreturn uwtable } +; TUNIT: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn uwtable } ; TUNIT: attributes #[[ATTR12]] = { nofree nosync nounwind memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR13]] = { nofree norecurse nosync nounwind memory(none) } ; TUNIT: attributes #[[ATTR14]] = { nofree nosync nounwind } @@ -3147,23 +3147,23 @@ ; TUNIT: attributes #[[ATTR20]] = { norecurse } ; TUNIT: attributes #[[ATTR21]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR1]] = { nofree nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(argmem: readwrite) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR5]] = { nofree norecurse nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR6]] = { nofree norecurse nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(read) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(read) } ; CGSCC: attributes #[[ATTR8]] = { nofree norecurse nosync nounwind memory(write) } ; CGSCC: attributes #[[ATTR9:[0-9]+]] = { allockind("alloc,uninitialized") allocsize(0) "alloc-family"="malloc" } ; CGSCC: attributes #[[ATTR10:[0-9]+]] = { allockind("free") "alloc-family"="malloc" } ; CGSCC: attributes #[[ATTR11:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" } -; CGSCC: attributes #[[ATTR12]] = { nofree norecurse nosync nounwind willreturn uwtable } -; CGSCC: attributes #[[ATTR13]] = { nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } +; CGSCC: attributes #[[ATTR12]] = { mustprogress nofree norecurse nosync nounwind willreturn uwtable } +; CGSCC: attributes #[[ATTR13]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR14]] = { nofree nosync nounwind memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR15]] = { nofree nosync nounwind memory(none) } -; CGSCC: attributes #[[ATTR16]] = { nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR16]] = { mustprogress nofree nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR17]] = { nofree nosync nounwind } ; CGSCC: attributes #[[ATTR18:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) } ; CGSCC: attributes #[[ATTR19:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: write) } diff --git a/llvm/test/Transforms/Attributor/value-simplify-reachability.ll b/llvm/test/Transforms/Attributor/value-simplify-reachability.ll --- a/llvm/test/Transforms/Attributor/value-simplify-reachability.ll +++ b/llvm/test/Transforms/Attributor/value-simplify-reachability.ll @@ -21,7 +21,7 @@ ; CHECK: @[[GINT5:[a-zA-Z0-9_$"\\.-]+]] = internal global i32 undef, align 4 ;. define internal void @write1ToGInt1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@write1ToGInt1 ; CHECK-SAME: () #[[ATTR4:[0-9]+]] { ; CHECK-NEXT: store i32 1, ptr @GInt1, align 4 @@ -32,7 +32,7 @@ } define internal void @write1ToGInt2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CHECK-LABEL: define {{[^@]+}}@write1ToGInt2 ; CHECK-SAME: () #[[ATTR4]] { ; CHECK-NEXT: store i32 1, ptr @GInt2, align 4 @@ -795,7 +795,7 @@ ; TUNIT: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync } ; TUNIT: attributes #[[ATTR2:[0-9]+]] = { allockind("free") "alloc-family"="malloc" } ; TUNIT: attributes #[[ATTR3:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; TUNIT: attributes #[[ATTR5]] = { norecurse nosync } ; TUNIT: attributes #[[ATTR6]] = { nocallback } ; TUNIT: attributes #[[ATTR7]] = { norecurse } @@ -807,7 +807,7 @@ ; CGSCC: attributes #[[ATTR1:[0-9]+]] = { nocallback nosync } ; CGSCC: attributes #[[ATTR2:[0-9]+]] = { allockind("free") "alloc-family"="malloc" } ; CGSCC: attributes #[[ATTR3:[0-9]+]] = { allockind("alloc,zeroed") allocsize(0,1) "alloc-family"="malloc" } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR5]] = { nosync } ; CGSCC: attributes #[[ATTR6]] = { norecurse nosync } ; CGSCC: attributes #[[ATTR7]] = { nocallback } diff --git a/llvm/test/Transforms/Attributor/value-simplify.ll b/llvm/test/Transforms/Attributor/value-simplify.ll --- a/llvm/test/Transforms/Attributor/value-simplify.ll +++ b/llvm/test/Transforms/Attributor/value-simplify.ll @@ -18,7 +18,7 @@ ; CHECK: @[[X:[a-zA-Z0-9_$"\\.-]+]] = external global i32 ;. define internal ptr addrspace(3) @const_ptr_return_as3() { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@const_ptr_return_as3 ; CGSCC-SAME: () #[[ATTR1:[0-9]+]] { ; CGSCC-NEXT: ret ptr addrspace(3) @ConstAS3Ptr @@ -26,7 +26,7 @@ ret ptr addrspace(3) @ConstAS3Ptr } define internal ptr @const_ptr_return() { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@const_ptr_return ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret ptr addrspacecast (ptr addrspace(3) @ConstAS3Ptr to ptr) @@ -55,7 +55,7 @@ ; TEST 2 : Simplify return value define i32 @return0() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@return0 ; CHECK-SAME: () #[[ATTR1:[0-9]+]] { ; CHECK-NEXT: ret i32 0 @@ -64,7 +64,7 @@ } define i32 @return1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@return1 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret i32 1 @@ -73,7 +73,7 @@ } define i32 @test2_1(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test2_1 ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] @@ -86,7 +86,7 @@ ; TUNIT-NEXT: [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ] ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test2_1 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2:[0-9]+]] { ; CGSCC-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] @@ -119,12 +119,12 @@ define i32 @test2_2(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test2_2 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i32 1 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test2_2 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[RET:%.*]] = tail call noundef i32 @test2_1(i1 noundef [[C]]) #[[ATTR13]] @@ -232,7 +232,7 @@ } define i32 @ipccp1(i32 %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ipccp1 ; CHECK-SAME: (i32 returned [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: br i1 true, label [[T:%.*]], label [[F:%.*]] @@ -250,7 +250,7 @@ } define internal i1 @ipccp2i(i1 %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp2i ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: br label [[T:%.*]] @@ -268,12 +268,12 @@ } define i1 @ipccp2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ipccp2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp2 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = call noundef i1 @ipccp2i() #[[ATTR13]] @@ -284,7 +284,7 @@ } define internal i1 @ipccp2ib(i1 %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp2ib ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: br label [[T:%.*]] @@ -302,12 +302,12 @@ } define i1 @ipccp2b() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ipccp2b ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp2b ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = call noundef i1 @ipccp2ib() #[[ATTR13]] @@ -318,7 +318,7 @@ } define internal i32 @ipccp3i(i32 %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp3i ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: br label [[T:%.*]] @@ -337,12 +337,12 @@ } define i32 @ipccp3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ipccp3 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i32 7 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp3 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[R:%.*]] = call noundef i32 @ipccp3i() #[[ATTR13]] @@ -353,7 +353,7 @@ } define internal i32 @ipccp4ia(i1 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp4ia ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -369,7 +369,7 @@ ret i32 1 } define internal i32 @ipccp4ib(i32 %a) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp4ib ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: br label [[T:%.*]] @@ -389,7 +389,7 @@ } define i32 @ipccp4(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@ipccp4 ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -398,7 +398,7 @@ ; TUNIT: f: ; TUNIT-NEXT: ret i32 0 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@ipccp4 ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]] @@ -420,7 +420,7 @@ ; Do not touch complicated arguments (for now) %struct.X = type { ptr } define internal ptr @test_inalloca(ptr inalloca(i32) %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test_inalloca ; CHECK-SAME: (ptr noalias nofree nonnull returned writeonly inalloca(i32) dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: ret ptr [[A]] @@ -428,13 +428,13 @@ ret ptr %a } define ptr @complicated_args_inalloca(ptr %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@complicated_args_inalloca ; TUNIT-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[ARG:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: [[CALL:%.*]] = call nonnull dereferenceable(4) ptr @test_inalloca(ptr noalias nofree writeonly inalloca(i32) "no-capture-maybe-returned" [[ARG]]) #[[ATTR9:[0-9]+]] ; TUNIT-NEXT: ret ptr [[CALL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@complicated_args_inalloca ; CGSCC-SAME: (ptr nofree noundef nonnull readnone dereferenceable(4) [[ARG:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CALL:%.*]] = call noalias nonnull dereferenceable(4) ptr @test_inalloca(ptr noalias nofree noundef nonnull writeonly inalloca(i32) dereferenceable(4) [[ARG]]) #[[ATTR13]] @@ -445,7 +445,7 @@ } define internal ptr @test_preallocated(ptr preallocated(i32) %a) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@test_preallocated ; CHECK-SAME: (ptr noalias nofree noundef nonnull returned writeonly preallocated(i32) align 4294967296 dereferenceable(4) "no-capture-maybe-returned" [[A:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: ret ptr [[A]] @@ -453,14 +453,14 @@ ret ptr %a } define ptr @complicated_args_preallocated() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@complicated_args_preallocated ; TUNIT-SAME: () #[[ATTR2:[0-9]+]] { ; TUNIT-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR10:[0-9]+]] ; TUNIT-NEXT: [[CALL:%.*]] = call noundef nonnull align 4294967296 dereferenceable(4) ptr @test_preallocated(ptr noalias nocapture nofree noundef writeonly preallocated(i32) align 4294967296 null) #[[ATTR9]] [ "preallocated"(token [[C]]) ] ; TUNIT-NEXT: ret ptr [[CALL]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@complicated_args_preallocated ; CGSCC-SAME: () #[[ATTR3:[0-9]+]] { ; CGSCC-NEXT: [[C:%.*]] = call token @llvm.call.preallocated.setup(i32 noundef 1) #[[ATTR13]] @@ -474,13 +474,13 @@ define internal void @test_sret(ptr sret(%struct.X) %a, ptr %b) { ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test_sret ; TUNIT-SAME: (ptr noalias nofree noundef nonnull writeonly sret([[STRUCT_X:%.*]]) align 4294967296 dereferenceable(8) [[A:%.*]], ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR3:[0-9]+]] { ; TUNIT-NEXT: store ptr [[A]], ptr [[B]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@test_sret ; CGSCC-SAME: (ptr noalias nofree noundef nonnull writeonly sret([[STRUCT_X:%.*]]) align 4294967296 dereferenceable(8) [[A:%.*]], ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: store ptr [[A]], ptr [[B]], align 8 @@ -493,13 +493,13 @@ define void @complicated_args_sret(ptr %b) { ; ; -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@complicated_args_sret ; TUNIT-SAME: (ptr nocapture nofree writeonly [[B:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: call void @test_sret(ptr noalias nocapture nofree noundef writeonly sret([[STRUCT_X:%.*]]) align 4294967296 null, ptr nocapture nofree writeonly align 8 [[B]]) #[[ATTR9]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@complicated_args_sret ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[B:%.*]]) #[[ATTR5:[0-9]+]] { ; CGSCC-NEXT: unreachable @@ -509,7 +509,7 @@ } define internal ptr @test_nest(ptr nest %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_nest ; CGSCC-SAME: (ptr nest noalias nocapture nofree readnone align 4294967296 [[A:%.*]]) #[[ATTR1]] { ; CGSCC-NEXT: ret ptr null @@ -517,12 +517,12 @@ ret ptr %a } define ptr @complicated_args_nest() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@complicated_args_nest ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret ptr null ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@complicated_args_nest ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[CALL:%.*]] = call noalias noundef align 4294967296 ptr @test_nest(ptr noalias nocapture nofree noundef readnone align 4294967296 null) #[[ATTR13]] @@ -534,7 +534,7 @@ @S = external global %struct.X define internal void @test_byval(ptr byval(%struct.X) %a) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@test_byval ; TUNIT-SAME: (ptr [[TMP0:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8 @@ -542,7 +542,7 @@ ; TUNIT-NEXT: store ptr null, ptr [[A_PRIV]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@test_byval ; CGSCC-SAME: (ptr [[TMP0:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]], align 8 @@ -554,14 +554,14 @@ ret void } define void @complicated_args_byval() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@complicated_args_byval ; TUNIT-SAME: () #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: [[TMP1:%.*]] = load ptr, ptr @S, align 8 ; TUNIT-NEXT: call void @test_byval(ptr [[TMP1]]) #[[ATTR9]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@complicated_args_byval ; CGSCC-SAME: () #[[ATTR3]] { ; CGSCC-NEXT: [[TMP1:%.*]] = load ptr, ptr @S, align 8 @@ -599,7 +599,7 @@ } define void @fixpoint_changed(ptr %p) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@fixpoint_changed ; TUNIT-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: @@ -622,7 +622,7 @@ ; TUNIT: for.end: ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@fixpoint_changed ; CGSCC-SAME: (ptr nocapture nofree writeonly [[P:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: entry: @@ -673,12 +673,12 @@ ; Check we merge undef and a constant properly. define i8 @caller0() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller0 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller0 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -688,12 +688,12 @@ ret i8 %c } define i8 @caller1() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller1 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller1 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -703,12 +703,12 @@ ret i8 %c } define i8 @caller2() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller2 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller2 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -718,12 +718,12 @@ ret i8 %c } define i8 @caller_middle() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller_middle ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller_middle ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -733,12 +733,12 @@ ret i8 %c } define i8 @caller3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller3 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller3 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -748,12 +748,12 @@ ret i8 %c } define i8 @caller4() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@caller4 ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i8 49 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@caller4 ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i8 @callee() #[[ATTR13]] @@ -763,7 +763,7 @@ ret i8 %c } define internal i8 @callee(i8 %a) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@callee ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret i8 49 @@ -773,13 +773,13 @@ } define void @user_as3() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@user_as3 ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: store i32 0, ptr addrspace(3) @ConstAS3Ptr, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@user_as3 ; CGSCC-SAME: () #[[ATTR6:[0-9]+]] { ; CGSCC-NEXT: [[CALL:%.*]] = call fastcc align 4 ptr addrspace(3) @const_ptr_return_as3() #[[ATTR13]] @@ -791,13 +791,13 @@ ret void } define void @user() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@user ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: store i32 0, ptr addrspacecast (ptr addrspace(3) @ConstAS3Ptr to ptr), align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@user ; CGSCC-SAME: () #[[ATTR6]] { ; CGSCC-NEXT: [[CALL:%.*]] = call fastcc align 4 ptr @const_ptr_return() #[[ATTR13]] @@ -811,12 +811,12 @@ define i1 @test_merge_with_undef_values_ptr(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_merge_with_undef_values_ptr ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i1 false ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_merge_with_undef_values_ptr ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R1:%.*]] = call noundef i1 @undef_then_null(i1 [[C]]) #[[ATTR13]] @@ -826,7 +826,7 @@ ret i1 %r1 } define internal i1 @undef_then_null(i1 %c, ptr %i32Aptr, ptr %i32Bptr) { -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@undef_then_null ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]] @@ -847,12 +847,12 @@ } define i1 @test_merge_with_undef_values(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_merge_with_undef_values ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i1 false ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_merge_with_undef_values ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[R1:%.*]] = call noundef i1 @undef_then_1(i1 [[C]]) #[[ATTR13]] @@ -863,7 +863,7 @@ } define internal i1 @undef_then_1(i1 %c, i32 %i32A, i32 %i32B) { ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@undef_then_1 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]] @@ -884,12 +884,12 @@ } define i32 @test_select(i32 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_select ; TUNIT-SAME: (i32 [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: ret i32 42 ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_select ; CGSCC-SAME: (i32 [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: [[CALL:%.*]] = call noundef i32 @select() #[[ATTR13]] @@ -900,7 +900,7 @@ } define internal i32 @select(i1 %a, i32 %b, i32 %c) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@select ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret i32 42 @@ -910,7 +910,7 @@ } define i1 @icmp() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@icmp ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret i1 true @@ -962,14 +962,14 @@ @g = internal constant { [2 x ptr] } { [2 x ptr] [ptr @f1, ptr @f2] } define internal void @f1(ptr %a) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; TUNIT-LABEL: define {{[^@]+}}@f1 ; TUNIT-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR3]] { ; TUNIT-NEXT: entry: ; TUNIT-NEXT: store ptr @g, ptr [[A]], align 8 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: (ptr nocapture nofree noundef nonnull writeonly align 8 dereferenceable(8) [[A:%.*]]) #[[ATTR4]] { ; CGSCC-NEXT: entry: @@ -1030,12 +1030,12 @@ define i1 @test_cmp_null_after_cast() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_cmp_null_after_cast ; TUNIT-SAME: () #[[ATTR1]] { ; TUNIT-NEXT: ret i1 true ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_cmp_null_after_cast ; CGSCC-SAME: () #[[ATTR2]] { ; CGSCC-NEXT: [[C:%.*]] = call noundef i1 @cmp_null_after_cast() #[[ATTR13]] @@ -1045,7 +1045,7 @@ ret i1 %c } define internal i1 @cmp_null_after_cast(i32 %a, i8 %b) { -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@cmp_null_after_cast ; CGSCC-SAME: () #[[ATTR1]] { ; CGSCC-NEXT: ret i1 true @@ -1138,7 +1138,7 @@ } define i1 @test_liveness(i1 %c) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; TUNIT-LABEL: define {{[^@]+}}@test_liveness ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; TUNIT-NEXT: entry: @@ -1150,7 +1150,7 @@ ; TUNIT-NEXT: [[RC1:%.*]] = call i1 @ret(i1 noundef [[P]]) #[[ATTR9]] ; TUNIT-NEXT: ret i1 [[RC1]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn memory(none) +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none) ; CGSCC-LABEL: define {{[^@]+}}@test_liveness ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR2]] { ; CGSCC-NEXT: entry: @@ -1173,7 +1173,7 @@ } define internal i1 @ret(i1 %c) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@ret ; CHECK-SAME: (i1 noundef [[C:%.*]]) #[[ATTR1]] { ; CHECK-NEXT: entry: @@ -1215,7 +1215,7 @@ declare void @llvm.memcpy(ptr %dest, ptr %src, i32 %len, i1 %isvolatile) define internal i8 @memcpy_uses_store(i8 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@memcpy_uses_store ; TUNIT-SAME: (i8 [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[SRC:%.*]] = alloca i8, align 1 @@ -1225,7 +1225,7 @@ ; TUNIT-NEXT: [[L:%.*]] = load i8, ptr [[DST]], align 1 ; TUNIT-NEXT: ret i8 [[L]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@memcpy_uses_store ; CGSCC-SAME: (i8 [[ARG:%.*]]) #[[ATTR7:[0-9]+]] { ; CGSCC-NEXT: [[SRC:%.*]] = alloca i8, align 1 @@ -1244,13 +1244,13 @@ } define i8 @memcpy_uses_store_caller(i8 %arg) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@memcpy_uses_store_caller ; TUNIT-SAME: (i8 [[ARG:%.*]]) #[[ATTR2]] { ; TUNIT-NEXT: [[R:%.*]] = call i8 @memcpy_uses_store(i8 [[ARG]]) #[[ATTR9]] ; TUNIT-NEXT: ret i8 [[R]] ; -; CGSCC: Function Attrs: nofree nosync nounwind willreturn +; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@memcpy_uses_store_caller ; CGSCC-SAME: (i8 [[ARG:%.*]]) #[[ATTR3]] { ; CGSCC-NEXT: [[R:%.*]] = call i8 @memcpy_uses_store(i8 [[ARG]]) #[[ATTR14]] @@ -1294,7 +1294,7 @@ } define internal i32 @ret_speculatable_expr(ptr %mem, i32 %a2) { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; TUNIT-LABEL: define {{[^@]+}}@ret_speculatable_expr ; TUNIT-SAME: (i32 [[TMP0:%.*]]) #[[ATTR7:[0-9]+]] { ; TUNIT-NEXT: [[MEM_PRIV:%.*]] = alloca i32, align 4 @@ -1304,7 +1304,7 @@ ; TUNIT-NEXT: [[ADD:%.*]] = add i32 [[MUL]], 7 ; TUNIT-NEXT: ret i32 [[ADD]] ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(argmem: read) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) ; CGSCC-LABEL: define {{[^@]+}}@ret_speculatable_expr ; CGSCC-SAME: (i32 [[TMP0:%.*]]) #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: [[MEM_PRIV:%.*]] = alloca i32, align 4 @@ -1321,7 +1321,7 @@ } define internal void @not_called1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_called1 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret void @@ -1329,7 +1329,7 @@ ret void } define internal void @not_called2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_called2 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret void @@ -1337,7 +1337,7 @@ ret void } define internal void @not_called3() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@not_called3 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret void @@ -1369,13 +1369,13 @@ @x = external global i32 define internal void @indirect() { -; TUNIT: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; TUNIT: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; TUNIT-LABEL: define {{[^@]+}}@indirect ; TUNIT-SAME: () #[[ATTR4]] { ; TUNIT-NEXT: store i32 0, ptr @x, align 4 ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nofree norecurse nosync nounwind willreturn memory(write) +; CGSCC: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write) ; CGSCC-LABEL: define {{[^@]+}}@indirect ; CGSCC-SAME: () #[[ATTR11:[0-9]+]] { ; CGSCC-NEXT: store i32 0, ptr @x, align 4 @@ -1410,7 +1410,7 @@ } define i1 @constexpr_icmp1() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@constexpr_icmp1 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret i1 true @@ -1419,7 +1419,7 @@ } define i1 @constexpr_icmp2() { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@constexpr_icmp2 ; CHECK-SAME: () #[[ATTR1]] { ; CHECK-NEXT: ret i1 false @@ -1429,13 +1429,13 @@ ;. ; TUNIT: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; TUNIT: attributes #[[ATTR2]] = { nofree norecurse nosync nounwind willreturn } -; TUNIT: attributes #[[ATTR3]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; TUNIT: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; TUNIT: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn } +; TUNIT: attributes #[[ATTR3]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; TUNIT: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; TUNIT: attributes #[[ATTR5:[0-9]+]] = { speculatable memory(none) } ; TUNIT: attributes #[[ATTR6]] = { norecurse nosync memory(none) } -; TUNIT: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; TUNIT: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } ; TUNIT: attributes #[[ATTR8:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; TUNIT: attributes #[[ATTR9]] = { nofree nosync nounwind willreturn } ; TUNIT: attributes #[[ATTR10]] = { willreturn } @@ -1443,17 +1443,17 @@ ; TUNIT: attributes #[[ATTR12]] = { nosync nounwind } ;. ; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR1]] = { nofree norecurse nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR2]] = { nofree nosync nounwind willreturn memory(none) } -; CGSCC: attributes #[[ATTR3]] = { nofree nosync nounwind willreturn } -; CGSCC: attributes #[[ATTR4]] = { nofree norecurse nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR5]] = { nofree nosync nounwind willreturn memory(argmem: write) } -; CGSCC: attributes #[[ATTR6]] = { nofree nosync nounwind willreturn memory(write) } -; CGSCC: attributes #[[ATTR7]] = { nofree norecurse nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR2]] = { mustprogress nofree nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR3]] = { mustprogress nofree nosync nounwind willreturn } +; CGSCC: attributes #[[ATTR4]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR5]] = { mustprogress nofree nosync nounwind willreturn memory(argmem: write) } +; CGSCC: attributes #[[ATTR6]] = { mustprogress nofree nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR7]] = { mustprogress nofree norecurse nosync nounwind willreturn } ; CGSCC: attributes #[[ATTR8:[0-9]+]] = { speculatable memory(none) } ; CGSCC: attributes #[[ATTR9]] = { norecurse nosync memory(none) } -; CGSCC: attributes #[[ATTR10]] = { nofree norecurse nosync nounwind willreturn memory(argmem: read) } -; CGSCC: attributes #[[ATTR11]] = { nofree norecurse nosync nounwind willreturn memory(write) } +; CGSCC: attributes #[[ATTR10]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(argmem: read) } +; CGSCC: attributes #[[ATTR11]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(write) } ; CGSCC: attributes #[[ATTR12:[0-9]+]] = { nocallback nofree nounwind willreturn memory(argmem: readwrite) } ; CGSCC: attributes #[[ATTR13]] = { willreturn } ; CGSCC: attributes #[[ATTR14]] = { nounwind willreturn } diff --git a/llvm/test/Transforms/Attributor/willreturn.ll b/llvm/test/Transforms/Attributor/willreturn.ll --- a/llvm/test/Transforms/Attributor/willreturn.ll +++ b/llvm/test/Transforms/Attributor/willreturn.ll @@ -10,7 +10,7 @@ ; TEST 1 (positive case) define void @only_return() #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@only_return ; CHECK-SAME: () #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret void @@ -35,9 +35,9 @@ ; TUNIT-NEXT: br i1 [[TMP2]], label [[TMP9:%.*]], label [[TMP3:%.*]] ; TUNIT: 3: ; TUNIT-NEXT: [[TMP4:%.*]] = add nsw i32 [[TMP0]], -1 -; TUNIT-NEXT: [[TMP5:%.*]] = tail call i32 @fib(i32 [[TMP4]]) #[[ATTR26:[0-9]+]] +; TUNIT-NEXT: [[TMP5:%.*]] = tail call i32 @fib(i32 [[TMP4]]) #[[ATTR25:[0-9]+]] ; TUNIT-NEXT: [[TMP6:%.*]] = add nsw i32 [[TMP0]], -2 -; TUNIT-NEXT: [[TMP7:%.*]] = tail call i32 @fib(i32 [[TMP6]]) #[[ATTR26]] +; TUNIT-NEXT: [[TMP7:%.*]] = tail call i32 @fib(i32 [[TMP6]]) #[[ATTR25]] ; TUNIT-NEXT: [[TMP8:%.*]] = add nsw i32 [[TMP7]], [[TMP5]] ; TUNIT-NEXT: ret i32 [[TMP8]] ; TUNIT: 9: @@ -50,9 +50,9 @@ ; CGSCC-NEXT: br i1 [[TMP2]], label [[TMP9:%.*]], label [[TMP3:%.*]] ; CGSCC: 3: ; CGSCC-NEXT: [[TMP4:%.*]] = add nsw i32 [[TMP0]], -1 -; CGSCC-NEXT: [[TMP5:%.*]] = tail call i32 @fib(i32 [[TMP4]]) #[[ATTR27:[0-9]+]] +; CGSCC-NEXT: [[TMP5:%.*]] = tail call i32 @fib(i32 [[TMP4]]) #[[ATTR26:[0-9]+]] ; CGSCC-NEXT: [[TMP6:%.*]] = add nsw i32 [[TMP0]], -2 -; CGSCC-NEXT: [[TMP7:%.*]] = tail call i32 @fib(i32 [[TMP6]]) #[[ATTR27]] +; CGSCC-NEXT: [[TMP7:%.*]] = tail call i32 @fib(i32 [[TMP6]]) #[[ATTR26]] ; CGSCC-NEXT: [[TMP8:%.*]] = add nsw i32 [[TMP7]], [[TMP5]] ; CGSCC-NEXT: ret i32 [[TMP8]] ; CGSCC: 9: @@ -132,7 +132,7 @@ ; } define i32 @fact_loop(i32 %0) local_unnamed_addr #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@fact_loop ; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP0]], 1 @@ -181,8 +181,8 @@ ; TUNIT-SAME: (i1 noundef [[C:%.*]]) #[[ATTR4:[0-9]+]] { ; TUNIT-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]] ; TUNIT: rec: -; TUNIT-NEXT: call void @sink() #[[ATTR12:[0-9]+]] -; TUNIT-NEXT: call void @mutual_recursion2(i1 noundef [[C]]) #[[ATTR26]] +; TUNIT-NEXT: call void @sink() #[[ATTR26:[0-9]+]] +; TUNIT-NEXT: call void @mutual_recursion2(i1 noundef [[C]]) #[[ATTR25]] ; TUNIT-NEXT: br label [[END]] ; TUNIT: end: ; TUNIT-NEXT: ret void @@ -192,8 +192,8 @@ ; CGSCC-SAME: (i1 noundef [[C:%.*]]) #[[ATTR4:[0-9]+]] { ; CGSCC-NEXT: br i1 [[C]], label [[REC:%.*]], label [[END:%.*]] ; CGSCC: rec: -; CGSCC-NEXT: call void @sink() #[[ATTR12:[0-9]+]] -; CGSCC-NEXT: call void @mutual_recursion2(i1 noundef [[C]]) #[[ATTR27]] +; CGSCC-NEXT: call void @sink() #[[ATTR27:[0-9]+]] +; CGSCC-NEXT: call void @mutual_recursion2(i1 noundef [[C]]) #[[ATTR26]] ; CGSCC-NEXT: br label [[END]] ; CGSCC: end: ; CGSCC-NEXT: ret void @@ -212,13 +212,13 @@ ; TUNIT: Function Attrs: nofree noinline nosync nounwind uwtable ; TUNIT-LABEL: define {{[^@]+}}@mutual_recursion2 ; TUNIT-SAME: (i1 [[C:%.*]]) #[[ATTR4]] { -; TUNIT-NEXT: call void @mutual_recursion1(i1 [[C]]) #[[ATTR26]] +; TUNIT-NEXT: call void @mutual_recursion1(i1 [[C]]) #[[ATTR25]] ; TUNIT-NEXT: ret void ; ; CGSCC: Function Attrs: nofree noinline nosync nounwind uwtable ; CGSCC-LABEL: define {{[^@]+}}@mutual_recursion2 ; CGSCC-SAME: (i1 [[C:%.*]]) #[[ATTR4]] { -; CGSCC-NEXT: call void @mutual_recursion1(i1 [[C]]) #[[ATTR27]] +; CGSCC-NEXT: call void @mutual_recursion1(i1 [[C]]) #[[ATTR26]] ; CGSCC-NEXT: ret void ; call void @mutual_recursion1(i1 %c) @@ -299,7 +299,7 @@ declare float @llvm.floor.f32(float) define void @call_floor(float %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@call_floor ; CHECK-SAME: (float [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret void @@ -309,13 +309,13 @@ } define float @call_floor2(float %a) #0 { -; TUNIT: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; TUNIT: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; TUNIT-LABEL: define {{[^@]+}}@call_floor2 ; TUNIT-SAME: (float [[A:%.*]]) #[[ATTR0]] { ; TUNIT-NEXT: [[C:%.*]] = tail call nofpclass(sub) float @llvm.floor.f32(float [[A]]) #[[ATTR27:[0-9]+]] ; TUNIT-NEXT: ret float [[C]] ; -; CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CGSCC: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CGSCC-LABEL: define {{[^@]+}}@call_floor2 ; CGSCC-SAME: (float [[A:%.*]]) #[[ATTR0]] { ; CGSCC-NEXT: [[C:%.*]] = tail call nofpclass(sub) float @llvm.floor.f32(float [[A]]) #[[ATTR28:[0-9]+]] @@ -360,13 +360,13 @@ declare void @will_return() willreturn norecurse define void @f1() #0 { -; TUNIT: Function Attrs: noinline nounwind willreturn uwtable +; TUNIT: Function Attrs: mustprogress noinline nounwind willreturn uwtable ; TUNIT-LABEL: define {{[^@]+}}@f1 ; TUNIT-SAME: () #[[ATTR10:[0-9]+]] { ; TUNIT-NEXT: tail call void @will_return() #[[ATTR27]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: noinline nounwind willreturn uwtable +; CGSCC: Function Attrs: mustprogress noinline nounwind willreturn uwtable ; CGSCC-LABEL: define {{[^@]+}}@f1 ; CGSCC-SAME: () #[[ATTR10:[0-9]+]] { ; CGSCC-NEXT: tail call void @will_return() #[[ATTR28]] @@ -377,11 +377,17 @@ } define void @f2() #0 { -; CHECK: Function Attrs: noinline nounwind willreturn uwtable -; CHECK-LABEL: define {{[^@]+}}@f2 -; CHECK-SAME: () #[[ATTR10:[0-9]+]] { -; CHECK-NEXT: tail call void @f1() #[[ATTR12:[0-9]+]] -; CHECK-NEXT: ret void +; TUNIT: Function Attrs: mustprogress noinline nounwind willreturn uwtable +; TUNIT-LABEL: define {{[^@]+}}@f2 +; TUNIT-SAME: () #[[ATTR10]] { +; TUNIT-NEXT: tail call void @f1() #[[ATTR26]] +; TUNIT-NEXT: ret void +; +; CGSCC: Function Attrs: mustprogress noinline nounwind willreturn uwtable +; CGSCC-LABEL: define {{[^@]+}}@f2 +; CGSCC-SAME: () #[[ATTR10]] { +; CGSCC-NEXT: tail call void @f1() #[[ATTR27]] +; CGSCC-NEXT: ret void ; tail call void @f1() ret void @@ -419,9 +425,9 @@ declare i1 @maybe_raise_exception() #1 willreturn define void @invoke_test() personality i32 (...)* @__gxx_personality_v0 { -; TUNIT: Function Attrs: nounwind willreturn +; TUNIT: Function Attrs: mustprogress nounwind willreturn ; TUNIT-LABEL: define {{[^@]+}}@invoke_test -; TUNIT-SAME: () #[[ATTR12]] personality i32 (...)* @__gxx_personality_v0 { +; TUNIT-SAME: () #[[ATTR12:[0-9]+]] personality i32 (...)* @__gxx_personality_v0 { ; TUNIT-NEXT: [[TMP1:%.*]] = invoke i1 @maybe_raise_exception() #[[ATTR27]] ; TUNIT-NEXT: to label [[N:%.*]] unwind label [[F:%.*]] ; TUNIT: N: @@ -431,9 +437,9 @@ ; TUNIT-NEXT: catch i8* null ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: nounwind willreturn +; CGSCC: Function Attrs: mustprogress nounwind willreturn ; CGSCC-LABEL: define {{[^@]+}}@invoke_test -; CGSCC-SAME: () #[[ATTR12]] personality i32 (...)* @__gxx_personality_v0 { +; CGSCC-SAME: () #[[ATTR12:[0-9]+]] personality i32 (...)* @__gxx_personality_v0 { ; CGSCC-NEXT: [[TMP1:%.*]] = invoke i1 @maybe_raise_exception() #[[ATTR28]] ; CGSCC-NEXT: to label [[N:%.*]] unwind label [[F:%.*]] ; CGSCC: N: @@ -467,7 +473,7 @@ ; } define i32 @loop_constant_trip_count(i32* nocapture readonly %0) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; CHECK-LABEL: define {{[^@]+}}@loop_constant_trip_count ; CHECK-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[TMP0:%.*]]) #[[ATTR13:[0-9]+]] { ; CHECK-NEXT: br label [[TMP3:%.*]] @@ -562,7 +568,7 @@ define i32 @loop_trip_dec(i32 %0, i32* nocapture readonly %1) local_unnamed_addr #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable ; CHECK-LABEL: define {{[^@]+}}@loop_trip_dec ; CHECK-SAME: (i32 [[TMP0:%.*]], i32* nocapture nofree readonly [[TMP1:%.*]]) local_unnamed_addr #[[ATTR13]] { ; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], -1 @@ -609,7 +615,7 @@ ; multiple return define i32 @multiple_return(i32 %a) #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@multiple_return ; CHECK-SAME: (i32 [[A:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[B:%.*]] = icmp eq i32 [[A]], 0 @@ -633,7 +639,7 @@ ; 15.1 (positive case) define void @unreachable_exit_positive1() #0 { -; TUNIT: Function Attrs: noinline nounwind willreturn uwtable +; TUNIT: Function Attrs: mustprogress noinline nounwind willreturn uwtable ; TUNIT-LABEL: define {{[^@]+}}@unreachable_exit_positive1 ; TUNIT-SAME: () #[[ATTR10]] { ; TUNIT-NEXT: tail call void @will_return() #[[ATTR27]] @@ -641,7 +647,7 @@ ; TUNIT: unreachable_label: ; TUNIT-NEXT: unreachable ; -; CGSCC: Function Attrs: noinline nounwind willreturn uwtable +; CGSCC: Function Attrs: mustprogress noinline nounwind willreturn uwtable ; CGSCC-LABEL: define {{[^@]+}}@unreachable_exit_positive1 ; CGSCC-SAME: () #[[ATTR10]] { ; CGSCC-NEXT: tail call void @will_return() #[[ATTR28]] @@ -658,7 +664,7 @@ } define i32 @unreachable_exit_positive2(i32) local_unnamed_addr #0 { -; CHECK: Function Attrs: nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@unreachable_exit_positive2 ; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr #[[ATTR0]] { ; CHECK-NEXT: [[TMP2:%.*]] = icmp slt i32 [[TMP0]], 1 @@ -827,7 +833,7 @@ ; } define i32 @bounded_nested_loops(i32 %n) { -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK-LABEL: define {{[^@]+}}@bounded_nested_loops ; CHECK-SAME: (i32 [[N:%.*]]) #[[ATTR18:[0-9]+]] { ; CHECK-NEXT: entry: @@ -1082,7 +1088,7 @@ ; TUNIT-LABEL: define {{[^@]+}}@non_loop_cycle ; TUNIT-SAME: (i32 [[N:%.*]]) #[[ATTR17]] { ; TUNIT-NEXT: entry: -; TUNIT-NEXT: [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR26]] +; TUNIT-NEXT: [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR25]] ; TUNIT-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CALL]], 5 ; TUNIT-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]] ; TUNIT: if.then: @@ -1090,7 +1096,7 @@ ; TUNIT: if.else: ; TUNIT-NEXT: br label [[ENTRY2:%.*]] ; TUNIT: entry1: -; TUNIT-NEXT: [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR26]] +; TUNIT-NEXT: [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR25]] ; TUNIT-NEXT: [[CMP2:%.*]] = icmp sgt i32 [[CALL1]], 5 ; TUNIT-NEXT: br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_ELSE4:%.*]] ; TUNIT: if.then3: @@ -1098,7 +1104,7 @@ ; TUNIT: if.else4: ; TUNIT-NEXT: br label [[ENTRY2]] ; TUNIT: entry2: -; TUNIT-NEXT: [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR26]] +; TUNIT-NEXT: [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]]) #[[ATTR25]] ; TUNIT-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[CALL5]], 5 ; TUNIT-NEXT: br i1 [[CMP6]], label [[IF_THEN7:%.*]], label [[IF_ELSE8:%.*]] ; TUNIT: if.then7: @@ -1238,15 +1244,15 @@ ret void } define void @willreturn_mustprogress_callee_2() { -; TUNIT: Function Attrs: willreturn memory(read) +; TUNIT: Function Attrs: mustprogress willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@willreturn_mustprogress_callee_2 -; TUNIT-SAME: () #[[ATTR25:[0-9]+]] { +; TUNIT-SAME: () #[[ATTR23]] { ; TUNIT-NEXT: call void @readonly_mustprogress() #[[ATTR27]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: willreturn memory(read) +; CGSCC: Function Attrs: mustprogress willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@willreturn_mustprogress_callee_2 -; CGSCC-SAME: () #[[ATTR26:[0-9]+]] { +; CGSCC-SAME: () #[[ATTR24]] { ; CGSCC-NEXT: call void @readonly_mustprogress() #[[ATTR28]] ; CGSCC-NEXT: ret void ; @@ -1262,15 +1268,15 @@ ret void } define void @willreturn_mustprogress_callee_4() { -; TUNIT: Function Attrs: willreturn memory(read) +; TUNIT: Function Attrs: mustprogress willreturn memory(read) ; TUNIT-LABEL: define {{[^@]+}}@willreturn_mustprogress_callee_4 -; TUNIT-SAME: () #[[ATTR25]] { +; TUNIT-SAME: () #[[ATTR23]] { ; TUNIT-NEXT: call void @willreturn_mustprogress_callee_2() #[[ATTR27]] ; TUNIT-NEXT: ret void ; -; CGSCC: Function Attrs: willreturn memory(read) +; CGSCC: Function Attrs: mustprogress willreturn memory(read) ; CGSCC-LABEL: define {{[^@]+}}@willreturn_mustprogress_callee_4 -; CGSCC-SAME: () #[[ATTR26]] { +; CGSCC-SAME: () #[[ATTR24]] { ; CGSCC-NEXT: call void @willreturn_mustprogress_callee_2() #[[ATTR28]] ; CGSCC-NEXT: ret void ; @@ -1281,7 +1287,7 @@ attributes #0 = { nounwind uwtable noinline } attributes #1 = { uwtable noinline } ;. -; TUNIT: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; TUNIT: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } ; TUNIT: attributes #[[ATTR1]] = { nofree noinline nosync nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR2]] = { nofree noinline norecurse nosync nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR3:[0-9]+]] = { nofree nosync nounwind willreturn } @@ -1291,27 +1297,27 @@ ; TUNIT: attributes #[[ATTR7]] = { noinline nounwind uwtable } ; TUNIT: attributes #[[ATTR8:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; TUNIT: attributes #[[ATTR9:[0-9]+]] = { norecurse willreturn } -; TUNIT: attributes #[[ATTR10]] = { noinline nounwind willreturn uwtable } +; TUNIT: attributes #[[ATTR10]] = { mustprogress noinline nounwind willreturn uwtable } ; TUNIT: attributes #[[ATTR11:[0-9]+]] = { noinline willreturn uwtable } -; TUNIT: attributes #[[ATTR12]] = { nounwind willreturn } -; TUNIT: attributes #[[ATTR13]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } +; TUNIT: attributes #[[ATTR12]] = { mustprogress nounwind willreturn } +; TUNIT: attributes #[[ATTR13]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } ; TUNIT: attributes #[[ATTR14]] = { nofree noinline norecurse nosync nounwind memory(argmem: read) uwtable } ; TUNIT: attributes #[[ATTR15]] = { nofree noinline norecurse noreturn nosync nounwind memory(none) uwtable } ; TUNIT: attributes #[[ATTR16:[0-9]+]] = { noreturn nounwind } ; TUNIT: attributes #[[ATTR17]] = { nofree norecurse nosync nounwind memory(none) } -; TUNIT: attributes #[[ATTR18]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; TUNIT: attributes #[[ATTR18]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; TUNIT: attributes #[[ATTR19:[0-9]+]] = { memory(read) } ; TUNIT: attributes #[[ATTR20:[0-9]+]] = { memory(none) } ; TUNIT: attributes #[[ATTR21]] = { mustprogress } ; TUNIT: attributes #[[ATTR22:[0-9]+]] = { mustprogress memory(read) } ; TUNIT: attributes #[[ATTR23]] = { mustprogress willreturn memory(read) } ; TUNIT: attributes #[[ATTR24]] = { mustprogress nosync willreturn memory(none) } -; TUNIT: attributes #[[ATTR25]] = { willreturn memory(read) } -; TUNIT: attributes #[[ATTR26]] = { nofree nosync nounwind } +; TUNIT: attributes #[[ATTR25]] = { nofree nosync nounwind } +; TUNIT: attributes #[[ATTR26]] = { nounwind willreturn } ; TUNIT: attributes #[[ATTR27]] = { willreturn } ; TUNIT: attributes #[[ATTR28]] = { nounwind } ;. -; CGSCC: attributes #[[ATTR0]] = { nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } +; CGSCC: attributes #[[ATTR0]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(none) uwtable } ; CGSCC: attributes #[[ATTR1]] = { nofree noinline nosync nounwind memory(none) uwtable } ; CGSCC: attributes #[[ATTR2]] = { nofree noinline norecurse nosync nounwind memory(none) uwtable } ; CGSCC: attributes #[[ATTR3:[0-9]+]] = { nofree nosync nounwind willreturn } @@ -1321,15 +1327,15 @@ ; CGSCC: attributes #[[ATTR7]] = { noinline nounwind uwtable } ; CGSCC: attributes #[[ATTR8:[0-9]+]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } ; CGSCC: attributes #[[ATTR9:[0-9]+]] = { norecurse willreturn } -; CGSCC: attributes #[[ATTR10]] = { noinline nounwind willreturn uwtable } +; CGSCC: attributes #[[ATTR10]] = { mustprogress noinline nounwind willreturn uwtable } ; CGSCC: attributes #[[ATTR11:[0-9]+]] = { noinline willreturn uwtable } -; CGSCC: attributes #[[ATTR12]] = { nounwind willreturn } -; CGSCC: attributes #[[ATTR13]] = { nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } +; CGSCC: attributes #[[ATTR12]] = { mustprogress nounwind willreturn } +; CGSCC: attributes #[[ATTR13]] = { mustprogress nofree noinline norecurse nosync nounwind willreturn memory(argmem: read) uwtable } ; CGSCC: attributes #[[ATTR14]] = { nofree noinline norecurse nosync nounwind memory(argmem: read) uwtable } ; CGSCC: attributes #[[ATTR15]] = { nofree noinline norecurse noreturn nosync nounwind memory(none) uwtable } ; CGSCC: attributes #[[ATTR16:[0-9]+]] = { noreturn nounwind } ; CGSCC: attributes #[[ATTR17]] = { nofree norecurse nosync nounwind memory(none) } -; CGSCC: attributes #[[ATTR18]] = { nofree norecurse nosync nounwind willreturn memory(none) } +; CGSCC: attributes #[[ATTR18]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) } ; CGSCC: attributes #[[ATTR19]] = { nofree nosync nounwind memory(none) } ; CGSCC: attributes #[[ATTR20:[0-9]+]] = { memory(read) } ; CGSCC: attributes #[[ATTR21:[0-9]+]] = { memory(none) } @@ -1337,8 +1343,8 @@ ; CGSCC: attributes #[[ATTR23:[0-9]+]] = { mustprogress memory(read) } ; CGSCC: attributes #[[ATTR24]] = { mustprogress willreturn memory(read) } ; CGSCC: attributes #[[ATTR25]] = { mustprogress nosync willreturn memory(none) } -; CGSCC: attributes #[[ATTR26]] = { willreturn memory(read) } -; CGSCC: attributes #[[ATTR27]] = { nofree nosync nounwind } +; CGSCC: attributes #[[ATTR26]] = { nofree nosync nounwind } +; CGSCC: attributes #[[ATTR27]] = { nounwind willreturn } ; CGSCC: attributes #[[ATTR28]] = { willreturn } ; CGSCC: attributes #[[ATTR29]] = { nounwind } ;. diff --git a/llvm/test/Transforms/Attributor/wrapper.ll b/llvm/test/Transforms/Attributor/wrapper.ll --- a/llvm/test/Transforms/Attributor/wrapper.ll +++ b/llvm/test/Transforms/Attributor/wrapper.ll @@ -8,7 +8,7 @@ ; CHECK: ret ; ; Check the original function, which is wrapped and becomes anonymous -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK: define internal noundef i32 @0() ; CHECK: ret i32 1 define linkonce i32 @inner1() { @@ -35,7 +35,7 @@ ; CHECK: tail call i32 @1(i32 %a, i32 %b) ; CHECK: ret ; -; CHECK: Function Attrs: nofree norecurse nosync nounwind willreturn memory(none) +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none) ; CHECK: define internal i32 @1(i32 %a, i32 %b) ; CHECK: %c = add i32 %a, %b ; CHECK: ret i32 %c diff --git a/llvm/test/Transforms/OpenMP/parallel_deletion.ll b/llvm/test/Transforms/OpenMP/parallel_deletion.ll --- a/llvm/test/Transforms/OpenMP/parallel_deletion.ll +++ b/llvm/test/Transforms/OpenMP/parallel_deletion.ll @@ -49,7 +49,7 @@ ; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.willreturn ; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: call void @unknown() #[[ATTR0]] +; CHECK-NEXT: call void @unknown() #[[ATTR14:[0-9]+]] ; CHECK-NEXT: ret void ; ; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.willreturn @@ -93,7 +93,7 @@ ; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.willreturn.1 ; CHECK-SAME: (ptr noalias nocapture nofree readnone [[DOTGLOBAL_TID_:%.*]], ptr noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]]) #[[ATTR2:[0-9]+]] { ; CHECK-NEXT: entry: -; CHECK-NEXT: call void @readnone() #[[ATTR0]] +; CHECK-NEXT: call void @readnone() #[[ATTR14]] ; CHECK-NEXT: ret void ; ; CHECK1-LABEL: define {{[^@]+}}@.omp_outlined.willreturn.1 @@ -282,7 +282,7 @@ ; CHECK-LABEL: define {{[^@]+}}@delete_parallel_2() { ; CHECK-NEXT: entry: ; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4 -; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull align 4 dereferenceable(4) [[A]]) #[[ATTR0]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull align 4 dereferenceable(4) [[A]]) #[[ATTR14]] ; CHECK-NEXT: store i32 0, ptr [[A]], align 4 ; CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB0]], i32 noundef 1, ptr noundef @.omp_outlined..3, ptr nocapture nofree noundef nonnull align 4 dereferenceable(4) [[A]]) ; CHECK-NEXT: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr noundef nonnull align 8 dereferenceable(24) @[[GLOB0]], i32 noundef 1, ptr noundef @.omp_outlined..4, ptr nocapture nofree noundef nonnull align 4 dereferenceable(4) [[A]]) @@ -531,7 +531,7 @@ ; CHECK-NEXT: entry: ; CHECK-NEXT: [[A1:%.*]] = alloca i32, align 4 ; CHECK-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8 -; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull align 4 [[A1]]) #[[ATTR14:[0-9]+]] +; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 noundef 4, ptr noundef nonnull align 4 [[A1]]) #[[ATTR15:[0-9]+]] ; CHECK-NEXT: store i32 1, ptr [[A1]], align 4 ; CHECK-NEXT: store ptr [[A1]], ptr [[DOTOMP_REDUCTION_RED_LIST]], align 8 ; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[DOTGLOBAL_TID_]], align 4 diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected --- a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/check_attrs.ll.funcattrs.expected @@ -6,7 +6,7 @@ %struct.ST = type { i32, double, %struct.RT } define ptr @foo(ptr %s) nounwind uwtable readnone optsize ssp { -; CHECK: Function Attrs: nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable +; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind optsize ssp willreturn memory(none) uwtable ; CHECK-LABEL: define {{[^@]+}}@foo ; CHECK-SAME: (ptr nofree readnone [[S:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: entry: