<div dir="ltr">Hello Johannes,<br><br>This commit added broken tests to the builder:<br><div><a href="http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/23151">http://lab.llvm.org:8011/builders/llvm-clang-x86_64-expensive-checks-win/builds/23151</a></div><div></div>. . . <br>FAIL: LLVM::fp80.ll<br>FAIL: LLVM::noalias.ll<br>FAIL: LLVM::liveness.ll<div><br></div>The builder was already red and did not send notification.<br><br>Please have a look ASAP?<br><br>Thanks<br><br>Galina</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 15, 2020 at 6:01 PM Johannes Doerfert via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Johannes Doerfert<br>
Date: 2020-04-15T19:59:51-05:00<br>
New Revision: 3ca54f45953e4217ad764c68ee2abcbc3eead1e8<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/3ca54f45953e4217ad764c68ee2abcbc3eead1e8" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/3ca54f45953e4217ad764c68ee2abcbc3eead1e8</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/3ca54f45953e4217ad764c68ee2abcbc3eead1e8.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/3ca54f45953e4217ad764c68ee2abcbc3eead1e8.diff</a><br>
<br>
LOG: [Attributor] Unify testing (=updates,prefixes,run configurations,...)<br>
<br>
When the Attributor was created the test update scripts were not well<br>
suited to deal with the challenges of IR attribute checking. This<br>
partially improved.<br>
<br>
Since then we also added three additional configurations that need<br>
testing; in total we now have the following four:<br>
{ TUNIT, CGSCC } x { old pass manager (OPM), new pass manager (NPM) }<br>
<br>
Finally, the number of developers and tests grew rapidly (partially due<br>
to the addition of ArgumentPromotion and IPConstantProp tests), which<br>
resulted in tests only being run in some configurations, different<br>
prefixes being used, and different "styles" of checks being used.<br>
<br>
Due to the above reasons I believed we needed to take another look at<br>
the test update scripts. While we started to use them, via UTC_ARGS:<br>
--enable/disable, the other problems remained. To improve the testing<br>
situation for *all* configurations, to simplify future updates to the<br>
test, and to help identify subtle effects of future changes, we now use<br>
the test update scripts for (almost) all Attributor tests.<br>
<br>
An exhaustive prefix list minimizes the number of check lines and makes<br>
it easy to identify and compare configurations.<br>
<br>
Tests have been adjusted in the process but we tried to keep their<br>
intend unchanged.<br>
<br>
Reviewed By: sstefan1<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D76588" rel="noreferrer" target="_blank">https://reviews.llvm.org/D76588</a><br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/dbg.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/naked_functions.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/nonzero-address-spaces.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/pr27568.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/profile.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll<br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/variadic.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/2008-06-09-WeakProp.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/fp-bc-icmp-const-fold.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/global.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/naked-return.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/openmp_parallel_for.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll<br>
    llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll<br>
    llvm/test/Transforms/Attributor/align.ll<br>
    llvm/test/Transforms/Attributor/alwaysinline.ll<br>
    llvm/test/Transforms/Attributor/callbacks.ll<br>
    llvm/test/Transforms/Attributor/dereferenceable-1.ll<br>
    llvm/test/Transforms/Attributor/dereferenceable-2.ll<br>
    llvm/test/Transforms/Attributor/heap_to_stack.ll<br>
    llvm/test/Transforms/Attributor/internal-noalias.ll<br>
    llvm/test/Transforms/Attributor/liveness.ll<br>
    llvm/test/Transforms/Attributor/liveness_chains.ll<br>
    llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll<br>
    llvm/test/Transforms/Attributor/lvi-for-ashr.ll<br>
    llvm/test/Transforms/Attributor/memory_locations.ll<br>
    llvm/test/Transforms/Attributor/misc.ll<br>
    llvm/test/Transforms/Attributor/noalias.ll<br>
    llvm/test/Transforms/Attributor/nocapture-1.ll<br>
    llvm/test/Transforms/Attributor/nocapture-2.ll<br>
    llvm/test/Transforms/Attributor/nofree.ll<br>
    llvm/test/Transforms/Attributor/nonnull.ll<br>
    llvm/test/Transforms/Attributor/norecurse.ll<br>
    llvm/test/Transforms/Attributor/noreturn.ll<br>
    llvm/test/Transforms/Attributor/nosync.ll<br>
    llvm/test/Transforms/Attributor/nounwind.ll<br>
    llvm/test/Transforms/Attributor/range.ll<br>
    llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll<br>
    llvm/test/Transforms/Attributor/readattrs.ll<br>
    llvm/test/Transforms/Attributor/returned.ll<br>
    llvm/test/Transforms/Attributor/undefined_behavior.ll<br>
    llvm/test/Transforms/Attributor/value-simplify.ll<br>
    llvm/test/Transforms/Attributor/willreturn.ll<br>
<br>
Removed: <br>
    llvm/test/Transforms/Attributor/ArgumentPromotion/pr3085.ll<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll<br>
index d6a11193a556..f17d077fce73 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-02-01-ReturnAttrs.ll<br>
@@ -1,14 +1,29 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 -S < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define internal i32 @deref(i32* %x) nounwind {<br>
-; CHECK-LABEL: define {{[^@]+}}@deref<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[X_PRIV]]<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
-; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@deref<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@deref<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[X_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@deref<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__CGSCC____-NEXT:    ret i32 [[TMP2]]<br>
 ;<br>
 entry:<br>
   %tmp2 = load i32, i32* %x, align 4<br>
@@ -16,14 +31,30 @@ entry:<br>
 }<br>
<br>
 define i32 @f(i32 %x) {<br>
-; CHECK-LABEL: define {{[^@]+}}@f<br>
-; CHECK-SAME: (i32 [[X:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[X]], i32* [[X_ADDR]], align 4<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[X_ADDR]], align 1<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @deref(i32 [[TMP0]])<br>
-; CHECK-NEXT:    ret i32 [[TMP1]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_OPM-SAME: (i32 [[X:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[X_ADDR:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[X]], i32* [[X_ADDR]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = call i32 @deref(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[X_ADDR]])<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP1]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_NPM-SAME: (i32 [[X:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[X_ADDR:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[X]], i32* [[X_ADDR]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[X_ADDR]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = call i32 @deref(i32 [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[TMP1]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC____-SAME: (i32 [[X:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[X_ADDR:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 [[X]], i32* [[X_ADDR]], align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = call i32 @deref(i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[X_ADDR]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[TMP1]]<br>
 ;<br>
 entry:<br>
   %x_addr = alloca i32<br>
<br>
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<br>
index 9a4956be40a5..92eaeb0f3edc 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-07-02-array-indexing.ll<br>
@@ -1,20 +1,24 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 -S < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR2498<br>
<br>
 ; This test tries to convince CHECK about promoting the load from %A + 2,<br>
 ; because there is a load of %A in the entry block<br>
 define internal i32 @callee(i1 %C, i32* %A) {<br>
+;<br>
 ; CHECK-LABEL: define {{[^@]+}}@callee<br>
 ; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[A_0:%.*]] = load i32, i32* %A<br>
+; CHECK-NEXT:    [[A_0:%.*]] = load i32, i32* [[A]], align 4<br>
 ; CHECK-NEXT:    br label [[F:%.*]]<br>
 ; CHECK:       T:<br>
 ; CHECK-NEXT:    unreachable<br>
 ; CHECK:       F:<br>
-; CHECK-NEXT:    [[A_2:%.*]] = getelementptr i32, i32* %A, i32 2<br>
-; CHECK-NEXT:    [[R:%.*]] = load i32, i32* [[A_2]]<br>
+; CHECK-NEXT:    [[A_2:%.*]] = getelementptr i32, i32* [[A]], i32 2<br>
+; CHECK-NEXT:    [[R:%.*]] = load i32, i32* [[A_2]], align 4<br>
 ; CHECK-NEXT:    ret i32 [[R]]<br>
 ;<br>
 entry:<br>
@@ -33,9 +37,15 @@ F:<br>
 }<br>
<br>
 define i32 @foo(i32* %A) {<br>
-; CHECK-LABEL: define {{[^@]+}}@foo(<br>
-; CHECK-NEXT:    [[X:%.*]] = call i32 @callee(i32* nocapture nofree readonly align 4 %A)<br>
-; CHECK-NEXT:    ret i32 [[X]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@foo<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[X:%.*]] = call i32 @callee(i32* nocapture nofree readonly align 4 [[A]])<br>
+; IS__TUNIT____-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = call i32 @callee(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[X]]<br>
 ;<br>
   %X = call i32 @callee(i1 false, i32* %A)             ; <i32> [#uses=1]<br>
   ret i32 %X<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll<br>
index fd2887ecea60..2854f7111867 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-07-CGUpdate.ll<br>
@@ -1,12 +1,24 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -disable-output -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define internal fastcc i32 @hash(i32* %ts, i32 %mod) nounwind {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@hash()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   unreachable<br>
 }<br>
<br>
 define void @encode(i32* %m, i32* %ts, i32* %new) nounwind {<br>
+; CHECK-LABEL: define {{[^@]+}}@encode<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[M:%.*]], i32* nocapture nofree readnone [[TS:%.*]], i32* nocapture nofree readnone [[NEW:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind               ; <i32> [#uses=0]<br>
   unreachable<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll<br>
index fe3f1c697436..c179dd52bbe5 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll<br>
@@ -1,7 +1,18 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -disable-output -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define internal fastcc i32 @term_SharingList(i32* %Term, i32* %List) nounwind {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@term_SharingList()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    br i1 false, label [[BB:%.*]], label [[BB5:%.*]]<br>
+; IS__CGSCC____:       bb:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       bb5:<br>
+; IS__CGSCC____-NEXT:    ret i32 undef<br>
+;<br>
 entry:<br>
   br i1 false, label %bb, label %bb5<br>
<br>
@@ -14,6 +25,15 @@ bb5:         ; preds = %entry<br>
 }<br>
<br>
 define i32 @term_Sharing(i32* %Term) nounwind {<br>
+; CHECK-LABEL: define {{[^@]+}}@term_Sharing<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[TERM:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br i1 false, label [[BB_I:%.*]], label [[BB14:%.*]]<br>
+; CHECK:       bb.i:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       bb14:<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
 entry:<br>
   br i1 false, label %bb.i, label %bb14<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll<br>
index 08e254f382ec..dc99e85c12fd 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/attributes.ll<br>
@@ -1,17 +1,27 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; Test that we only promote arguments when the caller/callee have compatible<br>
 ; function attrubtes.<br>
<br>
 target triple = "x86_64-unknown-linux-gnu"<br>
<br>
 define internal fastcc void @no_promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@no_promote_avx2<br>
-; CHECK-SAME: (<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64>* noalias nocapture nofree nonnull readonly align 32 dereferenceable(32) [[ARG1:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1]], align 32<br>
-; CHECK-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
-; CHECK-NEXT:    ret void<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@no_promote_avx2<br>
+; NOT_TUNIT_NPM-SAME: (<4 x i64>* nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64>* nocapture nofree nonnull readonly align 32 dereferenceable(32) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1]], align 32<br>
+; NOT_TUNIT_NPM-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@no_promote_avx2<br>
+; IS__TUNIT_NPM-SAME: (<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64>* noalias nocapture nofree nonnull readonly align 32 dereferenceable(32) [[ARG1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <4 x i64>, <4 x i64>* %arg1<br>
@@ -20,17 +30,53 @@ bb:<br>
 }<br>
<br>
 define void @no_promote(<4 x i64>* %arg) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@no_promote<br>
-; CHECK-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    call fastcc void @no_promote_avx2(<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* noalias nocapture nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
-; CHECK-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@no_promote<br>
+; IS__TUNIT_OPM-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @no_promote_avx2(<4 x i64>* nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* nocapture nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@no_promote<br>
+; IS__TUNIT_NPM-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @no_promote_avx2(<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* noalias nocapture nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@no_promote<br>
+; IS__CGSCC_OPM-SAME: (<4 x i64>* nocapture nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @no_promote_avx2(<4 x i64>* nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@no_promote<br>
+; IS__CGSCC_NPM-SAME: (<4 x i64>* nocapture nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @no_promote_avx2(<4 x i64>* noalias nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* noalias nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <4 x i64>, align 32<br>
@@ -44,14 +90,21 @@ bb:<br>
 }<br>
<br>
 define internal fastcc void @promote_avx2(<4 x i64>* %arg, <4 x i64>* readonly %arg1) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@promote_avx2<br>
-; CHECK-SAME: (<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <4 x i64><br>
-; CHECK-NEXT:    store <4 x i64> [[TMP0]], <4 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1_PRIV]], align 32<br>
-; CHECK-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
-; CHECK-NEXT:    ret void<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@promote_avx2<br>
+; NOT_TUNIT_NPM-SAME: (<4 x i64>* nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64>* nocapture nofree nonnull readonly align 32 dereferenceable(32) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1]], align 32<br>
+; NOT_TUNIT_NPM-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@promote_avx2<br>
+; IS__TUNIT_NPM-SAME: (<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[ARG:%.*]], <4 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <4 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <4 x i64> [[TMP0]], <4 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <4 x i64>, <4 x i64>* [[ARG1_PRIV]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store <4 x i64> [[TMP]], <4 x i64>* [[ARG]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <4 x i64>, <4 x i64>* %arg1<br>
@@ -60,18 +113,54 @@ bb:<br>
 }<br>
<br>
 define void @promote(<4 x i64>* %arg) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@promote<br>
-; CHECK-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i64>, <4 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @promote_avx2(<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
-; CHECK-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@promote<br>
+; IS__TUNIT_OPM-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @promote_avx2(<4 x i64>* nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* nocapture nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@promote<br>
+; IS__TUNIT_NPM-SAME: (<4 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <4 x i64>, <4 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @promote_avx2(<4 x i64>* noalias nocapture nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@promote<br>
+; IS__CGSCC_OPM-SAME: (<4 x i64>* nocapture nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @promote_avx2(<4 x i64>* nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@promote<br>
+; IS__CGSCC_NPM-SAME: (<4 x i64>* nocapture nonnull writeonly align 2 dereferenceable(32) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <4 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <4 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(32) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @promote_avx2(<4 x i64>* noalias nofree nonnull writeonly align 32 dereferenceable(32) [[TMP2]], <4 x i64>* noalias nofree nonnull readonly align 32 dereferenceable(32) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <4 x i64>, <4 x i64>* [[TMP2]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store <4 x i64> [[TMP4]], <4 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <4 x i64>, align 32<br>
<br>
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<br>
index b994aba78dc8..ead9a0e10f71 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/min-legal-vector-width.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; Test that we only promote arguments when the caller/callee have compatible<br>
 ; function attrubtes.<br>
<br>
@@ -7,14 +10,22 @@ target triple = "x86_64-unknown-linux-gnu"<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -23,18 +34,55 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* %arg) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer512<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer512(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -49,14 +97,22 @@ bb:<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -65,18 +121,55 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -91,14 +184,22 @@ bb:<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -107,18 +208,55 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* %arg) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer512_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer512_call_avx512_legal512_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -133,14 +271,22 @@ bb:<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -149,18 +295,55 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* %arg) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal512_prefer512<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal512_prefer512(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -175,12 +358,20 @@ bb:<br>
<br>
 ; This should not promote<br>
 define internal fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -189,17 +380,54 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* %arg) #2 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal256_prefer256_call_avx512_legal512_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal256_prefer256_call_avx512_legal512_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -214,12 +442,20 @@ bb:<br>
<br>
 ; This should not promote<br>
 define internal fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #2 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -228,17 +464,54 @@ bb:<br>
 }<br>
<br>
 define void @avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* %arg) #1 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx512_legal512_prefer256_call_avx512_legal256_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx512_legal512_prefer256_call_avx512_legal256_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -253,14 +526,22 @@ bb:<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #3 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -269,18 +550,55 @@ bb:<br>
 }<br>
<br>
 define void @avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* %arg) #4 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx2_legal256_prefer256_call_avx2_legal512_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx2_legal256_prefer256_call_avx2_legal512_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
@@ -295,14 +613,22 @@ bb:<br>
<br>
 ; This should promote<br>
 define internal fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg, <8 x i64>* readonly %arg1) #4 {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
-; CHECK-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
-; CHECK-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; NOT_TUNIT_NPM-SAME: (<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[ARG1:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  bb:<br>
+; NOT_TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; NOT_TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[ARG:%.*]], <8 x i64> [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[ARG1_PRIV:%.*]] = alloca <8 x i64><br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP0]], <8 x i64>* [[ARG1_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load <8 x i64>, <8 x i64>* [[ARG1_PRIV]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP]], <8 x i64>* [[ARG]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = load <8 x i64>, <8 x i64>* %arg1<br>
@@ -311,18 +637,55 @@ bb:<br>
 }<br>
<br>
 define void @avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* %arg) #3 {<br>
-; CHECK-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
-; CHECK-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
-; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 32 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
-; CHECK-NEXT:    call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
-; CHECK-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; IS__TUNIT_OPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  bb:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_OPM-NEXT:    call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nocapture nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; IS__TUNIT_NPM-SAME: (<8 x i64>* nocapture writeonly [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  bb:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load <8 x i64>, <8 x i64>* [[TMP]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* noalias nocapture nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64> [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; IS__CGSCC_OPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  bb:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_OPM-NEXT:    call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@avx2_legal512_prefer256_call_avx2_legal256_prefer256<br>
+; IS__CGSCC_NPM-SAME: (<8 x i64>* nocapture nonnull writeonly align 2 dereferenceable(64) [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  bb:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = alloca <8 x i64>, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = bitcast <8 x i64>* [[TMP]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* nonnull writeonly align 64 dereferenceable(64) [[TMP3]], i8 0, i64 32, i1 false)<br>
+; IS__CGSCC_NPM-NEXT:    call fastcc void @callee_avx2_legal512_prefer256_call_avx2_legal256_prefer256(<8 x i64>* noalias nofree nonnull writeonly align 64 dereferenceable(64) [[TMP2]], <8 x i64>* noalias nofree nonnull readonly align 64 dereferenceable(64) [[TMP]])<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = load <8 x i64>, <8 x i64>* [[TMP2]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    store <8 x i64> [[TMP4]], <8 x i64>* [[ARG]], align 2<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = alloca <8 x i64>, align 32<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll<br>
index d9f3681ba4ab..ec32b24e1b9a 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll<br>
@@ -4,8 +4,10 @@<br>
 ; we don't do that anymore. It also verifies that the combination of<br>
 ; globalopt and argpromotion is able to optimize the call safely.<br>
 ;<br>
-; RUN: opt -S -argpromotion %s | FileCheck %s --check-prefix=ARGPROMOTION<br>
-; RUN: opt -S -globalopt -argpromotion %s | FileCheck %s --check-prefix=GLOBALOPT_ARGPROMOTION<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"<br>
 target triple = "i386-pc-windows-msvc19.11.0"<br>
@@ -13,25 +15,25 @@ target triple = "i386-pc-windows-msvc19.11.0"<br>
 %struct.a = type { i8 }<br>
<br>
 define internal x86_thiscallcc void @internalfun(%struct.a* %this, <{ %struct.a }>* inalloca) {<br>
-; ARGPROMOTION-LABEL: define {{[^@]+}}@internalfun<br>
-; ARGPROMOTION-SAME: (%struct.a* [[THIS:%.*]], <{ [[STRUCT_A:%.*]] }>* inalloca [[TMP0:%.*]])<br>
-; ARGPROMOTION-NEXT:  entry:<br>
-; ARGPROMOTION-NEXT:    [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[TMP0]], i32 0, i32 0<br>
-; ARGPROMOTION-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4<br>
-; ARGPROMOTION-NEXT:    [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0<br>
-; ARGPROMOTION-NEXT:    [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* [[TMP1]], %struct.a* dereferenceable(1) [[A]])<br>
-; ARGPROMOTION-NEXT:    call void @ext(<{ [[STRUCT_A]] }>* inalloca [[ARGMEM]])<br>
-; ARGPROMOTION-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@internalfun<br>
+; IS__TUNIT____-SAME: (%struct.a* noalias nocapture nofree readnone [[THIS:%.*]], <{ [[STRUCT_A:%.*]] }>* inalloca nonnull align 4 dereferenceable(1) [[TMP0:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[TMP0]], i32 0, i32 0<br>
+; IS__TUNIT____-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* nonnull align 4 dereferenceable(1) [[TMP1]], %struct.a* nonnull align 4 dereferenceable(1) [[A]])<br>
+; IS__TUNIT____-NEXT:    call void @ext(<{ [[STRUCT_A]] }>* inalloca nonnull align 4 dereferenceable(1) [[ARGMEM]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
 ;<br>
-; GLOBALOPT_ARGPROMOTION-LABEL: define {{[^@]+}}@internalfun<br>
-; GLOBALOPT_ARGPROMOTION-SAME: (<{ [[STRUCT_A:%.*]] }>* [[TMP0:%.*]]) unnamed_addr<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:  entry:<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[TMP0]], i32 0, i32 0<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* [[TMP1]], %struct.a* dereferenceable(1) [[A]])<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    call void @ext(<{ [[STRUCT_A]] }>* inalloca [[ARGMEM]])<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    ret void<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@internalfun<br>
+; IS__CGSCC____-SAME: (%struct.a* nocapture nofree readnone [[THIS:%.*]], <{ [[STRUCT_A:%.*]] }>* inalloca nonnull dereferenceable(1) [[TMP0:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[TMP0]], i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A]] }>, align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = getelementptr inbounds <{ [[STRUCT_A]] }>, <{ [[STRUCT_A]] }>* [[ARGMEM]], i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call x86_thiscallcc %struct.a* @copy_ctor(%struct.a* nonnull align 4 dereferenceable(1) [[TMP1]], %struct.a* nonnull dereferenceable(1) [[A]])<br>
+; IS__CGSCC____-NEXT:    call void @ext(<{ [[STRUCT_A]] }>* inalloca nonnull align 4 dereferenceable(1) [[ARGMEM]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %a = getelementptr inbounds <{ %struct.a }>, <{ %struct.a }>* %0, i32 0, i32 0<br>
@@ -44,21 +46,21 @@ entry:<br>
<br>
 ; This is here to ensure @internalfun is live.<br>
 define void @exportedfun(%struct.a* %a) {<br>
-; ARGPROMOTION-LABEL: define {{[^@]+}}@exportedfun<br>
-; ARGPROMOTION-SAME: (%struct.a* [[A:%.*]])<br>
-; ARGPROMOTION-NEXT:    [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()<br>
-; ARGPROMOTION-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4<br>
-; ARGPROMOTION-NEXT:    call x86_thiscallcc void @internalfun(%struct.a* [[A]], <{ [[STRUCT_A]] }>* inalloca [[ARGMEM]])<br>
-; ARGPROMOTION-NEXT:    call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])<br>
-; ARGPROMOTION-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@exportedfun<br>
+; IS__TUNIT____-SAME: (%struct.a* nocapture nofree readnone [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()<br>
+; IS__TUNIT____-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4<br>
+; IS__TUNIT____-NEXT:    call x86_thiscallcc void @internalfun(%struct.a* noalias nofree readnone undef, <{ [[STRUCT_A]] }>* inalloca nonnull align 4 dereferenceable(1) [[ARGMEM]])<br>
+; IS__TUNIT____-NEXT:    call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
 ;<br>
-; GLOBALOPT_ARGPROMOTION-LABEL: define {{[^@]+}}@exportedfun<br>
-; GLOBALOPT_ARGPROMOTION-SAME: (%struct.a* [[A:%.*]]) local_unnamed_addr<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    call fastcc void @internalfun(<{ [[STRUCT_A]] }>* [[ARGMEM]])<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])<br>
-; GLOBALOPT_ARGPROMOTION-NEXT:    ret void<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@exportedfun<br>
+; IS__CGSCC____-SAME: (%struct.a* nocapture nofree readnone [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()<br>
+; IS__CGSCC____-NEXT:    [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4<br>
+; IS__CGSCC____-NEXT:    call x86_thiscallcc void @internalfun(%struct.a* noalias nocapture nofree readnone [[A]], <{ [[STRUCT_A]] }>* inalloca nonnull align 4 dereferenceable(1) [[ARGMEM]])<br>
+; IS__CGSCC____-NEXT:    call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %inalloca.save = tail call i8* @llvm.stacksave()<br>
   %argmem = alloca inalloca <{ %struct.a }>, align 4<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll<br>
index dc71592e4f9a..be64712b02bb 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/aggregate-promote.ll<br>
@@ -1,14 +1,20 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -disable-output -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 %T = type { i32, i32, i32, i32 }<br>
 @G = constant %T { i32 0, i32 0, i32 17, i32 25 }<br>
<br>
 define internal i32 @test(%T* %p) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test<br>
-; CHECK-SAME: (i32 [[P_0_2_VAL:%.*]], i32 [[P_0_3_VAL:%.*]])<br>
+; CHECK-LABEL: define {{[^@]+}}@test()<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[V:%.*]] = add i32 [[P_0_3_VAL]], [[P_0_2_VAL]]<br>
+; CHECK-NEXT:    [[A_GEP:%.*]] = getelementptr [[T:%.*]], %T* @G, i64 0, i32 3<br>
+; CHECK-NEXT:    [[B_GEP:%.*]] = getelementptr [[T]], %T* @G, i64 0, i32 2<br>
+; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[A_GEP]], align 4<br>
+; CHECK-NEXT:    [[B:%.*]] = load i32, i32* [[B_GEP]], align 4<br>
+; CHECK-NEXT:    [[V:%.*]] = add i32 [[A]], [[B]]<br>
 ; CHECK-NEXT:    ret i32 [[V]]<br>
 ;<br>
 entry:<br>
@@ -23,11 +29,7 @@ entry:<br>
 define i32 @caller() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@caller()<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[G_IDX:%.*]] = getelementptr [[T:%.*]], %T* @G, i64 0, i32 2<br>
-; CHECK-NEXT:    [[G_IDX_VAL:%.*]] = load i32, i32* [[G_IDX]]<br>
-; CHECK-NEXT:    [[G_IDX1:%.*]] = getelementptr [[T]], %T* @G, i64 0, i32 3<br>
-; CHECK-NEXT:    [[G_IDX1_VAL:%.*]] = load i32, i32* [[G_IDX1]]<br>
-; CHECK-NEXT:    [[V:%.*]] = call i32 @test(i32 [[G_IDX_VAL]], i32 [[G_IDX1_VAL]])<br>
+; CHECK-NEXT:    [[V:%.*]] = call i32 @test()<br>
 ; CHECK-NEXT:    ret i32 [[V]]<br>
 ;<br>
 entry:<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll<br>
index 3b0085a019e4..21f7ead3b0a4 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/alignment.ll<br>
@@ -1,13 +1,28 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define void @f() {<br>
-; CHECK-LABEL: define {{[^@]+}}@f()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 1<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 1<br>
-; CHECK-NEXT:    call void @g(i32 [[TMP0]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = alloca i32, align 1<br>
+; IS__TUNIT_OPM-NEXT:    call void @g(i32* noalias nocapture nonnull readonly dereferenceable(4) [[A]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = alloca i32, align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call void @g(i32 [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@f()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = alloca i32, align 1<br>
+; IS__CGSCC____-NEXT:    call void @g(i32* noalias nonnull readonly dereferenceable(4) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %a = alloca i32, align 1<br>
@@ -16,13 +31,25 @@ entry:<br>
 }<br>
<br>
 define internal void @g(i32* %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@g<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]])<br>
-; CHECK-NEXT:    [[A_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[A_PRIV]]<br>
-; CHECK-NEXT:    [[AA:%.*]] = load i32, i32* [[A_PRIV]], align 1<br>
-; CHECK-NEXT:    call void @z(i32 [[AA]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@g<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nonnull readonly dereferenceable(4) [[A:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[AA:%.*]] = load i32, i32* [[A]], align 1<br>
+; IS__TUNIT_OPM-NEXT:    call void @z(i32 [[AA]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@g<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[A_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[A_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[AA:%.*]] = load i32, i32* [[A_PRIV]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call void @z(i32 [[AA]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@g<br>
+; IS__CGSCC____-SAME: (i32* nocapture nonnull readonly dereferenceable(4) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[AA:%.*]] = load i32, i32* [[A]], align 1<br>
+; IS__CGSCC____-NEXT:    call void @z(i32 [[AA]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %aa = load i32, i32* %a, align 1<br>
   call void @z(i32 %aa)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll<br>
index 6e8a2e5e78f5..e28e4e592f12 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/attrs.ll<br>
@@ -1,28 +1,75 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 %struct.ss = type { i32, i64 }<br>
<br>
 ; Don't drop 'byval' on %X here.<br>
 define internal i32 @f(%struct.ss* byval %b, i32* byval %X, i32 %i) nounwind {<br>
-; CHECK-LABEL: define {{[^@]+}}@f<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[I:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP2]], i32* [[X_PRIV]]<br>
-; CHECK-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
-; CHECK-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
-; CHECK-NEXT:    store i32 0, i32* [[X_PRIV]], align 4<br>
-; CHECK-NEXT:    [[L:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
-; CHECK-NEXT:    [[A:%.*]] = add i32 [[L]], [[TMP2]]<br>
-; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 8 dereferenceable(12) [[B:%.*]], i32* noalias nocapture nofree nonnull byval align 4 dereferenceable(4) [[X:%.*]], i32 [[I:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[L:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = add i32 [[L]], [[TMP2]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]], i32 [[I:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP2]], i32* [[X_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    store i32 0, i32* [[X_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[L:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = add i32 [[L]], [[TMP2]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 4 dereferenceable(4) [[B:%.*]], i32* noalias nocapture nofree nonnull byval align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[L:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[A:%.*]] = add i32 [[L]], [[TMP2]]<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP2]], i32* [[X_PRIV]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[X_PRIV]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[L:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[A:%.*]] = add i32 [[L]], [[TMP2]]<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[A]]<br>
 ;<br>
 entry:<br>
<br>
@@ -39,21 +86,60 @@ entry:<br>
<br>
 ; Also make sure we don't drop the call zeroext attribute.<br>
 define i32 @test(i32* %X) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test<br>
-; CHECK-SAME: (i32* nocapture nofree readonly align 4 [[X:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
-; CHECK-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
-; CHECK-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 1<br>
-; CHECK-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X]], align 1<br>
-; CHECK-NEXT:    [[C:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]], i32 zeroext 0)<br>
-; CHECK-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT_OPM-SAME: (i32* nocapture nofree readonly align 4 [[X:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = call i32 @f(%struct.ss* noalias nocapture nofree nonnull readonly byval align 8 dereferenceable(12) [[S]], i32* nocapture nofree readonly byval align 4 [[X]], i32 zeroext 0)<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT_NPM-SAME: (i32* nocapture nofree readonly align 4 [[X:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]], i32 zeroext 0)<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call i32 @f(%struct.ss* noalias nofree nonnull readnone byval align 8 dereferenceable(12) [[S]], i32* noalias nocapture nofree nonnull readnone byval align 4 dereferenceable(4) [[X]])<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[X]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]], i32 [[TMP2]])<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[C]]<br>
 ;<br>
 entry:<br>
   %S = alloca %struct.ss<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll<br>
index 7739ad757337..6d2131610fb1 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/basictest.ll<br>
@@ -1,18 +1,35 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 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"<br>
<br>
 define internal i32 @test(i32* %X, i32* %Y) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; CHECK-NEXT:    [[Y_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP1]], i32* [[Y_PRIV]]<br>
-; CHECK-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[X_PRIV]]<br>
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
-; CHECK-NEXT:    [[B:%.*]] = load i32, i32* [[Y_PRIV]], align 4<br>
-; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[B]]<br>
-; CHECK-NEXT:    ret i32 [[C]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[X:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[Y:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = load i32, i32* [[Y]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[Y_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP1]], i32* [[Y_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[X_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = load i32, i32* [[X_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = load i32, i32* [[Y_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[X:%.*]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[Y:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = load i32, i32* [[X]], align 4<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = load i32, i32* [[Y]], align 4<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[C]]<br>
 ;<br>
   %A = load i32, i32* %X<br>
   %B = load i32, i32* %Y<br>
@@ -21,16 +38,30 @@ define internal i32 @test(i32* %X, i32* %Y) {<br>
 }<br>
<br>
 define internal i32 @caller(i32* %B) {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]])<br>
-; CHECK-NEXT:    [[B_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV]]<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[A]], align 1<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[B_PRIV]], align 1<br>
-; CHECK-NEXT:    [[C:%.*]] = call i32 @test(i32 [[TMP2]], i32 [[TMP3]])<br>
-; CHECK-NEXT:    ret i32 [[C]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@caller<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@caller<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[A]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[B_PRIV]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = call i32 @test(i32 [[TMP2]], i32 [[TMP3]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[C]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[C]]<br>
 ;<br>
   %A = alloca i32<br>
   store i32 1, i32* %A<br>
@@ -39,12 +70,24 @@ define internal i32 @caller(i32* %B) {<br>
 }<br>
<br>
 define i32 @callercaller() {<br>
-; CHECK-LABEL: define {{[^@]+}}@callercaller()<br>
-; CHECK-NEXT:    [[B:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 2, i32* [[B]], align 4<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 1<br>
-; CHECK-NEXT:    [[X:%.*]] = call i32 @caller(i32 [[TMP1]])<br>
-; CHECK-NEXT:    ret i32 [[X]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@callercaller()<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    store i32 2, i32* [[B]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callercaller()<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 2, i32* [[B]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[X:%.*]] = call i32 @caller(i32 [[TMP1]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callercaller()<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 2, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[X]]<br>
 ;<br>
   %B = alloca i32<br>
   store i32 2, i32* %B<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll<br>
index 6fdfb47a825d..f867c3c36ebd 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval-2.ll<br>
@@ -1,9 +1,39 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 %struct.ss = type { i32, i64 }<br>
<br>
 define internal void @f(%struct.ss* byval  %b, i32* byval %X) nounwind  {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 4 dereferenceable(4) [[B:%.*]], i32* noalias nocapture nofree nonnull writeonly byval align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]], i32 [[TMP2:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[X_PRIV:%.*]] = alloca i32<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP2]], i32* [[X_PRIV]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[X_PRIV]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0<br>
   %tmp1 = load i32, i32* %tmp, align 4<br>
@@ -15,15 +45,36 @@ entry:<br>
 }<br>
<br>
 define i32 @test(i32* %X) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test<br>
-; CHECK-SAME: (i32* nocapture nofree readonly align 4 [[X:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
-; CHECK-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
-; CHECK-NEXT:    ret i32 0<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly align 4 [[X:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT____-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__TUNIT____-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT____-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 0<br>
 ;<br>
 entry:<br>
   %S = alloca %struct.ss<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll<br>
index 545cbc0da701..c8d1afef5709 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/byval.ll<br>
@@ -1,24 +1,59 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 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"<br>
<br>
 %struct.ss = type { i32, i64 }<br>
<br>
 define internal i32 @f(%struct.ss* byval  %b) nounwind  {<br>
-; CHECK-LABEL: define {{[^@]+}}@f<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
-; CHECK-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
-; CHECK-NEXT:    ret i32 [[TMP1]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 8 dereferenceable(12) [[B:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP1]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[TMP1]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[TMP1]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[TMP1]]<br>
 ;<br>
 entry:<br>
   %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0<br>
@@ -30,19 +65,37 @@ entry:<br>
<br>
<br>
 define internal i32 @g(%struct.ss* byval align 32 %b) nounwind {<br>
-; CHECK-LABEL: define {{[^@]+}}@g<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 32<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
-; CHECK-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 32<br>
-; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@g<br>
+; IS__TUNIT_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 32 dereferenceable(12) [[B:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@g<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
+; IS________NPM-NEXT:  entry:<br>
+; IS________NPM-NEXT:    [[B_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS________NPM-NEXT:    [[B_PRIV_CAST:%.*]] = bitcast %struct.ss* [[B_PRIV]] to i32*<br>
+; IS________NPM-NEXT:    store i32 [[TMP0]], i32* [[B_PRIV_CAST]]<br>
+; IS________NPM-NEXT:    [[B_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 1<br>
+; IS________NPM-NEXT:    store i64 [[TMP1]], i64* [[B_PRIV_0_1]]<br>
+; IS________NPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[B_PRIV]], i32 0, i32 0<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 32<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS________NPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 32<br>
+; IS________NPM-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@g<br>
+; IS__CGSCC_OPM-SAME: (%struct.ss* noalias nocapture nofree nonnull byval align 32 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[B]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = add i32 [[TMP1]], 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[TMP2]], i32* [[TMP]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[TMP2]]<br>
 ;<br>
 entry:<br>
   %tmp = getelementptr %struct.ss, %struct.ss* %b, i32 0, i32 0<br>
@@ -54,25 +107,69 @@ entry:<br>
<br>
<br>
 define i32 @main() nounwind  {<br>
-; CHECK-LABEL: define {{[^@]+}}@main()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
-; CHECK-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
-; CHECK-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 1<br>
-; CHECK-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
-; CHECK-NEXT:    [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]])<br>
-; CHECK-NEXT:    [[S_CAST1:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[S_CAST1]], align 1<br>
-; CHECK-NEXT:    [[S_0_12:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = load i64, i64* [[S_0_12]], align 1<br>
-; CHECK-NEXT:    [[C1:%.*]] = call i32 @g(i32 [[TMP2]], i64 [[TMP3]])<br>
-; CHECK-NEXT:    [[A:%.*]] = add i32 [[C0]], [[C1]]<br>
-; CHECK-NEXT:    ret i32 [[A]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[C0:%.*]] = call i32 @f(%struct.ss* noalias nocapture nofree nonnull readonly byval align 8 dereferenceable(12) [[S]])<br>
+; IS__TUNIT_OPM-NEXT:    [[C1:%.*]] = call i32 @g(%struct.ss* noalias nocapture nofree nonnull readonly byval align 32 dereferenceable(12) [[S]])<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = add i32 [[C0]], [[C1]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]])<br>
+; IS__TUNIT_NPM-NEXT:    [[S_CAST1:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[S_CAST1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[S_0_12:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = load i64, i64* [[S_0_12]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[C1:%.*]] = call i32 @g(i32 [[TMP2]], i64 [[TMP3]])<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = add i32 [[C0]], [[C1]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[TMP1]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[C0:%.*]] = call i32 @f(%struct.ss* noalias nofree nonnull readnone byval align 32 dereferenceable(12) [[S]])<br>
+; IS__CGSCC_OPM-NEXT:    [[C1:%.*]] = call i32 @g(%struct.ss* noalias nofree nonnull readnone byval align 32 dereferenceable(12) [[S]])<br>
+; IS__CGSCC_OPM-NEXT:    [[A:%.*]] = add i32 [[C0]], [[C1]]<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[A]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[S:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[TMP1]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 2, i64* [[TMP4]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i64, i64* [[S_0_1]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[C0:%.*]] = call i32 @f(i32 [[TMP0]], i64 [[TMP1]])<br>
+; IS__CGSCC_NPM-NEXT:    [[S_CAST1:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[S_CAST1]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[S_0_12:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = load i64, i64* [[S_0_12]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[C1:%.*]] = call i32 @g(i32 [[TMP2]], i64 [[TMP3]])<br>
+; IS__CGSCC_NPM-NEXT:    [[A:%.*]] = add i32 [[C0]], [[C1]]<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[A]]<br>
 ;<br>
 entry:<br>
   %S = alloca %struct.ss<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll<br>
index 6e9f98007e46..5684807e4745 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/chained.ll<br>
@@ -1,10 +1,14 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 @G1 = constant i32 0<br>
 @G2 = constant i32* @G1<br>
<br>
 define internal i32 @test(i32** %x) {<br>
+;<br>
 ; CHECK-LABEL: define {{[^@]+}}@test()<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    [[Y:%.*]] = load i32*, i32** @G2, align 8<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll<br>
index 494107d17d8b..142df98051eb 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Don't promote around control flow.<br>
 define internal i32 @callee(i1 %C, i32* %P) {<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll<br>
index 5636a0a0e97d..773df89affb5 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/control-flow2.ll<br>
@@ -1,19 +1,40 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 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"<br>
<br>
 define internal i32 @callee(i1 %C, i32* %P) {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee<br>
-; CHECK-SAME: (i1 [[C:%.*]], i32 [[TMP0:%.*]])<br>
-; CHECK-NEXT:    [[P_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[P_PRIV]]<br>
-; CHECK-NEXT:    br label [[F:%.*]]<br>
-; CHECK:       T:<br>
-; CHECK-NEXT:    unreachable<br>
-; CHECK:       F:<br>
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[P_PRIV]], align 4<br>
-; CHECK-NEXT:    ret i32 [[X]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@callee<br>
+; IS__TUNIT_OPM-SAME: (i1 [[C:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    br label [[F:%.*]]<br>
+; IS__TUNIT_OPM:       T:<br>
+; IS__TUNIT_OPM-NEXT:    unreachable<br>
+; IS__TUNIT_OPM:       F:<br>
+; IS__TUNIT_OPM-NEXT:    [[X:%.*]] = load i32, i32* [[P]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee<br>
+; IS__TUNIT_NPM-SAME: (i1 [[C:%.*]], i32 [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[P_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[P_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    br label [[F:%.*]]<br>
+; IS__TUNIT_NPM:       T:<br>
+; IS__TUNIT_NPM-NEXT:    unreachable<br>
+; IS__TUNIT_NPM:       F:<br>
+; IS__TUNIT_NPM-NEXT:    [[X:%.*]] = load i32, i32* [[P_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callee<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree readonly [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    br label [[F:%.*]]<br>
+; IS__CGSCC____:       T:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       F:<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = load i32, i32* [[P]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[X]]<br>
 ;<br>
   br i1 %C, label %T, label %F<br>
<br>
@@ -26,12 +47,24 @@ F:              ; preds = %0<br>
 }<br>
<br>
 define i32 @foo() {<br>
-; CHECK-LABEL: define {{[^@]+}}@foo()<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 17, i32* [[A]], align 4<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 1<br>
-; CHECK-NEXT:    [[X:%.*]] = call i32 @callee(i1 false, i32 [[TMP1]])<br>
-; CHECK-NEXT:    ret i32 [[X]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@foo()<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    store i32 17, i32* [[A]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[X:%.*]] = call i32 @callee(i1 false, i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]])<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@foo()<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 17, i32* [[A]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[A]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[X:%.*]] = call i32 @callee(i1 false, i32 [[TMP1]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[X]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@foo()<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 17, i32* [[A]], align 4<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = call i32 @callee(i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[X]]<br>
 ;<br>
   %A = alloca i32         ; <i32*> [#uses=2]<br>
   store i32 17, i32* %A<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll<br>
index db3db632e5f2..9d7fd443fe29 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/crash.ll<br>
@@ -1,30 +1,22 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,ATTRIBUTOR<br>
-; RUN: opt -S -passes='cgscc(inline),attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s --check-prefixes=CHECK,INLINE_ATTRIBUTOR<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 %S = type { %S* }<br>
<br>
 ; Inlining should nuke the invoke (and any inlined calls) here even with<br>
 ; argument promotion running along with it.<br>
 define void @zot() personality i32 (...)* @wibble {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@zot() #0 personality i32 (...)* @wibble<br>
-; ATTRIBUTOR-NEXT:  bb:<br>
-; ATTRIBUTOR-NEXT:    call void @hoge()<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       bb1:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       bb2:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-;<br>
-; INLINE_ATTRIBUTOR-LABEL: define {{[^@]+}}@zot() #0 personality i32 (...)* @wibble<br>
-; INLINE_ATTRIBUTOR-NEXT:  bb:<br>
-; INLINE_ATTRIBUTOR-NEXT:    unreachable<br>
-; INLINE_ATTRIBUTOR:       hoge.exit:<br>
-; INLINE_ATTRIBUTOR-NEXT:    unreachable<br>
-; INLINE_ATTRIBUTOR:       bb1:<br>
-; INLINE_ATTRIBUTOR-NEXT:    unreachable<br>
-; INLINE_ATTRIBUTOR:       bb2:<br>
-; INLINE_ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@zot() #0 personality i32 (...)* @wibble<br>
+; CHECK-NEXT:  bb:<br>
+; CHECK-NEXT:    call void @hoge()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       bb1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       bb2:<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
 bb:<br>
   invoke void @hoge()<br>
@@ -40,9 +32,9 @@ bb2:<br>
 }<br>
<br>
 define internal void @hoge() {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@hoge()<br>
-; ATTRIBUTOR-NEXT:  bb:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@hoge()<br>
+; CHECK-NEXT:  bb:<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
 bb:<br>
   %tmp = call fastcc i8* @spam(i1 (i8*)* @eggs)<br>
@@ -51,6 +43,10 @@ bb:<br>
 }<br>
<br>
 define internal fastcc i8* @spam(i1 (i8*)* %arg) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@spam()<br>
+; IS__CGSCC____-NEXT:  bb:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
 bb:<br>
   unreachable<br>
 }<br>
@@ -62,15 +58,26 @@ bb:<br>
 }<br>
<br>
 define internal i1 @barney(i8* %arg) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@barney()<br>
+; IS__CGSCC____-NEXT:  bb:<br>
+; IS__CGSCC____-NEXT:    ret i1 undef<br>
+;<br>
 bb:<br>
   ret i1 undef<br>
 }<br>
<br>
 define i32 @test_inf_promote_caller(i32 %arg) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test_inf_promote_caller<br>
-; CHECK-SAME: (i32 [[ARG:%.*]])<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    unreachable<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test_inf_promote_caller<br>
+; IS__TUNIT____-SAME: (i32 [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:  bb:<br>
+; IS__TUNIT____-NEXT:    unreachable<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inf_promote_caller<br>
+; IS__CGSCC____-SAME: (i32 [[ARG:%.*]])<br>
+; IS__CGSCC____-NEXT:  bb:<br>
+; IS__CGSCC____-NEXT:    [[TMP:%.*]] = alloca [[S:%.*]]<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = alloca [[S]]<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
 ;<br>
 bb:<br>
   %tmp = alloca %S<br>
@@ -81,6 +88,10 @@ bb:<br>
 }<br>
<br>
 define internal i32 @test_inf_promote_callee(%S* %arg, %S* %arg1) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inf_promote_callee()<br>
+; IS__CGSCC____-NEXT:  bb:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
 bb:<br>
   %tmp = getelementptr %S, %S* %arg1, i32 0, i32 0<br>
   %tmp2 = load %S*, %S** %tmp<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/dbg.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/dbg.ll<br>
index 43ee9dd13d8d..8a02146d893b 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/dbg.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/dbg.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 declare void @sink(i32)<br>
<br>
@@ -29,11 +32,17 @@ define internal void @test_byval(%struct.pair* byval %P) {<br>
 }<br>
<br>
 define void @caller(i32** %Y, %struct.pair* %P) {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller<br>
-; CHECK-SAME: (i32** nocapture readonly [[Y:%.*]], %struct.pair* nocapture nofree readnone [[P:%.*]])<br>
-; CHECK-NEXT:    call void @test(i32** nocapture readonly align 8 [[Y]]), !dbg !4<br>
-; CHECK-NEXT:    call void @test_byval(), !dbg !5<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller<br>
+; IS__TUNIT____-SAME: (i32** nocapture readonly [[Y:%.*]], %struct.pair* nocapture nofree readnone [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @test(i32** nocapture readonly align 8 [[Y]]), !dbg !4<br>
+; IS__TUNIT____-NEXT:    call void @test_byval(), !dbg !5<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller<br>
+; IS__CGSCC____-SAME: (i32** nocapture nonnull readonly align 8 dereferenceable(8) [[Y:%.*]], %struct.pair* nocapture nofree readnone [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @test(i32** nocapture nonnull readonly align 8 dereferenceable(8) [[Y]]), !dbg !4<br>
+; IS__CGSCC____-NEXT:    call void @test_byval(), !dbg !5<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   call void @test(i32** %Y), !dbg !1<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll<br>
index b9ee30fac9b9..75935664999e 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/fp80.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-unknown-linux-gnu"<br>
@@ -26,6 +29,10 @@ entry:<br>
 }<br>
<br>
 define internal i8 @UseLongDoubleUnsafely(%union.u* byval align 16 %arg) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@UseLongDoubleUnsafely()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    ret i8 undef<br>
+;<br>
 entry:<br>
   %bitcast = bitcast %union.u* %arg to %struct.s*<br>
   %gep = getelementptr inbounds %struct.s, %struct.s* %bitcast, i64 0, i32 2<br>
@@ -34,18 +41,53 @@ entry:<br>
 }<br>
<br>
 define internal x86_fp80 @UseLongDoubleSafely(%union.u* byval align 16 %arg) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@UseLongDoubleSafely()<br>
+; IS__CGSCC____-NEXT:    ret x86_fp80 undef<br>
+;<br>
   %gep = getelementptr inbounds %union.u, %union.u* %arg, i64 0, i32 0<br>
   %fp80 = load x86_fp80, x86_fp80* %gep<br>
   ret x86_fp80 %fp80<br>
 }<br>
<br>
 define internal i64 @AccessPaddingOfStruct(%struct.Foo* byval %a) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@AccessPaddingOfStruct()<br>
+; IS__CGSCC____-NEXT:    ret i64 undef<br>
+;<br>
   %p = bitcast %struct.Foo* %a to i64*<br>
   %v = load i64, i64* %p<br>
   ret i64 %v<br>
 }<br>
<br>
 define internal i64 @CaptureAStruct(%struct.Foo* byval %a) {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@CaptureAStruct<br>
+; IS__CGSCC_OPM-SAME: (%struct.Foo* noalias nofree byval [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[A_PTR:%.*]] = alloca %struct.Foo*<br>
+; IS__CGSCC_OPM-NEXT:    br label [[LOOP:%.*]]<br>
+; IS__CGSCC_OPM:       loop:<br>
+; IS__CGSCC_OPM-NEXT:    [[PHI:%.*]] = phi %struct.Foo* [ null, [[ENTRY:%.*]] ], [ [[GEP:%.*]], [[LOOP]] ]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = phi %struct.Foo* [ [[A]], [[ENTRY]] ], [ [[TMP0]], [[LOOP]] ]<br>
+; IS__CGSCC_OPM-NEXT:    store %struct.Foo* [[PHI]], %struct.Foo** [[A_PTR]], align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[GEP]] = getelementptr [[STRUCT_FOO:%.*]], %struct.Foo* [[A]], i64 0<br>
+; IS__CGSCC_OPM-NEXT:    br label [[LOOP]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@CaptureAStruct<br>
+; IS__CGSCC_NPM-SAME: (i32 [[TMP0:%.*]], i64 [[TMP1:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PRIV:%.*]] = alloca [[STRUCT_FOO:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PRIV_CAST:%.*]] = bitcast %struct.Foo* [[A_PRIV]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP0]], i32* [[A_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PRIV_0_1:%.*]] = getelementptr [[STRUCT_FOO]], %struct.Foo* [[A_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i64 [[TMP1]], i64* [[A_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PTR:%.*]] = alloca %struct.Foo*<br>
+; IS__CGSCC_NPM-NEXT:    br label [[LOOP:%.*]]<br>
+; IS__CGSCC_NPM:       loop:<br>
+; IS__CGSCC_NPM-NEXT:    [[PHI:%.*]] = phi %struct.Foo* [ null, [[ENTRY:%.*]] ], [ [[GEP:%.*]], [[LOOP]] ]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = phi %struct.Foo* [ [[A_PRIV]], [[ENTRY]] ], [ [[TMP2]], [[LOOP]] ]<br>
+; IS__CGSCC_NPM-NEXT:    store %struct.Foo* [[PHI]], %struct.Foo** [[A_PTR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[GEP]] = getelementptr [[STRUCT_FOO]], %struct.Foo* [[A_PRIV]], i64 0<br>
+; IS__CGSCC_NPM-NEXT:    br label [[LOOP]]<br>
+;<br>
 entry:<br>
   %a_ptr = alloca %struct.Foo*<br>
   br label %loop<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll<br>
index c9598b348715..fc2f6ef1724e 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/inalloca.ll<br>
@@ -1,6 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 < %s | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; RUN: opt -S -passes='globalopt,attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 < %s | FileCheck %s --check-prefixes=GLOBALOPT_ATTRIBUTOR<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 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"<br>
<br>
@@ -8,30 +10,25 @@ target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:1<br>
<br>
 ; Argpromote + sroa should change this to passing the two integers by value.<br>
 define internal i32 @f(%struct.ss* inalloca  %s) {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@f<br>
-; ATTRIBUTOR-SAME: (%struct.ss* inalloca noalias nocapture nofree nonnull align 4 dereferenceable(8) [[S:%.*]])<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[S]], i32 0, i32 0<br>
-; ATTRIBUTOR-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; ATTRIBUTOR-NEXT:    [[A:%.*]] = load i32, i32* [[F0]], align 4<br>
-; ATTRIBUTOR-NEXT:    [[B:%.*]] = load i32, i32* [[F1]], align 4<br>
-; ATTRIBUTOR-NEXT:    [[R:%.*]] = add i32 [[A]], [[B]]<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[R]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@f<br>
+; IS__TUNIT____-SAME: (%struct.ss* inalloca noalias nocapture nofree nonnull align 4 dereferenceable(8) [[S:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT____-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = load i32, i32* [[F0]], align 4<br>
+; IS__TUNIT____-NEXT:    [[B:%.*]] = load i32, i32* [[F1]], align 4<br>
+; IS__TUNIT____-NEXT:    [[R:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[R]]<br>
 ;<br>
-; GLOBALOPT_ATTRIBUTOR-LABEL: define {{[^@]+}}@f<br>
-; GLOBALOPT_ATTRIBUTOR-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) unnamed_addr<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:  entry:<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S_PRIV:%.*]] = alloca [[STRUCT_SS:%.*]]<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S_PRIV_CAST:%.*]] = bitcast %struct.ss* [[S_PRIV]] to i32*<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    store i32 [[TMP0]], i32* [[S_PRIV_CAST]]<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S_PRIV_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S_PRIV]], i32 0, i32 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    store i32 [[TMP1]], i32* [[S_PRIV_0_1]]<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S_PRIV]], i32 0, i32 0<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S_PRIV]], i32 0, i32 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[A:%.*]] = load i32, i32* [[F0]], align 4<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[B:%.*]] = load i32, i32* [[F1]], align 4<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[R:%.*]] = add i32 [[A]], [[B]]<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    ret i32 [[R]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@f<br>
+; IS__CGSCC____-SAME: (%struct.ss* inalloca nocapture nofree nonnull align 4 dereferenceable(8) [[S:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS:%.*]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = load i32, i32* [[F0]], align 4<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = load i32, i32* [[F1]], align 4<br>
+; IS__CGSCC____-NEXT:    [[R:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[R]]<br>
 ;<br>
 entry:<br>
   %f0 = getelementptr %struct.ss, %struct.ss* %s, i32 0, i32 0<br>
@@ -43,29 +40,25 @@ entry:<br>
 }<br>
<br>
 define i32 @main() {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@main()<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    [[S:%.*]] = alloca inalloca [[STRUCT_SS:%.*]]<br>
-; ATTRIBUTOR-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
-; ATTRIBUTOR-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; ATTRIBUTOR-NEXT:    store i32 1, i32* [[F0]], align 4<br>
-; ATTRIBUTOR-NEXT:    store i32 2, i32* [[F1]], align 4<br>
-; ATTRIBUTOR-NEXT:    [[R:%.*]] = call i32 @f(%struct.ss* inalloca noalias nocapture nofree nonnull align 4 dereferenceable(8) [[S]])<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[R]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@main()<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[S:%.*]] = alloca inalloca [[STRUCT_SS:%.*]]<br>
+; IS__TUNIT____-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__TUNIT____-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__TUNIT____-NEXT:    store i32 1, i32* [[F0]], align 4<br>
+; IS__TUNIT____-NEXT:    store i32 2, i32* [[F1]], align 4<br>
+; IS__TUNIT____-NEXT:    [[R:%.*]] = call i32 @f(%struct.ss* inalloca noalias nocapture nofree nonnull align 4 dereferenceable(8) [[S]])<br>
+; IS__TUNIT____-NEXT:    ret i32 [[R]]<br>
 ;<br>
-; GLOBALOPT_ATTRIBUTOR-LABEL: define {{[^@]+}}@main() local_unnamed_addr<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:  entry:<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S:%.*]] = alloca inalloca [[STRUCT_SS:%.*]]<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    store i32 1, i32* [[F0]], align 4<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    store i32 2, i32* [[F1]], align 4<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S_CAST:%.*]] = bitcast %struct.ss* [[S]] to i32*<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[TMP0:%.*]] = load i32, i32* [[S_CAST]], align 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[S_0_1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[TMP1:%.*]] = load i32, i32* [[S_0_1]], align 1<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    [[R:%.*]] = call fastcc i32 @f(i32 [[TMP0]], i32 [[TMP1]])<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    ret i32 [[R]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[S:%.*]] = alloca inalloca [[STRUCT_SS:%.*]]<br>
+; IS__CGSCC____-NEXT:    [[F0:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[F1:%.*]] = getelementptr [[STRUCT_SS]], %struct.ss* [[S]], i32 0, i32 1<br>
+; IS__CGSCC____-NEXT:    store i32 1, i32* [[F0]], align 4<br>
+; IS__CGSCC____-NEXT:    store i32 2, i32* [[F1]], align 4<br>
+; IS__CGSCC____-NEXT:    [[R:%.*]] = call i32 @f(%struct.ss* inalloca noalias nofree nonnull align 4 dereferenceable(8) [[S]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[R]]<br>
 ;<br>
 entry:<br>
   %S = alloca inalloca %struct.ss<br>
@@ -79,19 +72,20 @@ entry:<br>
<br>
 ; Argpromote can't promote %a because of the icmp use.<br>
 define internal i1 @g(%struct.ss* %a, %struct.ss* inalloca %b) nounwind  {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@g<br>
+; IS__CGSCC____-SAME: (%struct.ss* nocapture nofree readnone [[A:%.*]], %struct.ss* inalloca nocapture nofree writeonly [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    ret i1 undef<br>
+;<br>
 entry:<br>
   %c = icmp eq %struct.ss* %a, %b<br>
   ret i1 %c<br>
 }<br>
<br>
 define i32 @test() {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@test()<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    ret i32 0<br>
-;<br>
-; GLOBALOPT_ATTRIBUTOR-LABEL: define {{[^@]+}}@test() local_unnamed_addr<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:  entry:<br>
-; GLOBALOPT_ATTRIBUTOR-NEXT:    ret i32 0<br>
+; CHECK-LABEL: define {{[^@]+}}@test()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32 0<br>
 ;<br>
 entry:<br>
   %S = alloca inalloca %struct.ss<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll<br>
index c69842119ec6..1f034c8404fe 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead.ll<br>
@@ -1,13 +1,9 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -basicaa -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_MODULE<br>
-; RUN: opt -S -basicaa -attributor-cgscc -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_CGSCC<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_MODULE<br>
-; RUN: opt -S -passes='attributor-cgscc' -aa-pipeline='basic-aa' -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_CGSCC<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
-; OLDPM_MODULE-NOT: @dead<br>
-; NEWPM_MODULE-NOT: @dead<br>
-; OLDPM_CGSCC-NOT: @dead<br>
-; NEWPM_CGSCC-NOT: @dead<br>
<br>
 define internal void @dead() {<br>
   call i32 @test(i32* null, i32* null)<br>
@@ -15,23 +11,23 @@ define internal void @dead() {<br>
 }<br>
<br>
 define internal i32 @test(i32* %X, i32* %Y) {<br>
-; OLDPM_CGSCC-LABEL: define {{[^@]+}}@test<br>
-; OLDPM_CGSCC-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])<br>
-; OLDPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; OLDPM_CGSCC:       live:<br>
-; OLDPM_CGSCC-NEXT:    store i32 0, i32* [[X]], align 4<br>
-; OLDPM_CGSCC-NEXT:    ret i32 undef<br>
-; OLDPM_CGSCC:       dead:<br>
-; OLDPM_CGSCC-NEXT:    unreachable<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_OPM-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
+; IS__CGSCC_OPM:       live:<br>
+; IS__CGSCC_OPM-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 undef<br>
+; IS__CGSCC_OPM:       dead:<br>
+; IS__CGSCC_OPM-NEXT:    unreachable<br>
 ;<br>
-; NEWPM_CGSCC-LABEL: define {{[^@]+}}@test<br>
-; NEWPM_CGSCC-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[X:%.*]])<br>
-; NEWPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; NEWPM_CGSCC:       live:<br>
-; NEWPM_CGSCC-NEXT:    store i32 0, i32* [[X]], align 4<br>
-; NEWPM_CGSCC-NEXT:    ret i32 undef<br>
-; NEWPM_CGSCC:       dead:<br>
-; NEWPM_CGSCC-NEXT:    unreachable<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC_NPM-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[X:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
+; IS__CGSCC_NPM:       live:<br>
+; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 undef<br>
+; IS__CGSCC_NPM:       dead:<br>
+; IS__CGSCC_NPM-NEXT:    unreachable<br>
 ;<br>
   br i1 true, label %live, label %dead<br>
 live:<br>
@@ -44,17 +40,17 @@ dead:<br>
 }<br>
<br>
 define internal i32 @caller(i32* %B) {<br>
-; OLDPM_CGSCC-LABEL: define {{[^@]+}}@caller()<br>
-; OLDPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32<br>
-; OLDPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; OLDPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; OLDPM_CGSCC-NEXT:    ret i32 0<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@caller()<br>
+; IS__CGSCC_OPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 0<br>
 ;<br>
-; NEWPM_CGSCC-LABEL: define {{[^@]+}}@caller()<br>
-; NEWPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32<br>
-; NEWPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; NEWPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; NEWPM_CGSCC-NEXT:    ret i32 undef<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@caller()<br>
+; IS__CGSCC_NPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 undef<br>
 ;<br>
   %A = alloca i32<br>
   store i32 1, i32* %A<br>
<br>
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<br>
index 429a3a7b7b43..d3892d2093a0 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/live_called_from_dead_2.ll<br>
@@ -1,13 +1,9 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -basicaa -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_MODULE<br>
-; RUN: opt -S -basicaa -attributor-cgscc -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,OLDPM,OLDPM_CGSCC<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_MODULE<br>
-; RUN: opt -S -passes='attributor-cgscc' -aa-pipeline='basic-aa' -attributor-disable=false < %s | FileCheck %s --check-prefixes=CHECK,NEWPM,NEWPM_CGSCC<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
-; OLDPM_MODULE-NOT: @dead<br>
-; NEWPM_MODULE-NOT: @dead<br>
-; OLDPM_CGSCC-NOT: @dead<br>
-; NEWPM_CGSCC-NOT: @dead<br>
<br>
 define internal void @dead() {<br>
   call i32 @test(i32* null, i32* null)<br>
@@ -15,41 +11,23 @@ define internal void @dead() {<br>
 }<br>
<br>
 define internal i32 @test(i32* %X, i32* %Y) {<br>
-; OLDPM_MODULE-LABEL: define {{[^@]+}}@test<br>
-; OLDPM_MODULE-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])<br>
-; OLDPM_MODULE-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; OLDPM_MODULE:       live:<br>
-; OLDPM_MODULE-NEXT:    store i32 0, i32* [[X]], align 4<br>
-; OLDPM_MODULE-NEXT:    ret i32 undef<br>
-; OLDPM_MODULE:       dead:<br>
-; OLDPM_MODULE-NEXT:    unreachable<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])<br>
+; IS__TUNIT____-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
+; IS__TUNIT____:       live:<br>
+; IS__TUNIT____-NEXT:    store i32 0, i32* [[X]], align 4<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
+; IS__TUNIT____:       dead:<br>
+; IS__TUNIT____-NEXT:    unreachable<br>
 ;<br>
-; OLDPM_CGSCC-LABEL: define {{[^@]+}}@test<br>
-; OLDPM_CGSCC-SAME: (i32* nocapture nofree writeonly [[X:%.*]])<br>
-; OLDPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; OLDPM_CGSCC:       live:<br>
-; OLDPM_CGSCC-NEXT:    store i32 0, i32* [[X]]<br>
-; OLDPM_CGSCC-NEXT:    ret i32 undef<br>
-; OLDPM_CGSCC:       dead:<br>
-; OLDPM_CGSCC-NEXT:    unreachable<br>
-;<br>
-; NEWPM_MODULE-LABEL: define {{[^@]+}}@test<br>
-; NEWPM_MODULE-SAME: (i32* noalias nocapture nofree writeonly align 4 [[X:%.*]])<br>
-; NEWPM_MODULE-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; NEWPM_MODULE:       live:<br>
-; NEWPM_MODULE-NEXT:    store i32 0, i32* [[X]], align 4<br>
-; NEWPM_MODULE-NEXT:    ret i32 undef<br>
-; NEWPM_MODULE:       dead:<br>
-; NEWPM_MODULE-NEXT:    unreachable<br>
-;<br>
-; NEWPM_CGSCC-LABEL: define {{[^@]+}}@test<br>
-; NEWPM_CGSCC-SAME: (i32* nocapture nofree writeonly [[X:%.*]])<br>
-; NEWPM_CGSCC-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
-; NEWPM_CGSCC:       live:<br>
-; NEWPM_CGSCC-NEXT:    store i32 0, i32* [[X]]<br>
-; NEWPM_CGSCC-NEXT:    ret i32 undef<br>
-; NEWPM_CGSCC:       dead:<br>
-; NEWPM_CGSCC-NEXT:    unreachable<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree writeonly [[X:%.*]])<br>
+; IS__CGSCC____-NEXT:    br i1 true, label [[LIVE:%.*]], label [[DEAD:%.*]]<br>
+; IS__CGSCC____:       live:<br>
+; IS__CGSCC____-NEXT:    store i32 0, i32* [[X]]<br>
+; IS__CGSCC____-NEXT:    ret i32 undef<br>
+; IS__CGSCC____:       dead:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
 ;<br>
   br i1 true, label %live, label %dead<br>
 live:<br>
@@ -62,33 +40,26 @@ dead:<br>
 }<br>
<br>
 define internal i32 @caller(i32* %B) {<br>
-; OLDPM_MODULE-LABEL: define {{[^@]+}}@caller<br>
-; OLDPM_MODULE-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B:%.*]])<br>
-; OLDPM_MODULE-NEXT:    [[A:%.*]] = alloca i32<br>
-; OLDPM_MODULE-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; OLDPM_MODULE-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; OLDPM_MODULE-NEXT:    ret i32 undef<br>
-;<br>
-; OLDPM_CGSCC-LABEL: define {{[^@]+}}@caller<br>
-; OLDPM_CGSCC-SAME: (i32* nocapture nofree writeonly [[B:%.*]])<br>
-; OLDPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32<br>
-; OLDPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; OLDPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* nocapture nofree writeonly [[B]])<br>
-; OLDPM_CGSCC-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__TUNIT____-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__TUNIT____-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
 ;<br>
-; NEWPM_MODULE-LABEL: define {{[^@]+}}@caller<br>
-; NEWPM_MODULE-SAME: (i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B:%.*]])<br>
-; NEWPM_MODULE-NEXT:    [[A:%.*]] = alloca i32<br>
-; NEWPM_MODULE-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; NEWPM_MODULE-NEXT:    [[C:%.*]] = call i32 @test(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; NEWPM_MODULE-NEXT:    ret i32 undef<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@caller<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture nofree writeonly [[B:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC_OPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = call i32 @test(i32* nocapture nofree writeonly [[B]])<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 0<br>
 ;<br>
-; NEWPM_CGSCC-LABEL: define {{[^@]+}}@caller<br>
-; NEWPM_CGSCC-SAME: (i32* nocapture nofree writeonly [[B:%.*]])<br>
-; NEWPM_CGSCC-NEXT:    [[A:%.*]] = alloca i32<br>
-; NEWPM_CGSCC-NEXT:    store i32 1, i32* [[A]], align 4<br>
-; NEWPM_CGSCC-NEXT:    [[C:%.*]] = call i32 @test(i32* nocapture nofree writeonly [[B]])<br>
-; NEWPM_CGSCC-NEXT:    ret i32 undef<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@caller<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nofree writeonly [[B:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:    [[A:%.*]] = alloca i32<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[A]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = call i32 @test(i32* nocapture nofree writeonly [[B]])<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 undef<br>
 ;<br>
   %A = alloca i32<br>
   store i32 1, i32* %A<br>
@@ -97,29 +68,17 @@ define internal i32 @caller(i32* %B) {<br>
 }<br>
<br>
 define i32 @callercaller() {<br>
-; OLDPM_MODULE-LABEL: define {{[^@]+}}@callercaller()<br>
-; OLDPM_MODULE-NEXT:    [[B:%.*]] = alloca i32<br>
-; OLDPM_MODULE-NEXT:    store i32 2, i32* [[B]], align 4<br>
-; OLDPM_MODULE-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; OLDPM_MODULE-NEXT:    ret i32 0<br>
-;<br>
-; OLDPM_CGSCC-LABEL: define {{[^@]+}}@callercaller()<br>
-; OLDPM_CGSCC-NEXT:    [[B:%.*]] = alloca i32<br>
-; OLDPM_CGSCC-NEXT:    store i32 2, i32* [[B]], align 4<br>
-; OLDPM_CGSCC-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; OLDPM_CGSCC-NEXT:    ret i32 0<br>
-;<br>
-; NEWPM_MODULE-LABEL: define {{[^@]+}}@callercaller()<br>
-; NEWPM_MODULE-NEXT:    [[B:%.*]] = alloca i32<br>
-; NEWPM_MODULE-NEXT:    store i32 2, i32* [[B]], align 4<br>
-; NEWPM_MODULE-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; NEWPM_MODULE-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@callercaller()<br>
+; IS__TUNIT____-NEXT:    [[B:%.*]] = alloca i32<br>
+; IS__TUNIT____-NEXT:    store i32 2, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
 ;<br>
-; NEWPM_CGSCC-LABEL: define {{[^@]+}}@callercaller()<br>
-; NEWPM_CGSCC-NEXT:    [[B:%.*]] = alloca i32<br>
-; NEWPM_CGSCC-NEXT:    store i32 2, i32* [[B]], align 4<br>
-; NEWPM_CGSCC-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
-; NEWPM_CGSCC-NEXT:    ret i32 0<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callercaller()<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 2, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = call i32 @caller(i32* noalias nofree nonnull writeonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret i32 0<br>
 ;<br>
   %B = alloca i32<br>
   store i32 2, i32* %B<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll<br>
index 89ee21519e78..0fc379c705f1 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/musttail.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR36543<br>
<br>
 ; Don't promote arguments of musttail callee<br>
@@ -45,6 +48,16 @@ define i32 @foo(%T* %p, i32 %v) {<br>
 }<br>
<br>
 define internal i32 @test2(%T* %p, i32 %p2) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test2<br>
+; IS__CGSCC____-SAME: (%T* nocapture nofree readonly [[P:%.*]], i32 [[P2:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[A_GEP:%.*]] = getelementptr [[T:%.*]], %T* [[P]], i64 0, i32 3<br>
+; IS__CGSCC____-NEXT:    [[B_GEP:%.*]] = getelementptr [[T]], %T* [[P]], i64 0, i32 2<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = load i32, i32* [[A_GEP]], align 4<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = load i32, i32* [[B_GEP]], align 4<br>
+; IS__CGSCC____-NEXT:    [[V:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    [[CA:%.*]] = musttail call i32 @foo(%T* undef, i32 [[V]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[CA]]<br>
+;<br>
   %a.gep = getelementptr %T, %T* %p, i64 0, i32 3<br>
   %b.gep = getelementptr %T, %T* %p, i64 0, i32 2<br>
   %a = load i32, i32* %a.gep<br>
@@ -55,9 +68,14 @@ define internal i32 @test2(%T* %p, i32 %p2) {<br>
 }<br>
<br>
 define i32 @caller2(%T* %g) {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller2<br>
-; CHECK-SAME: (%T* nocapture nofree readnone [[G:%.*]])<br>
-; CHECK-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller2<br>
+; IS__TUNIT____-SAME: (%T* nocapture nofree readnone [[G:%.*]])<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller2<br>
+; IS__CGSCC____-SAME: (%T* nocapture nofree readonly [[G:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[V:%.*]] = call i32 @test2(%T* nocapture nofree readonly [[G]], i32 0)<br>
+; IS__CGSCC____-NEXT:    ret i32 [[V]]<br>
 ;<br>
   %v = call i32 @test2(%T* %g, i32 0)<br>
   ret i32 %v<br>
@@ -100,10 +118,15 @@ define internal i32 @test2b(%T* %p, i32 %p2) {<br>
 }<br>
<br>
 define i32 @caller2b(%T* %g) {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller2b<br>
-; CHECK-SAME: (%T* nocapture nofree readonly [[G:%.*]])<br>
-; CHECK-NEXT:    [[V:%.*]] = call i32 @test2b(%T* nocapture nofree readonly [[G]], i32 undef)<br>
-; CHECK-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller2b<br>
+; IS__TUNIT____-SAME: (%T* nocapture nofree readonly [[G:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[V:%.*]] = call i32 @test2b(%T* nocapture nofree readonly [[G]], i32 undef)<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller2b<br>
+; IS__CGSCC____-SAME: (%T* nocapture nofree readonly [[G:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[V:%.*]] = call i32 @test2b(%T* nocapture nofree readonly [[G]], i32 0)<br>
+; IS__CGSCC____-NEXT:    ret i32 [[V]]<br>
 ;<br>
   %v = call i32 @test2b(%T* %g, i32 0)<br>
   ret i32 %v<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/naked_functions.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/naked_functions.ll<br>
index 4bfe138f4b6e..92cb7efb7bd2 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/naked_functions.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/naked_functions.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Don't promote paramaters of/arguments to naked functions<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/nonzero-address-spaces.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/nonzero-address-spaces.ll<br>
index d08969c0a262..04e8bd6bdc8b 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/nonzero-address-spaces.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/nonzero-address-spaces.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; ArgumentPromotion should preserve the default function address space<br>
 ; from the data layout.<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr27568.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr27568.ll<br>
index f2ff8dc63279..d7aafae2d158 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr27568.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr27568.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 target triple = "x86_64-pc-windows-msvc"<br>
<br>
 define internal void @callee(i8*) {<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr3085.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr3085.ll<br>
deleted file mode 100644<br>
index 5b8b7da46a47..000000000000<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr3085.ll<br>
+++ /dev/null<br>
@@ -1,1945 +0,0 @@<br>
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -disable-output -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s<br>
-; PR 3085<br>
-<br>
-       %struct.Lit = type { i8 }<br>
-<br>
-define fastcc %struct.Lit* @import_lit(i32 %lit) nounwind {<br>
-entry:<br>
-  br i1 false, label %bb, label %bb1<br>
-<br>
-bb:            ; preds = %entry<br>
-  unreachable<br>
-<br>
-bb1:           ; preds = %entry<br>
-  br label %bb3<br>
-<br>
-bb2:           ; preds = %bb3<br>
-  br label %bb3<br>
-<br>
-bb3:           ; preds = %bb2, %bb1<br>
-  br i1 false, label %bb2, label %bb6<br>
-<br>
-bb6:           ; preds = %bb3<br>
-  br i1 false, label %bb.i.i, label %bb1.i.i<br>
-<br>
-bb.i.i:                ; preds = %bb6<br>
-  br label %int2lit.exit<br>
-<br>
-bb1.i.i:               ; preds = %bb6<br>
-  br label %int2lit.exit<br>
-<br>
-int2lit.exit:          ; preds = %bb1.i.i, %bb.i.i<br>
-  ret %struct.Lit* null<br>
-}<br>
-<br>
-define fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind {<br>
-entry:<br>
-  br i1 false, label %bb.i, label %picosat_time_stamp.exit<br>
-<br>
-bb.i:          ; preds = %entry<br>
-  br label %picosat_time_stamp.exit<br>
-<br>
-picosat_time_stamp.exit:               ; preds = %bb.i, %entry<br>
-  br label %bb108<br>
-<br>
-bb:            ; preds = %bb108<br>
-  br i1 false, label %bb1, label %bb2<br>
-<br>
-bb1:           ; preds = %bb<br>
-  br label %bb106<br>
-<br>
-bb2:           ; preds = %bb<br>
-  br i1 false, label %bb3, label %bb4<br>
-<br>
-bb3:           ; preds = %bb2<br>
-  br label %bb106<br>
-<br>
-bb4:           ; preds = %bb2<br>
-  br i1 false, label %bb5, label %bb6<br>
-<br>
-bb5:           ; preds = %bb4<br>
-  br label %bb106<br>
-<br>
-bb6:           ; preds = %bb4<br>
-  br i1 false, label %bb7, label %bb8<br>
-<br>
-bb7:           ; preds = %bb6<br>
-  br label %bb106<br>
-<br>
-bb8:           ; preds = %bb6<br>
-  br i1 false, label %bb106, label %bb10<br>
-<br>
-bb10:          ; preds = %bb8<br>
-  br i1 false, label %bb106, label %bb12<br>
-<br>
-bb12:          ; preds = %bb10<br>
-  br i1 false, label %bb106, label %bb14<br>
-<br>
-bb14:          ; preds = %bb12<br>
-  br i1 false, label %bb15, label %bb19<br>
-<br>
-bb15:          ; preds = %bb14<br>
-  br i1 false, label %bb16, label %bb17<br>
-<br>
-bb16:          ; preds = %bb15<br>
-  br label %bb106<br>
-<br>
-bb17:          ; preds = %bb15<br>
-  br label %bb106<br>
-<br>
-bb19:          ; preds = %bb14<br>
-  br i1 false, label %bb20, label %bb28<br>
-<br>
-bb20:          ; preds = %bb19<br>
-  br i1 false, label %bb21, label %bb22<br>
-<br>
-bb21:          ; preds = %bb20<br>
-  br label %bb106<br>
-<br>
-bb22:          ; preds = %bb20<br>
-  br i1 false, label %bb106, label %bb24<br>
-<br>
-bb24:          ; preds = %bb22<br>
-  br i1 false, label %bb106, label %bb26<br>
-<br>
-bb26:          ; preds = %bb24<br>
-  br label %bb106<br>
-<br>
-bb28:          ; preds = %bb19<br>
-  br i1 false, label %bb29, label %bb35<br>
-<br>
-bb29:          ; preds = %bb28<br>
-  br i1 false, label %bb30, label %bb31<br>
-<br>
-bb30:          ; preds = %bb29<br>
-  br label %bb106<br>
-<br>
-bb31:          ; preds = %bb29<br>
-  br i1 false, label %bb32, label %bb33<br>
-<br>
-bb32:          ; preds = %bb31<br>
-  br label %bb106<br>
-<br>
-bb33:          ; preds = %bb31<br>
-  br label %bb106<br>
-<br>
-bb35:          ; preds = %bb28<br>
-  br i1 false, label %bb36, label %bb40<br>
-<br>
-bb36:          ; preds = %bb35<br>
-  br i1 false, label %bb37, label %bb38<br>
-<br>
-bb37:          ; preds = %bb36<br>
-  br label %bb106<br>
-<br>
-bb38:          ; preds = %bb36<br>
-  br label %bb106<br>
-<br>
-bb40:          ; preds = %bb35<br>
-  br i1 false, label %bb41, label %bb49<br>
-<br>
-bb41:          ; preds = %bb40<br>
-  br i1 false, label %bb43, label %bb42<br>
-<br>
-bb42:          ; preds = %bb41<br>
-  br label %bb106<br>
-<br>
-bb43:          ; preds = %bb41<br>
-  br i1 false, label %bb44, label %bb45<br>
-<br>
-bb44:          ; preds = %bb43<br>
-  br label %bb106<br>
-<br>
-bb45:          ; preds = %bb43<br>
-  br i1 false, label %bb46, label %bb47<br>
-<br>
-bb46:          ; preds = %bb45<br>
-  br label %bb106<br>
-<br>
-bb47:          ; preds = %bb45<br>
-  br label %bb106<br>
-<br>
-bb49:          ; preds = %bb40<br>
-  br i1 false, label %bb50, label %bb56<br>
-<br>
-bb50:          ; preds = %bb49<br>
-  br i1 false, label %bb52, label %bb51<br>
-<br>
-bb51:          ; preds = %bb50<br>
-  br label %bb106<br>
-<br>
-bb52:          ; preds = %bb50<br>
-  br i1 false, label %bb53, label %bb54<br>
-<br>
-bb53:          ; preds = %bb52<br>
-  br label %bb106<br>
-<br>
-bb54:          ; preds = %bb52<br>
-  br label %bb106<br>
-<br>
-bb56:          ; preds = %bb49<br>
-  br i1 false, label %bb57, label %bb63<br>
-<br>
-bb57:          ; preds = %bb56<br>
-  br i1 false, label %bb59, label %bb58<br>
-<br>
-bb58:          ; preds = %bb57<br>
-  br label %bb106<br>
-<br>
-bb59:          ; preds = %bb57<br>
-  br i1 false, label %bb60, label %bb61<br>
-<br>
-bb60:          ; preds = %bb59<br>
-  br label %bb106<br>
-<br>
-bb61:          ; preds = %bb59<br>
-  br label %bb106<br>
-<br>
-bb63:          ; preds = %bb56<br>
-  br i1 false, label %bb64, label %bb70<br>
-<br>
-bb64:          ; preds = %bb63<br>
-  br i1 false, label %bb66, label %bb65<br>
-<br>
-bb65:          ; preds = %bb64<br>
-  br label %bb106<br>
-<br>
-bb66:          ; preds = %bb64<br>
-  br i1 false, label %bb67, label %bb68<br>
-<br>
-bb67:          ; preds = %bb66<br>
-  br label %bb106<br>
-<br>
-bb68:          ; preds = %bb66<br>
-  br label %bb106<br>
-<br>
-bb70:          ; preds = %bb63<br>
-  br i1 false, label %bb71, label %bb79<br>
-<br>
-bb71:          ; preds = %bb70<br>
-  br i1 false, label %bb73, label %bb72<br>
-<br>
-bb72:          ; preds = %bb71<br>
-  br label %bb106<br>
-<br>
-bb73:          ; preds = %bb71<br>
-  br i1 false, label %bb74, label %bb75<br>
-<br>
-bb74:          ; preds = %bb73<br>
-  br label %bb106<br>
-<br>
-bb75:          ; preds = %bb73<br>
-  br i1 false, label %bb76, label %bb77<br>
-<br>
-bb76:          ; preds = %bb75<br>
-  br label %bb106<br>
-<br>
-bb77:          ; preds = %bb75<br>
-  br label %bb106<br>
-<br>
-bb79:          ; preds = %bb70<br>
-  br i1 false, label %bb80, label %bb86<br>
-<br>
-bb80:          ; preds = %bb79<br>
-  br i1 false, label %bb82, label %bb81<br>
-<br>
-bb81:          ; preds = %bb80<br>
-  br label %bb106<br>
-<br>
-bb82:          ; preds = %bb80<br>
-  br i1 false, label %bb83, label %bb84<br>
-<br>
-bb83:          ; preds = %bb82<br>
-  br label %bb106<br>
-<br>
-bb84:          ; preds = %bb82<br>
-  br label %bb106<br>
-<br>
-bb86:          ; preds = %bb79<br>
-  br i1 false, label %bb87, label %bb93<br>
-<br>
-bb87:          ; preds = %bb86<br>
-  br i1 false, label %bb89, label %bb88<br>
-<br>
-bb88:          ; preds = %bb87<br>
-  br label %bb106<br>
-<br>
-bb89:          ; preds = %bb87<br>
-  br i1 false, label %bb90, label %bb91<br>
-<br>
-bb90:          ; preds = %bb89<br>
-  br label %bb106<br>
-<br>
-bb91:          ; preds = %bb89<br>
-  br label %bb106<br>
-<br>
-bb93:          ; preds = %bb86<br>
-  br i1 false, label %bb94, label %bb95<br>
-<br>
-bb94:          ; preds = %bb93<br>
-  br label %bb106<br>
-<br>
-bb95:          ; preds = %bb93<br>
-  br i1 false, label %bb98, label %bb97<br>
-<br>
-bb97:          ; preds = %bb95<br>
-  br label %bb106<br>
-<br>
-bb98:          ; preds = %bb95<br>
-  br i1 false, label %bb103, label %bb1.i24<br>
-<br>
-bb1.i24:               ; preds = %bb98<br>
-  br i1 false, label %bb99, label %bb103<br>
-<br>
-bb99:          ; preds = %bb1.i24<br>
-  br i1 false, label %bb101, label %bb100<br>
-<br>
-bb100:         ; preds = %bb99<br>
-  br label %bb102<br>
-<br>
-bb101:         ; preds = %bb99<br>
-  br label %bb102<br>
-<br>
-bb102:         ; preds = %bb101, %bb100<br>
-  br label %bb106<br>
-<br>
-bb103:         ; preds = %bb1.i24, %bb98<br>
-  br i1 false, label %bb104, label %bb105<br>
-<br>
-bb104:         ; preds = %bb103<br>
-  br label %bb106<br>
-<br>
-bb105:         ; preds = %bb103<br>
-  br label %bb106<br>
-<br>
-bb106:         ; preds = %bb105, %bb104, %bb102, %bb97, %bb94, %bb91, %bb90, %bb88, %bb84, %bb83, %bb81, %bb77, %bb76, %bb74, %bb72, %bb68, %bb67, %bb65, %bb61, %bb60, %bb58, %bb54, %bb53, %bb51, %bb47, %bb46, %bb44, %bb42, %bb38, %bb37, %bb33, %bb32, %bb30, %bb26, %bb24, %bb22, %bb21, %bb17, %bb16, %bb12, %bb10, %bb8, %bb7, %bb5, %bb3, %bb1<br>
-  br i1 false, label %bb108, label %bb110<br>
-<br>
-bb108:         ; preds = %bb106, %picosat_time_stamp.exit<br>
-  br i1 false, label %bb, label %bb110<br>
-<br>
-bb110:         ; preds = %bb108, %bb106<br>
-  br i1 false, label %bb112, label %bb171<br>
-<br>
-bb112:         ; preds = %bb110<br>
-  br i1 false, label %bb114, label %bb113<br>
-<br>
-bb113:         ; preds = %bb112<br>
-  br label %bb114<br>
-<br>
-bb114:         ; preds = %bb113, %bb112<br>
-  br i1 false, label %bb.i.i35, label %bb1.i.i36<br>
-<br>
-bb.i.i35:              ; preds = %bb114<br>
-  unreachable<br>
-<br>
-bb1.i.i36:             ; preds = %bb114<br>
-  br i1 false, label %bb5.i.i.i41, label %bb6.i.i.i42<br>
-<br>
-bb5.i.i.i41:           ; preds = %bb1.i.i36<br>
-  unreachable<br>
-<br>
-bb6.i.i.i42:           ; preds = %bb1.i.i36<br>
-  br i1 false, label %bb7.i.i.i43, label %bb8.i.i.i44<br>
-<br>
-bb7.i.i.i43:           ; preds = %bb6.i.i.i42<br>
-  br label %bb8.i.i.i44<br>
-<br>
-bb8.i.i.i44:           ; preds = %bb7.i.i.i43, %bb6.i.i.i42<br>
-  br i1 false, label %picosat_init.exit, label %bb14.i.i<br>
-<br>
-bb14.i.i:              ; preds = %bb8.i.i.i44<br>
-  br label %picosat_init.exit<br>
-<br>
-picosat_init.exit:             ; preds = %bb14.i.i, %bb8.i.i.i44<br>
-  br i1 false, label %bb116, label %bb115<br>
-<br>
-bb115:         ; preds = %picosat_init.exit<br>
-  br label %bb116<br>
-<br>
-bb116:         ; preds = %bb115, %picosat_init.exit<br>
-  br i1 false, label %bb119, label %bb118<br>
-<br>
-bb118:         ; preds = %bb116<br>
-  br label %bb119<br>
-<br>
-bb119:         ; preds = %bb118, %bb116<br>
-  br i1 false, label %bb121, label %bb120<br>
-<br>
-bb120:         ; preds = %bb119<br>
-  br label %bb121<br>
-<br>
-bb121:         ; preds = %bb120, %bb119<br>
-  br i1 false, label %bb126, label %bb122<br>
-<br>
-bb122:         ; preds = %bb121<br>
-  br label %bb126<br>
-<br>
-bb126:         ; preds = %bb122, %bb121<br>
-  br i1 false, label %bb128, label %bb127<br>
-<br>
-bb127:         ; preds = %bb126<br>
-  br label %bb128<br>
-<br>
-bb128:         ; preds = %bb127, %bb126<br>
-  br label %SKIP_COMMENTS.i<br>
-<br>
-SKIP_COMMENTS.i.loopexit:              ; preds = %bb.i149, %bb.i149<br>
-  br label %SKIP_COMMENTS.i.backedge<br>
-<br>
-SKIP_COMMENTS.i:               ; preds = %SKIP_COMMENTS.i.backedge, %bb128<br>
-  br i1 false, label %bb.i149.preheader, label %bb3.i152<br>
-<br>
-bb.i149.preheader:             ; preds = %SKIP_COMMENTS.i<br>
-  br label %bb.i149<br>
-<br>
-bb.i149:               ; preds = %bb.i149, %bb.i149.preheader<br>
-  switch i32 0, label %bb.i149 [<br>
-  i32 -1, label %SKIP_COMMENTS.i.loopexit<br>
-  i32 10, label %SKIP_COMMENTS.i.loopexit<br>
-  ]<br>
-<br>
-bb3.i152:              ; preds = %SKIP_COMMENTS.i<br>
-  br i1 false, label %bb4.i153, label %SKIP_COMMENTS.i.backedge<br>
-<br>
-SKIP_COMMENTS.i.backedge:              ; preds = %bb3.i152, %SKIP_COMMENTS.i.loopexit<br>
-  br label %SKIP_COMMENTS.i<br>
-<br>
-bb4.i153:              ; preds = %bb3.i152<br>
-  br i1 false, label %bb5.i154, label %bb129<br>
-<br>
-bb5.i154:              ; preds = %bb4.i153<br>
-  br i1 false, label %bb129, label %bb6.i155.preheader<br>
-<br>
-bb6.i155.preheader:            ; preds = %bb5.i154<br>
-  br label %bb6.i155<br>
-<br>
-bb6.i155:              ; preds = %bb6.i155, %bb6.i155.preheader<br>
-  br i1 false, label %bb7.i156, label %bb6.i155<br>
-<br>
-bb7.i156:              ; preds = %bb6.i155<br>
-  br i1 false, label %bb8.i157, label %bb129<br>
-<br>
-bb8.i157:              ; preds = %bb7.i156<br>
-  br i1 false, label %bb9.i158, label %bb129<br>
-<br>
-bb9.i158:              ; preds = %bb8.i157<br>
-  br i1 false, label %bb10.i159, label %bb129<br>
-<br>
-bb10.i159:             ; preds = %bb9.i158<br>
-  br i1 false, label %bb129, label %bb11.i160.preheader<br>
-<br>
-bb11.i160.preheader:           ; preds = %bb10.i159<br>
-  br label %bb11.i160<br>
-<br>
-bb11.i160:             ; preds = %bb11.i160, %bb11.i160.preheader<br>
-  br i1 false, label %bb12.i161, label %bb11.i160<br>
-<br>
-bb12.i161:             ; preds = %bb11.i160<br>
-  br i1 false, label %bb129, label %bb15.i165.preheader<br>
-<br>
-bb15.i165.preheader:           ; preds = %bb12.i161<br>
-  br label %bb15.i165<br>
-<br>
-bb14.i163:             ; preds = %bb15.i165<br>
-  br label %bb15.i165<br>
-<br>
-bb15.i165:             ; preds = %bb14.i163, %bb15.i165.preheader<br>
-  br i1 false, label %bb16.i166, label %bb14.i163<br>
-<br>
-bb16.i166:             ; preds = %bb15.i165<br>
-  br i1 false, label %bb129, label %bb17.i167.preheader<br>
-<br>
-bb17.i167.preheader:           ; preds = %bb16.i166<br>
-  br label %bb17.i167<br>
-<br>
-bb17.i167:             ; preds = %bb17.i167, %bb17.i167.preheader<br>
-  br i1 false, label %bb18.i168, label %bb17.i167<br>
-<br>
-bb18.i168:             ; preds = %bb17.i167<br>
-  br i1 false, label %bb129, label %bb21.i172.preheader<br>
-<br>
-bb21.i172.preheader:           ; preds = %bb18.i168<br>
-  br label %bb21.i172<br>
-<br>
-bb20.i170:             ; preds = %bb21.i172<br>
-  br label %bb21.i172<br>
-<br>
-bb21.i172:             ; preds = %bb20.i170, %bb21.i172.preheader<br>
-  br i1 false, label %bb22.i173, label %bb20.i170<br>
-<br>
-bb22.i173:             ; preds = %bb21.i172<br>
-  br i1 false, label %bb24.i175, label %bb129<br>
-<br>
-bb24.i175:             ; preds = %bb22.i173<br>
-  br i1 false, label %bb26.i180, label %bb25.i176<br>
-<br>
-bb25.i176:             ; preds = %bb24.i175<br>
-  br label %bb26.i180<br>
-<br>
-bb26.i180:             ; preds = %bb25.i176, %bb24.i175<br>
-  br i1 false, label %bb.i.i181, label %bb3.i.i184.preheader<br>
-<br>
-bb.i.i181:             ; preds = %bb26.i180<br>
-  br label %bb3.i.i184.preheader<br>
-<br>
-bb3.i.i184.preheader:          ; preds = %bb.i.i181, %bb26.i180<br>
-  br label %bb3.i.i184<br>
-<br>
-bb2.i.i183:            ; preds = %bb3.i.i184<br>
-  br label %bb3.i.i184<br>
-<br>
-bb3.i.i184:            ; preds = %bb2.i.i183, %bb3.i.i184.preheader<br>
-  br i1 false, label %bb2.i.i183, label %bb4.i.i185<br>
-<br>
-bb4.i.i185:            ; preds = %bb3.i.i184<br>
-  br i1 false, label %bb.i.i.i186, label %picosat_adjust.exit.i<br>
-<br>
-bb.i.i.i186:           ; preds = %bb4.i.i185<br>
-  br label %picosat_adjust.exit.i<br>
-<br>
-picosat_adjust.exit.i:         ; preds = %bb.i.i.i186, %bb4.i.i185<br>
-  br i1 false, label %bb28.i188, label %bb27.i187<br>
-<br>
-bb27.i187:             ; preds = %picosat_adjust.exit.i<br>
-  br label %bb28.i188<br>
-<br>
-bb28.i188:             ; preds = %bb27.i187, %picosat_adjust.exit.i<br>
-  br label %READ_LITERAL.i.outer<br>
-<br>
-READ_LITERAL.i.outer:          ; preds = %READ_LITERAL.i.outer.backedge, %bb28.i188<br>
-  br label %READ_LITERAL.i<br>
-<br>
-READ_LITERAL.i.loopexit:               ; preds = %bb29.i189, %bb29.i189<br>
-  br label %READ_LITERAL.i.backedge<br>
-<br>
-READ_LITERAL.i:                ; preds = %READ_LITERAL.i.backedge, %READ_LITERAL.i.outer<br>
-  switch i32 0, label %bb39.i199 [<br>
-  i32 99, label %bb29.i189.preheader<br>
-  i32 -1, label %bb33.i193<br>
-  ]<br>
-<br>
-bb29.i189.preheader:           ; preds = %READ_LITERAL.i<br>
-  br label %bb29.i189<br>
-<br>
-bb29.i189:             ; preds = %bb29.i189, %bb29.i189.preheader<br>
-  switch i32 0, label %bb29.i189 [<br>
-  i32 -1, label %READ_LITERAL.i.loopexit<br>
-  i32 10, label %READ_LITERAL.i.loopexit<br>
-  ]<br>
-<br>
-bb33.i193:             ; preds = %READ_LITERAL.i<br>
-  br i1 false, label %bb35.i195, label %parse.exit<br>
-<br>
-bb35.i195:             ; preds = %bb33.i193<br>
-  br i1 false, label %bb38.i198, label %parse.exit<br>
-<br>
-bb38.i198:             ; preds = %bb35.i195<br>
-  br label %parse.exit<br>
-<br>
-bb39.i199:             ; preds = %READ_LITERAL.i<br>
-  br i1 false, label %bb40.i200, label %READ_LITERAL.i.backedge<br>
-<br>
-READ_LITERAL.i.backedge:               ; preds = %bb39.i199, %READ_LITERAL.i.loopexit<br>
-  br label %READ_LITERAL.i<br>
-<br>
-bb40.i200:             ; preds = %bb39.i199<br>
-  br i1 false, label %bb41.i201, label %bb42.i202<br>
-<br>
-bb41.i201:             ; preds = %bb40.i200<br>
-  br label %bb42.i202<br>
-<br>
-bb42.i202:             ; preds = %bb41.i201, %bb40.i200<br>
-  br i1 false, label %parse.exit.loopexit, label %bb46.i.preheader<br>
-<br>
-bb46.i.preheader:              ; preds = %bb42.i202<br>
-  br label %bb46.i<br>
-<br>
-bb45.i:                ; preds = %bb46.i<br>
-  br label %bb46.i<br>
-<br>
-bb46.i:                ; preds = %bb45.i, %bb46.i.preheader<br>
-  br i1 false, label %bb47.i, label %bb45.i<br>
-<br>
-bb47.i:                ; preds = %bb46.i<br>
-  br i1 false, label %parse.exit.loopexit, label %bb50.i<br>
-<br>
-bb50.i:                ; preds = %bb47.i<br>
-  br i1 false, label %bb55.i, label %bb51.i<br>
-<br>
-bb51.i:                ; preds = %bb50.i<br>
-  br i1 false, label %parse.exit.loopexit, label %bb54.i<br>
-<br>
-bb54.i:                ; preds = %bb51.i<br>
-  br label %bb56.i<br>
-<br>
-bb55.i:                ; preds = %bb50.i<br>
-  br label %bb56.i<br>
-<br>
-bb56.i:                ; preds = %bb55.i, %bb54.i<br>
-  br i1 false, label %bb3.i11.i, label %bb.i8.i<br>
-<br>
-bb.i8.i:               ; preds = %bb56.i<br>
-  br i1 false, label %bb1.i9.i, label %bb3.i11.i<br>
-<br>
-bb1.i9.i:              ; preds = %bb.i8.i<br>
-  br i1 false, label %bb3.i11.i, label %bb2.i10.i<br>
-<br>
-bb2.i10.i:             ; preds = %bb1.i9.i<br>
-  unreachable<br>
-<br>
-bb3.i11.i:             ; preds = %bb1.i9.i, %bb.i8.i, %bb56.i<br>
-  br i1 false, label %bb7.i.i208, label %bb6.i.i207<br>
-<br>
-bb6.i.i207:            ; preds = %bb3.i11.i<br>
-  br label %READ_LITERAL.i.outer.backedge<br>
-<br>
-bb7.i.i208:            ; preds = %bb3.i11.i<br>
-  br i1 false, label %bb53.i.i.i.i.preheader, label %bb.i.i.i.i210.preheader<br>
-<br>
-bb.i.i.i.i210.preheader:               ; preds = %bb7.i.i208<br>
-  br label %bb.i.i.i.i210<br>
-<br>
-bb.i.i.i.i210:         ; preds = %bb.i.i.i.i210.backedge, %bb.i.i.i.i210.preheader<br>
-  br i1 false, label %bb17.i.i.i.i, label %bb18.i.i.i.i<br>
-<br>
-bb17.i.i.i.i:          ; preds = %bb.i.i.i.i210<br>
-  br label %bb18.i.i.i.i<br>
-<br>
-bb18.i.i.i.i:          ; preds = %bb17.i.i.i.i, %bb.i.i.i.i210<br>
-  br i1 false, label %bb19.i.i.i.i, label %bb20.i.i.i.i<br>
-<br>
-bb19.i.i.i.i:          ; preds = %bb18.i.i.i.i<br>
-  br label %bb20.i.i.i.i<br>
-<br>
-bb20.i.i.i.i:          ; preds = %bb19.i.i.i.i, %bb18.i.i.i.i<br>
-  br i1 false, label %bb21.i.i.i.i, label %bb22.i.i.i.i<br>
-<br>
-bb21.i.i.i.i:          ; preds = %bb20.i.i.i.i<br>
-  br label %bb22.i.i.i.i<br>
-<br>
-bb22.i.i.i.i:          ; preds = %bb21.i.i.i.i, %bb20.i.i.i.i<br>
-  br label %bb23.i.i.i.i.outer<br>
-<br>
-bb23.i.i.i.i.outer:            ; preds = %bb28.i.i.i.i, %bb22.i.i.i.i<br>
-  br label %bb23.i.i.i.i<br>
-<br>
-bb23.i.i.i.i:          ; preds = %bb23.i.i.i.i, %bb23.i.i.i.i.outer<br>
-  br i1 false, label %bb23.i.i.i.i, label %bb26.i.i.i.i.preheader<br>
-<br>
-bb26.i.i.i.i.preheader:                ; preds = %bb23.i.i.i.i<br>
-  br label %bb26.i.i.i.i<br>
-<br>
-bb26.i.i.i.i:          ; preds = %bb26.i.i.i.i, %bb26.i.i.i.i.preheader<br>
-  br i1 false, label %bb27.i.i.i.i, label %bb26.i.i.i.i<br>
-<br>
-bb27.i.i.i.i:          ; preds = %bb26.i.i.i.i<br>
-  br i1 false, label %bb28.i.i.i.i, label %bb29.i.i.i.i<br>
-<br>
-bb28.i.i.i.i:          ; preds = %bb27.i.i.i.i<br>
-  br label %bb23.i.i.i.i.outer<br>
-<br>
-bb29.i.i.i.i:          ; preds = %bb27.i.i.i.i<br>
-  br i1 false, label %bb33.i.i.i.i, label %bb44.i.i.i.i<br>
-<br>
-bb33.i.i.i.i:          ; preds = %bb29.i.i.i.i<br>
-  br i1 false, label %bb34.i.i.i.i, label %bb38.i.i.i.i<br>
-<br>
-bb34.i.i.i.i:          ; preds = %bb33.i.i.i.i<br>
-  br i1 false, label %bb37.i.i.i.i, label %bb35.i.i.i.i<br>
-<br>
-bb35.i.i.i.i:          ; preds = %bb34.i.i.i.i<br>
-  br label %bb37.i.i.i.i<br>
-<br>
-bb37.i.i.i.i:          ; preds = %bb35.i.i.i.i, %bb34.i.i.i.i<br>
-  br label %bb38.i.i.i.i<br>
-<br>
-bb38.i.i.i.i:          ; preds = %bb37.i.i.i.i, %bb33.i.i.i.i<br>
-  br i1 false, label %bb39.i.i.i.i, label %bb43.i.i.i.i<br>
-<br>
-bb39.i.i.i.i:          ; preds = %bb38.i.i.i.i<br>
-  br i1 false, label %bb42.i.i.i.i, label %bb40.i.i.i.i<br>
-<br>
-bb40.i.i.i.i:          ; preds = %bb39.i.i.i.i<br>
-  br label %bb42.i.i.i.i<br>
-<br>
-bb42.i.i.i.i:          ; preds = %bb40.i.i.i.i, %bb39.i.i.i.i<br>
-  br label %bb43.i.i.i.i<br>
-<br>
-bb43.i.i.i.i:          ; preds = %bb42.i.i.i.i, %bb38.i.i.i.i<br>
-  br label %bb.i.i.i.i210.backedge<br>
-<br>
-bb.i.i.i.i210.backedge:                ; preds = %bb47.i.i.i.i, %bb44.i.i.i.i, %bb43.i.i.i.i<br>
-  br label %bb.i.i.i.i210<br>
-<br>
-bb44.i.i.i.i:          ; preds = %bb29.i.i.i.i<br>
-  br i1 false, label %bb.i.i.i.i210.backedge, label %bb46.i.i.i.i<br>
-<br>
-bb46.i.i.i.i:          ; preds = %bb44.i.i.i.i<br>
-  br i1 false, label %bb47.i.i.i.i, label %bb53.i.i.i.i.preheader.loopexit<br>
-<br>
-bb53.i.i.i.i.preheader.loopexit:               ; preds = %bb46.i.i.i.i<br>
-  br label %bb53.i.i.i.i.preheader<br>
-<br>
-bb53.i.i.i.i.preheader:                ; preds = %bb53.i.i.i.i.preheader.loopexit, %bb7.i.i208<br>
-  br label %bb53.i.i.i.i<br>
-<br>
-bb47.i.i.i.i:          ; preds = %bb46.i.i.i.i<br>
-  br label %bb.i.i.i.i210.backedge<br>
-<br>
-bb50.i.i.i.i:          ; preds = %bb53.i.i.i.i<br>
-  br i1 false, label %bb51.i.i.i.i, label %bb52.i.i.i.i<br>
-<br>
-bb51.i.i.i.i:          ; preds = %bb50.i.i.i.i<br>
-  br label %bb52.i.i.i.i<br>
-<br>
-bb52.i.i.i.i:          ; preds = %bb51.i.i.i.i, %bb50.i.i.i.i<br>
-  br label %bb53.i.i.i.i<br>
-<br>
-bb53.i.i.i.i:          ; preds = %bb52.i.i.i.i, %bb53.i.i.i.i.preheader<br>
-  br i1 false, label %bb50.i.i.i.i, label %bb59.i.i.i.i.preheader<br>
-<br>
-bb59.i.i.i.i.preheader:                ; preds = %bb53.i.i.i.i<br>
-  br label %bb59.i.i.i.i<br>
-<br>
-bb55.i.i.i.i:          ; preds = %bb59.i.i.i.i<br>
-  br label %bb57.i.i.i.i<br>
-<br>
-bb56.i.i.i.i:          ; preds = %bb57.i.i.i.i<br>
-  br label %bb57.i.i.i.i<br>
-<br>
-bb57.i.i.i.i:          ; preds = %bb56.i.i.i.i, %bb55.i.i.i.i<br>
-  br i1 false, label %bb56.i.i.i.i, label %bb58.i.i.i.i<br>
-<br>
-bb58.i.i.i.i:          ; preds = %bb57.i.i.i.i<br>
-  br label %bb59.i.i.i.i<br>
-<br>
-bb59.i.i.i.i:          ; preds = %bb58.i.i.i.i, %bb59.i.i.i.i.preheader<br>
-  br i1 false, label %bb60.i.i.i.i, label %bb55.i.i.i.i<br>
-<br>
-bb60.i.i.i.i:          ; preds = %bb59.i.i.i.i<br>
-  br label %bb69.i.i.i.i<br>
-<br>
-bb61.i.i.i.i:          ; preds = %bb69.i.i.i.i<br>
-  br i1 false, label %bb68.i.i.i.i, label %bb62.i.i.i.i<br>
-<br>
-bb62.i.i.i.i:          ; preds = %bb61.i.i.i.i<br>
-  br i1 false, label %bb63.i.i.i.i, label %bb65.i.i.i.i<br>
-<br>
-bb63.i.i.i.i:          ; preds = %bb62.i.i.i.i<br>
-  br i1 false, label %bb.i.i12.i, label %bb65.i.i.i.i<br>
-<br>
-bb65.i.i.i.i:          ; preds = %bb63.i.i.i.i, %bb62.i.i.i.i<br>
-  br i1 false, label %bb.i.i12.i, label %bb67.i.i.i.i<br>
-<br>
-bb67.i.i.i.i:          ; preds = %bb65.i.i.i.i<br>
-  br label %bb68.i.i.i.i<br>
-<br>
-bb68.i.i.i.i:          ; preds = %bb67.i.i.i.i, %bb61.i.i.i.i<br>
-  br label %bb69.i.i.i.i<br>
-<br>
-bb69.i.i.i.i:          ; preds = %bb68.i.i.i.i, %bb60.i.i.i.i<br>
-  br i1 false, label %bb61.i.i.i.i, label %bb70.i.i.i.i<br>
-<br>
-bb70.i.i.i.i:          ; preds = %bb69.i.i.i.i<br>
-  br label %READ_LITERAL.i.outer.backedge<br>
-<br>
-bb.i.i12.i:            ; preds = %bb65.i.i.i.i, %bb63.i.i.i.i<br>
-  br i1 false, label %bb1.i.i.i213, label %bb5.i.i.i218<br>
-<br>
-bb1.i.i.i213:          ; preds = %bb.i.i12.i<br>
-  br i1 false, label %bb4.i.i.i217, label %bb2.i.i.i214<br>
-<br>
-bb2.i.i.i214:          ; preds = %bb1.i.i.i213<br>
-  br label %bb4.i.i.i217<br>
-<br>
-bb4.i.i.i217:          ; preds = %bb2.i.i.i214, %bb1.i.i.i213<br>
-  br label %bb5.i.i.i218<br>
-<br>
-bb5.i.i.i218:          ; preds = %bb4.i.i.i217, %bb.i.i12.i<br>
-  br label %READ_LITERAL.i.outer.backedge<br>
-<br>
-READ_LITERAL.i.outer.backedge:         ; preds = %bb5.i.i.i218, %bb70.i.i.i.i, %bb6.i.i207<br>
-  br label %READ_LITERAL.i.outer<br>
-<br>
-parse.exit.loopexit:           ; preds = %bb51.i, %bb47.i, %bb42.i202<br>
-  br label %parse.exit<br>
-<br>
-parse.exit:            ; preds = %parse.exit.loopexit, %bb38.i198, %bb35.i195, %bb33.i193<br>
-  br i1 false, label %bb130, label %bb129<br>
-<br>
-bb129:         ; preds = %parse.exit, %bb22.i173, %bb18.i168, %bb16.i166, %bb12.i161, %bb10.i159, %bb9.i158, %bb8.i157, %bb7.i156, %bb5.i154, %bb4.i153<br>
-  br label %bb170<br>
-<br>
-bb130:         ; preds = %parse.exit<br>
-  br i1 false, label %bb143, label %bb142.preheader<br>
-<br>
-bb142.preheader:               ; preds = %bb130<br>
-  br label %bb142<br>
-<br>
-bb132:         ; preds = %bb142<br>
-  br i1 false, label %bb137, label %bb133<br>
-<br>
-bb133:         ; preds = %bb132<br>
-  br i1 false, label %bb137, label %bb134<br>
-<br>
-bb134:         ; preds = %bb133<br>
-  br i1 false, label %bb137, label %bb135<br>
-<br>
-bb135:         ; preds = %bb134<br>
-  br i1 false, label %bb137, label %bb136<br>
-<br>
-bb136:         ; preds = %bb135<br>
-  br i1 false, label %bb137, label %bb138<br>
-<br>
-bb137:         ; preds = %bb136, %bb135, %bb134, %bb133, %bb132<br>
-  br label %bb141<br>
-<br>
-bb138:         ; preds = %bb136<br>
-  br i1 false, label %bb139, label %bb141<br>
-<br>
-bb139:         ; preds = %bb138<br>
-  br i1 false, label %bb2.i126, label %picosat_assume.exit<br>
-<br>
-bb2.i126:              ; preds = %bb139<br>
-  br i1 false, label %bb5.i130, label %bb3.i127<br>
-<br>
-bb3.i127:              ; preds = %bb2.i126<br>
-  br label %bb5.i130<br>
-<br>
-bb5.i130:              ; preds = %bb3.i127, %bb2.i126<br>
-  br label %picosat_assume.exit<br>
-<br>
-picosat_assume.exit:           ; preds = %bb5.i130, %bb139<br>
-  br i1 false, label %bb141, label %bb140<br>
-<br>
-bb140:         ; preds = %picosat_assume.exit<br>
-  br label %bb141<br>
-<br>
-bb141:         ; preds = %bb140, %picosat_assume.exit, %bb138, %bb137<br>
-  br label %bb142<br>
-<br>
-bb142:         ; preds = %bb141, %bb142.preheader<br>
-  br i1 false, label %bb132, label %bb143.loopexit<br>
-<br>
-bb143.loopexit:                ; preds = %bb142<br>
-  br label %bb143<br>
-<br>
-bb143:         ; preds = %bb143.loopexit, %bb130<br>
-  br i1 false, label %bb145, label %bb144<br>
-<br>
-bb144:         ; preds = %bb143<br>
-  br label %bb11.i<br>
-<br>
-bb5.i114:              ; preds = %bb11.i<br>
-  br label %bb11.i<br>
-<br>
-bb11.i:                ; preds = %bb5.i114, %bb144<br>
-  br i1 false, label %bb12.i, label %bb5.i114<br>
-<br>
-bb12.i:                ; preds = %bb11.i<br>
-  br i1 false, label %bb.i.i.i118, label %bb1.i.i.i119<br>
-<br>
-bb.i.i.i118:           ; preds = %bb12.i<br>
-  br label %int2lit.exit.i<br>
-<br>
-bb1.i.i.i119:          ; preds = %bb12.i<br>
-  br label %int2lit.exit.i<br>
-<br>
-int2lit.exit.i:                ; preds = %bb1.i.i.i119, %bb.i.i.i118<br>
-  br label %bb19.i<br>
-<br>
-bb13.i:                ; preds = %bb19.i<br>
-  br label %bb17.i<br>
-<br>
-bb14.i:                ; preds = %bb17.i<br>
-  br label %bb17.i<br>
-<br>
-bb17.i:                ; preds = %bb14.i, %bb13.i<br>
-  br i1 false, label %bb14.i, label %bb18.i<br>
-<br>
-bb18.i:                ; preds = %bb17.i<br>
-  br label %bb19.i<br>
-<br>
-bb19.i:                ; preds = %bb18.i, %int2lit.exit.i<br>
-  br i1 false, label %bb20.i, label %bb13.i<br>
-<br>
-bb20.i:                ; preds = %bb19.i<br>
-  br label %bb33.i<br>
-<br>
-bb24.i:                ; preds = %bb33.i<br>
-  br i1 false, label %bb29.i, label %bb25.i<br>
-<br>
-bb25.i:                ; preds = %bb24.i<br>
-  br label %bb27.i<br>
-<br>
-bb26.i:                ; preds = %bb27.i<br>
-  br label %bb27.i<br>
-<br>
-bb27.i:                ; preds = %bb26.i, %bb25.i<br>
-  br i1 false, label %bb26.i, label %bb28.i<br>
-<br>
-bb28.i:                ; preds = %bb27.i<br>
-  br label %bb29.i<br>
-<br>
-bb29.i:                ; preds = %bb28.i, %bb24.i<br>
-  br label %bb33.i<br>
-<br>
-bb33.i:                ; preds = %bb29.i, %bb20.i<br>
-  br i1 false, label %bb34.i, label %bb24.i<br>
-<br>
-bb34.i:                ; preds = %bb33.i<br>
-  br i1 false, label %bb.i.i58.i, label %bb1.i.i59.i<br>
-<br>
-bb.i.i58.i:            ; preds = %bb34.i<br>
-  br label %int2lit.exit63.i<br>
-<br>
-bb1.i.i59.i:           ; preds = %bb34.i<br>
-  br label %int2lit.exit63.i<br>
-<br>
-int2lit.exit63.i:              ; preds = %bb1.i.i59.i, %bb.i.i58.i<br>
-  br label %bb41.i<br>
-<br>
-bb35.i:                ; preds = %bb41.i<br>
-  br label %bb39.i<br>
-<br>
-bb36.i:                ; preds = %bb39.i<br>
-  br i1 false, label %bb38.i, label %bb37.i<br>
-<br>
-bb37.i:                ; preds = %bb36.i<br>
-  br label %bb38.i<br>
-<br>
-bb38.i:                ; preds = %bb37.i, %bb36.i<br>
-  br label %bb39.i<br>
-<br>
-bb39.i:                ; preds = %bb38.i, %bb35.i<br>
-  br i1 false, label %bb36.i, label %bb40.i<br>
-<br>
-bb40.i:                ; preds = %bb39.i<br>
-  br label %bb41.i<br>
-<br>
-bb41.i:                ; preds = %bb40.i, %int2lit.exit63.i<br>
-  br i1 false, label %bb42.i, label %bb35.i<br>
-<br>
-bb42.i:                ; preds = %bb41.i<br>
-  br label %bb44.i<br>
-<br>
-bb43.i:                ; preds = %bb44.i<br>
-  br label %bb44.i<br>
-<br>
-bb44.i:                ; preds = %bb43.i, %bb42.i<br>
-  br i1 false, label %bb43.i, label %picosat_print.exit<br>
-<br>
-picosat_print.exit:            ; preds = %bb44.i<br>
-  br label %bb167<br>
-<br>
-bb145:         ; preds = %bb143<br>
-  br i1 false, label %bb147, label %bb146<br>
-<br>
-bb146:         ; preds = %bb145<br>
-  br label %bb147<br>
-<br>
-bb147:         ; preds = %bb146, %bb145<br>
-  br i1 false, label %bb149, label %bb148<br>
-<br>
-bb148:         ; preds = %bb147<br>
-  br label %bb149<br>
-<br>
-bb149:         ; preds = %bb148, %bb147<br>
-  br i1 false, label %bb.i54, label %bb1.i55<br>
-<br>
-bb.i54:                ; preds = %bb149<br>
-  unreachable<br>
-<br>
-bb1.i55:               ; preds = %bb149<br>
-  br i1 false, label %bb.i.i56, label %bb1.i.i57<br>
-<br>
-bb.i.i56:              ; preds = %bb1.i55<br>
-  br label %bb1.i.i57<br>
-<br>
-bb1.i.i57:             ; preds = %bb.i.i56, %bb1.i55<br>
-  br i1 false, label %bb3.i.i59, label %bb2.i.i58<br>
-<br>
-bb2.i.i58:             ; preds = %bb1.i.i57<br>
-  br label %bb3.i.i59<br>
-<br>
-bb3.i.i59:             ; preds = %bb2.i.i58, %bb1.i.i57<br>
-  br i1 false, label %bb5.i.i61, label %sat.exit.i<br>
-<br>
-bb5.i.i61:             ; preds = %bb3.i.i59<br>
-  br i1 false, label %bb6.i.i65, label %bb1.i.i.i63<br>
-<br>
-bb1.i.i.i63:           ; preds = %bb5.i.i61<br>
-  br i1 false, label %sat.exit.i, label %bb6.i.i65<br>
-<br>
-bb6.i.i65:             ; preds = %bb1.i.i.i63, %bb5.i.i61<br>
-  br i1 false, label %bb8.i.i67, label %bb7.i.i66<br>
-<br>
-bb7.i.i66:             ; preds = %bb6.i.i65<br>
-  br label %bb8.i.i67<br>
-<br>
-bb8.i.i67:             ; preds = %bb7.i.i66, %bb6.i.i65<br>
-  br i1 false, label %bb10.i.i69, label %sat.exit.i<br>
-<br>
-bb10.i.i69:            ; preds = %bb8.i.i67<br>
-  br i1 false, label %bb11.i.i70, label %bb1.i61.i.i<br>
-<br>
-bb1.i61.i.i:           ; preds = %bb10.i.i69<br>
-  br i1 false, label %sat.exit.i, label %bb11.i.i70<br>
-<br>
-bb11.i.i70:            ; preds = %bb1.i61.i.i, %bb10.i.i69<br>
-  br label %bb13.i.i71.outer<br>
-<br>
-bb13.i.i71.outer:              ; preds = %bb42.i.i, %bb11.i.i70<br>
-  br label %bb13.i.i71<br>
-<br>
-bb13.i.i71:            ; preds = %bb13.i.i71.backedge, %bb13.i.i71.outer<br>
-  br i1 false, label %bb14.i.i72, label %bb15.i.i73<br>
-<br>
-bb14.i.i72:            ; preds = %bb13.i.i71<br>
-  br label %bb15.i.i73<br>
-<br>
-bb15.i.i73:            ; preds = %bb14.i.i72, %bb13.i.i71<br>
-  br i1 false, label %bb19.i.i, label %bb16.i.i<br>
-<br>
-bb16.i.i:              ; preds = %bb15.i.i73<br>
-  br i1 false, label %bb.i.i79.i.i, label %incincs.exit.i.i<br>
-<br>
-bb.i.i79.i.i:          ; preds = %bb16.i.i<br>
-  br label %bb4.i.i.i85.i.i<br>
-<br>
-bb.i.i.i80.i.i:                ; preds = %bb4.i.i.i85.i.i<br>
-  br i1 false, label %bb3.i.i.i83.i.i, label %bb1.i.i.i81.i.i<br>
-<br>
-bb1.i.i.i81.i.i:               ; preds = %bb.i.i.i80.i.i<br>
-  br i1 false, label %bb2.i.i.i82.i.i, label %bb3.i.i.i83.i.i<br>
-<br>
-bb2.i.i.i82.i.i:               ; preds = %bb1.i.i.i81.i.i<br>
-  br label %bb3.i.i.i83.i.i<br>
-<br>
-bb3.i.i.i83.i.i:               ; preds = %bb2.i.i.i82.i.i, %bb1.i.i.i81.i.i, %bb.i.i.i80.i.i<br>
-  br label %bb4.i.i.i85.i.i<br>
-<br>
-bb4.i.i.i85.i.i:               ; preds = %bb3.i.i.i83.i.i, %bb.i.i79.i.i<br>
-  br i1 false, label %crescore.exit.i.i.i.i, label %bb.i.i.i80.i.i<br>
-<br>
-crescore.exit.i.i.i.i:         ; preds = %bb4.i.i.i85.i.i<br>
-  br label %incincs.exit.i.i<br>
-<br>
-incincs.exit.i.i:              ; preds = %crescore.exit.i.i.i.i, %bb16.i.i<br>
-  br i1 false, label %bb13.i.i71.backedge, label %sat.exit.i.loopexit.loopexit<br>
-<br>
-bb13.i.i71.backedge:           ; preds = %bb1.i55.i.i, %bb28.i.i, %incincs.exit.i.i<br>
-  br label %bb13.i.i71<br>
-<br>
-bb19.i.i:              ; preds = %bb15.i.i73<br>
-  br i1 false, label %bb20.i.i, label %bb1.i68.i.i<br>
-<br>
-bb1.i68.i.i:           ; preds = %bb19.i.i<br>
-  br i1 false, label %sat.exit.i.loopexit.loopexit, label %bb20.i.i<br>
-<br>
-bb20.i.i:              ; preds = %bb1.i68.i.i, %bb19.i.i<br>
-  br i1 false, label %bb24.i.i, label %bb21.i.i<br>
-<br>
-bb21.i.i:              ; preds = %bb20.i.i<br>
-  br i1 false, label %bb22.i.i, label %bb24.i.i<br>
-<br>
-bb22.i.i:              ; preds = %bb21.i.i<br>
-  br i1 false, label %bb23.i.i, label %bb24.i.i<br>
-<br>
-bb23.i.i:              ; preds = %bb22.i.i<br>
-  br label %bb24.i.i<br>
-<br>
-bb24.i.i:              ; preds = %bb23.i.i, %bb22.i.i, %bb21.i.i, %bb20.i.i<br>
-  br i1 false, label %bb26.i.i, label %sat.exit.i.loopexit.loopexit<br>
-<br>
-bb26.i.i:              ; preds = %bb24.i.i<br>
-  br i1 false, label %bb27.i.i, label %bb33.i.i.loopexit<br>
-<br>
-bb27.i.i:              ; preds = %bb26.i.i<br>
-  br i1 false, label %bb33.i.i.loopexit, label %bb28.i.i<br>
-<br>
-bb28.i.i:              ; preds = %bb27.i.i<br>
-  br i1 false, label %bb1.i55.i.i, label %bb13.i.i71.backedge<br>
-<br>
-bb1.i55.i.i:           ; preds = %bb28.i.i<br>
-  br i1 false, label %bb29.i.i, label %bb13.i.i71.backedge<br>
-<br>
-bb29.i.i:              ; preds = %bb1.i55.i.i<br>
-  br i1 false, label %bb31.i.i, label %sat.exit.i.loopexit.loopexit2<br>
-<br>
-bb31.i.i:              ; preds = %bb29.i.i<br>
-  br i1 false, label %bb33.i.i, label %bb1.i48.i.i<br>
-<br>
-bb1.i48.i.i:           ; preds = %bb31.i.i<br>
-  br i1 false, label %sat.exit.i.loopexit.loopexit2, label %bb33.i.i<br>
-<br>
-bb33.i.i.loopexit:             ; preds = %bb27.i.i, %bb26.i.i<br>
-  br label %bb33.i.i<br>
-<br>
-bb33.i.i:              ; preds = %bb33.i.i.loopexit, %bb1.i48.i.i, %bb31.i.i<br>
-  br i1 false, label %bb34.i.i, label %bb35.i.i<br>
-<br>
-bb34.i.i:              ; preds = %bb33.i.i<br>
-  br i1 false, label %bb35.i.i, label %bb2.i44.i.i76<br>
-<br>
-bb2.i44.i.i76:         ; preds = %bb34.i.i<br>
-  br label %bb35.i.i<br>
-<br>
-bb35.i.i:              ; preds = %bb2.i44.i.i76, %bb34.i.i, %bb33.i.i<br>
-  br i1 false, label %bb1.i37.i.i, label %bb.i35.i.i<br>
-<br>
-bb.i35.i.i:            ; preds = %bb35.i.i<br>
-  br label %bb36.i.i<br>
-<br>
-bb1.i37.i.i:           ; preds = %bb35.i.i<br>
-  br i1 false, label %bb37.i.i, label %bb36.i.i<br>
-<br>
-bb36.i.i:              ; preds = %bb1.i37.i.i, %bb.i35.i.i<br>
-  br label %bb25.i23.i.i<br>
-<br>
-bb.i18.i.i:            ; preds = %bb25.i23.i.i<br>
-  br i1 false, label %bb24.i22.i.i, label %bb22.i19.i.i<br>
-<br>
-bb22.i19.i.i:          ; preds = %bb.i18.i.i<br>
-  br label %bb24.i22.i.i<br>
-<br>
-bb24.i22.i.i:          ; preds = %bb22.i19.i.i, %bb.i18.i.i<br>
-  br label %bb25.i23.i.i<br>
-<br>
-bb25.i23.i.i:          ; preds = %bb24.i22.i.i, %bb36.i.i<br>
-  br i1 false, label %bb.i18.i.i, label %bb26.i24.i.i<br>
-<br>
-bb26.i24.i.i:          ; preds = %bb25.i23.i.i<br>
-  br i1 false, label %bb27.i25.i.i, label %bb32.i.i.i<br>
-<br>
-bb27.i25.i.i:          ; preds = %bb26.i24.i.i<br>
-  br label %bb32.i.i.i<br>
-<br>
-bb32.i.i.i:            ; preds = %bb27.i25.i.i, %bb26.i24.i.i<br>
-  br label %bb64.i.i.i<br>
-<br>
-bb33.i.i.i:            ; preds = %bb64.i.i.i<br>
-  br i1 false, label %bb60.i.i.i, label %bb34.i.i.i<br>
-<br>
-bb34.i.i.i:            ; preds = %bb33.i.i.i<br>
-  br i1 false, label %bb38.i.i.i, label %bb60.i.i.i<br>
-<br>
-bb38.i.i.i:            ; preds = %bb34.i.i.i<br>
-  br i1 false, label %bb39.i.i.i, label %bb48.i.i.i<br>
-<br>
-bb39.i.i.i:            ; preds = %bb38.i.i.i<br>
-  br i1 false, label %bb48.i.i.i, label %bb40.i.i.i<br>
-<br>
-bb40.i.i.i:            ; preds = %bb39.i.i.i<br>
-  br i1 false, label %bb60.i.i.i, label %bb45.i.i.i<br>
-<br>
-bb45.i.i.i:            ; preds = %bb40.i.i.i<br>
-  br label %bb60.i.i.i<br>
-<br>
-bb48.i.i.i:            ; preds = %bb39.i.i.i, %bb38.i.i.i<br>
-  br i1 false, label %bb53.i.i.i, label %bb60.i.i.i<br>
-<br>
-bb53.i.i.i:            ; preds = %bb48.i.i.i<br>
-  br i1 false, label %bb60.i.i.i, label %bb58.i.i.i<br>
-<br>
-bb58.i.i.i:            ; preds = %bb53.i.i.i<br>
-  br i1 false, label %bb59.i.i.i, label %bb60.i.i.i<br>
-<br>
-bb59.i.i.i:            ; preds = %bb58.i.i.i<br>
-  br label %bb60.i.i.i<br>
-<br>
-bb60.i.i.i:            ; preds = %bb59.i.i.i, %bb58.i.i.i, %bb53.i.i.i, %bb48.i.i.i, %bb45.i.i.i, %bb40.i.i.i, %bb34.i.i.i, %bb33.i.i.i<br>
-  %lcollect.i.i.i.1 = phi i32 [ %lcollect.i.i.i.2, %bb34.i.i.i ], [ %lcollect.i.i.i.2, %bb48.i.i.i ], [ %lcollect.i.i.i.2, %bb58.i.i.i ], [ %lcollect.i.i.i.2, %bb59.i.i.i ], [ %lcollect.i.i.i.2, %bb53.i.i.i ], [ %lcollect.i.i.i.2, %bb33.i.i.i ], [ %lcollect.i.i.i.2, %bb40.i.i.i ], [ 0, %bb45.i.i.i ]           ; <i32> [#uses=1]<br>
-  br label %bb64.i.i.i<br>
-<br>
-bb64.i.i.i:            ; preds = %bb60.i.i.i, %bb32.i.i.i<br>
-  %lcollect.i.i.i.2 = phi i32 [ 0, %bb32.i.i.i ], [ %lcollect.i.i.i.1, %bb60.i.i.i ]           ; <i32> [#uses=8]<br>
-  br i1 false, label %bb65.i.i.i, label %bb33.i.i.i<br>
-<br>
-bb65.i.i.i:            ; preds = %bb64.i.i.i<br>
-  br i1 false, label %bb103.i.i.i.preheader, label %bb66.i.i.i.preheader<br>
-<br>
-bb66.i.i.i.preheader:          ; preds = %bb65.i.i.i<br>
-  br label %bb66.i.i.i<br>
-<br>
-bb66.i.i.i:            ; preds = %bb66.i.i.i.backedge, %bb66.i.i.i.preheader<br>
-  br i1 false, label %bb67.i.i.i, label %bb68.i.i.i<br>
-<br>
-bb67.i.i.i:            ; preds = %bb66.i.i.i<br>
-  br label %bb68.i.i.i<br>
-<br>
-bb68.i.i.i:            ; preds = %bb67.i.i.i, %bb66.i.i.i<br>
-  br i1 false, label %bb69.i.i.i, label %bb70.i.i.i<br>
-<br>
-bb69.i.i.i:            ; preds = %bb68.i.i.i<br>
-  br label %bb70.i.i.i<br>
-<br>
-bb70.i.i.i:            ; preds = %bb69.i.i.i, %bb68.i.i.i<br>
-  br i1 false, label %bb71.i.i.i, label %bb72.i.i.i<br>
-<br>
-bb71.i.i.i:            ; preds = %bb70.i.i.i<br>
-  br label %bb72.i.i.i<br>
-<br>
-bb72.i.i.i:            ; preds = %bb71.i.i.i, %bb70.i.i.i<br>
-  br label %bb73.i.i.i.outer<br>
-<br>
-bb73.i.i.i.outer:              ; preds = %bb78.i.i.i, %bb72.i.i.i<br>
-  br label %bb73.i.i.i<br>
-<br>
-bb73.i.i.i:            ; preds = %bb73.i.i.i, %bb73.i.i.i.outer<br>
-  br i1 false, label %bb73.i.i.i, label %bb76.i.i.i.preheader<br>
-<br>
-bb76.i.i.i.preheader:          ; preds = %bb73.i.i.i<br>
-  br label %bb76.i.i.i<br>
-<br>
-bb76.i.i.i:            ; preds = %bb76.i.i.i, %bb76.i.i.i.preheader<br>
-  br i1 false, label %bb77.i.i.i, label %bb76.i.i.i<br>
-<br>
-bb77.i.i.i:            ; preds = %bb76.i.i.i<br>
-  br i1 false, label %bb78.i.i.i, label %bb79.i.i.i<br>
-<br>
-bb78.i.i.i:            ; preds = %bb77.i.i.i<br>
-  br label %bb73.i.i.i.outer<br>
-<br>
-bb79.i.i.i:            ; preds = %bb77.i.i.i<br>
-  br i1 false, label %bb83.i.i.i, label %bb94.i.i.i<br>
-<br>
-bb83.i.i.i:            ; preds = %bb79.i.i.i<br>
-  br i1 false, label %bb84.i.i.i, label %bb88.i.i.i<br>
-<br>
-bb84.i.i.i:            ; preds = %bb83.i.i.i<br>
-  br i1 false, label %bb87.i.i.i, label %bb85.i.i.i<br>
-<br>
-bb85.i.i.i:            ; preds = %bb84.i.i.i<br>
-  br label %bb87.i.i.i<br>
-<br>
-bb87.i.i.i:            ; preds = %bb85.i.i.i, %bb84.i.i.i<br>
-  br label %bb88.i.i.i<br>
-<br>
-bb88.i.i.i:            ; preds = %bb87.i.i.i, %bb83.i.i.i<br>
-  br i1 false, label %bb89.i.i.i, label %bb93.i.i.i<br>
-<br>
-bb89.i.i.i:            ; preds = %bb88.i.i.i<br>
-  br i1 false, label %bb92.i.i.i, label %bb90.i.i.i<br>
-<br>
-bb90.i.i.i:            ; preds = %bb89.i.i.i<br>
-  br label %bb92.i.i.i<br>
-<br>
-bb92.i.i.i:            ; preds = %bb90.i.i.i, %bb89.i.i.i<br>
-  br label %bb93.i.i.i<br>
-<br>
-bb93.i.i.i:            ; preds = %bb92.i.i.i, %bb88.i.i.i<br>
-  br label %bb66.i.i.i.backedge<br>
-<br>
-bb66.i.i.i.backedge:           ; preds = %bb97.i.i.i, %bb94.i.i.i, %bb93.i.i.i<br>
-  br label %bb66.i.i.i<br>
-<br>
-bb94.i.i.i:            ; preds = %bb79.i.i.i<br>
-  br i1 false, label %bb66.i.i.i.backedge, label %bb96.i.i.i<br>
-<br>
-bb96.i.i.i:            ; preds = %bb94.i.i.i<br>
-  br i1 false, label %bb97.i.i.i, label %bb103.i.i.i.preheader.loopexit<br>
-<br>
-bb103.i.i.i.preheader.loopexit:                ; preds = %bb96.i.i.i<br>
-  br label %bb103.i.i.i.preheader<br>
-<br>
-bb103.i.i.i.preheader:         ; preds = %bb103.i.i.i.preheader.loopexit, %bb65.i.i.i<br>
-  br label %bb103.i.i.i<br>
-<br>
-bb97.i.i.i:            ; preds = %bb96.i.i.i<br>
-  br label %bb66.i.i.i.backedge<br>
-<br>
-bb100.i.i.i:           ; preds = %bb103.i.i.i<br>
-  br i1 false, label %bb101.i.i.i, label %bb102.i.i.i<br>
-<br>
-bb101.i.i.i:           ; preds = %bb100.i.i.i<br>
-  br label %bb102.i.i.i<br>
-<br>
-bb102.i.i.i:           ; preds = %bb101.i.i.i, %bb100.i.i.i<br>
-  br label %bb103.i.i.i<br>
-<br>
-bb103.i.i.i:           ; preds = %bb102.i.i.i, %bb103.i.i.i.preheader<br>
-  br i1 false, label %bb100.i.i.i, label %bb109.i.i.i.preheader<br>
-<br>
-bb109.i.i.i.preheader:         ; preds = %bb103.i.i.i<br>
-  br label %bb109.i.i.i<br>
-<br>
-bb105.i.i.i:           ; preds = %bb109.i.i.i<br>
-  br label %bb107.i.i.i<br>
-<br>
-bb106.i.i.i:           ; preds = %bb107.i.i.i<br>
-  br label %bb107.i.i.i<br>
-<br>
-bb107.i.i.i:           ; preds = %bb106.i.i.i, %bb105.i.i.i<br>
-  br i1 false, label %bb106.i.i.i, label %bb108.i.i.i<br>
-<br>
-bb108.i.i.i:           ; preds = %bb107.i.i.i<br>
-  br label %bb109.i.i.i<br>
-<br>
-bb109.i.i.i:           ; preds = %bb108.i.i.i, %bb109.i.i.i.preheader<br>
-  br i1 false, label %bb110.i.i.i, label %bb105.i.i.i<br>
-<br>
-bb110.i.i.i:           ; preds = %bb109.i.i.i<br>
-  %0 = sub i32 0, %lcollect.i.i.i.2            ; <i32> [#uses=1]<br>
-  %1 = add i32 %0, 1           ; <i32> [#uses=1]<br>
-  br label %bb113.i.i.i<br>
-<br>
-bb111.i.i.i:           ; preds = %bb113.i.i.i<br>
-  br i1 false, label %bb114.i.i.i, label %bb113.i.i.i<br>
-<br>
-bb113.i.i.i:           ; preds = %bb111.i.i.i, %bb110.i.i.i<br>
-  br i1 false, label %bb111.i.i.i, label %bb114.i.i.i<br>
-<br>
-bb114.i.i.i:           ; preds = %bb113.i.i.i, %bb111.i.i.i<br>
-  %2 = lshr i32 %1, 1          ; <i32> [#uses=2]<br>
-  br i1 false, label %bb116.i.i.i, label %bb124.i.i.i<br>
-<br>
-bb116.i.i.i:           ; preds = %bb114.i.i.i<br>
-  br i1 false, label %bb117.i.i.i.preheader, label %bb122.i.i.i.preheader<br>
-<br>
-bb122.i.i.i.preheader:         ; preds = %bb116.i.i.i<br>
-  br label %bb122.i.i.i<br>
-<br>
-bb117.i.i.i.preheader:         ; preds = %bb116.i.i.i<br>
-  br label %bb117.i.i.i<br>
-<br>
-bb117.i.i.i:           ; preds = %bb118.i.i.i, %bb117.i.i.i.preheader<br>
-  %target.i.i.i.1 = phi i32 [ %3, %bb118.i.i.i ], [ %2, %bb117.i.i.i.preheader ]               ; <i32> [#uses=1]<br>
-  %3 = add i32 %target.i.i.i.1, 1              ; <i32> [#uses=2]<br>
-  br i1 false, label %bb118.i.i.i, label %bb124.i.i.i.loopexit<br>
-<br>
-bb118.i.i.i:           ; preds = %bb117.i.i.i<br>
-  br i1 false, label %bb117.i.i.i, label %bb124.i.i.i.loopexit<br>
-<br>
-bb122.i.i.i:           ; preds = %bb123.i.i.i, %bb122.i.i.i.preheader<br>
-  %target.i.i.i.2 = phi i32 [ %4, %bb123.i.i.i ], [ %2, %bb122.i.i.i.preheader ]               ; <i32> [#uses=2]<br>
-  br i1 false, label %bb124.i.i.i.loopexit1, label %bb123.i.i.i<br>
-<br>
-bb123.i.i.i:           ; preds = %bb122.i.i.i<br>
-  %4 = add i32 %target.i.i.i.2, -1             ; <i32> [#uses=1]<br>
-  br i1 false, label %bb122.i.i.i, label %bb124.i.i.i.loopexit1<br>
-<br>
-bb124.i.i.i.loopexit:          ; preds = %bb118.i.i.i, %bb117.i.i.i<br>
-  br label %bb124.i.i.i<br>
-<br>
-bb124.i.i.i.loopexit1:         ; preds = %bb123.i.i.i, %bb122.i.i.i<br>
-  br label %bb124.i.i.i<br>
-<br>
-bb124.i.i.i:           ; preds = %bb124.i.i.i.loopexit1, %bb124.i.i.i.loopexit, %bb114.i.i.i<br>
-  %target.i.i.i.0 = phi i32 [ 0, %bb114.i.i.i ], [ %3, %bb124.i.i.i.loopexit ], [ %target.i.i.i.2, %bb124.i.i.i.loopexit1 ]            ; <i32> [#uses=0]<br>
-  br label %bb132.i.i.i.outer<br>
-<br>
-bb125.i.i.i:           ; preds = %bb132.i.i.i<br>
-  br i1 false, label %bb132.i.i.i, label %bb130.i.i.i<br>
-<br>
-bb130.i.i.i:           ; preds = %bb125.i.i.i<br>
-  br label %bb132.i.i.i.outer<br>
-<br>
-bb132.i.i.i.outer:             ; preds = %bb130.i.i.i, %bb124.i.i.i<br>
-  br label %bb132.i.i.i<br>
-<br>
-bb132.i.i.i:           ; preds = %bb132.i.i.i.outer, %bb125.i.i.i<br>
-  br i1 false, label %bb125.i.i.i, label %bb133.i.i.i<br>
-<br>
-bb133.i.i.i:           ; preds = %bb132.i.i.i<br>
-  br i1 false, label %bb136.i.i.i, label %bb134.i.i.i<br>
-<br>
-bb134.i.i.i:           ; preds = %bb133.i.i.i<br>
-  br i1 false, label %bb136.i.i.i, label %bb135.i.i.i<br>
-<br>
-bb135.i.i.i:           ; preds = %bb134.i.i.i<br>
-  br label %bb136.i.i.i<br>
-<br>
-bb136.i.i.i:           ; preds = %bb135.i.i.i, %bb134.i.i.i, %bb133.i.i.i<br>
-  br i1 false, label %bb137.i.i.i, label %bb37.i.i<br>
-<br>
-bb137.i.i.i:           ; preds = %bb136.i.i.i<br>
-  br label %bb37.i.i<br>
-<br>
-bb37.i.i:              ; preds = %bb137.i.i.i, %bb136.i.i.i, %bb1.i37.i.i<br>
-  br i1 false, label %bb40.i.i, label %bb38.i.i<br>
-<br>
-bb38.i.i:              ; preds = %bb37.i.i<br>
-  br i1 false, label %bb39.i.i, label %bb40.i.i<br>
-<br>
-bb39.i.i:              ; preds = %bb38.i.i<br>
-  br i1 false, label %bb17.i.i.i, label %bb3.i12.i.i<br>
-<br>
-bb3.i12.i.i:           ; preds = %bb39.i.i<br>
-  br label %bb5.i14.i.i<br>
-<br>
-bb5.i14.i.i:           ; preds = %bb8.i.i.i79, %bb3.i12.i.i<br>
-  br i1 false, label %bb6.i15.i.i, label %bb9.i.i.i80<br>
-<br>
-bb6.i15.i.i:           ; preds = %bb5.i14.i.i<br>
-  br i1 false, label %bb7.i.i.i78, label %bb9.i.i.i80<br>
-<br>
-bb7.i.i.i78:           ; preds = %bb6.i15.i.i<br>
-  br i1 false, label %bb9.i.i.i80, label %bb8.i.i.i79<br>
-<br>
-bb8.i.i.i79:           ; preds = %bb7.i.i.i78<br>
-  br i1 false, label %bb9.i.i.i80, label %bb5.i14.i.i<br>
-<br>
-bb9.i.i.i80:           ; preds = %bb8.i.i.i79, %bb7.i.i.i78, %bb6.i15.i.i, %bb5.i14.i.i<br>
-  br i1 false, label %bb16.i.i.i, label %bb10.i.i.i81<br>
-<br>
-bb10.i.i.i81:          ; preds = %bb9.i.i.i80<br>
-  br i1 false, label %bb11.i.i.i, label %bb15.i.i.i<br>
-<br>
-bb11.i.i.i:            ; preds = %bb10.i.i.i81<br>
-  br i1 false, label %bb16.i.i.i, label %bb15.i.i.i<br>
-<br>
-bb15.i.i.i:            ; preds = %bb11.i.i.i, %bb10.i.i.i81<br>
-  br label %bb16.i.i.i<br>
-<br>
-bb16.i.i.i:            ; preds = %bb15.i.i.i, %bb11.i.i.i, %bb9.i.i.i80<br>
-  br label %bb17.i.i.i<br>
-<br>
-bb17.i.i.i:            ; preds = %bb16.i.i.i, %bb39.i.i<br>
-  br i1 false, label %bb18.i.i.i, label %bb25.i.i.i<br>
-<br>
-bb18.i.i.i:            ; preds = %bb17.i.i.i<br>
-  br i1 false, label %bb24.i.i.i, label %bb23.i.i.i<br>
-<br>
-bb23.i.i.i:            ; preds = %bb18.i.i.i<br>
-  br label %bb24.i.i.i<br>
-<br>
-bb24.i.i.i:            ; preds = %bb23.i.i.i, %bb18.i.i.i<br>
-  br label %bb29.i.i.i<br>
-<br>
-bb25.i.i.i:            ; preds = %bb17.i.i.i<br>
-  br i1 false, label %bb29.i.i.i, label %bb27.i.i.i<br>
-<br>
-bb27.i.i.i:            ; preds = %bb25.i.i.i<br>
-  br i1 false, label %bb29.i.i.i, label %bb28.i.i.i<br>
-<br>
-bb28.i.i.i:            ; preds = %bb27.i.i.i<br>
-  br i1 false, label %bb29.i.i.i, label %bb.i4.i.i.i<br>
-<br>
-bb.i4.i.i.i:           ; preds = %bb28.i.i.i<br>
-  br i1 false, label %bb4.i.i16.i.i, label %bb29.i.i.i<br>
-<br>
-bb4.i.i16.i.i:         ; preds = %bb.i4.i.i.i<br>
-  br label %bb29.i.i.i<br>
-<br>
-bb29.i.i.i:            ; preds = %bb4.i.i16.i.i, %bb.i4.i.i.i, %bb28.i.i.i, %bb27.i.i.i, %bb25.i.i.i, %bb24.i.i.i<br>
-  br label %bb40.i.i<br>
-<br>
-bb40.i.i:              ; preds = %bb29.i.i.i, %bb38.i.i, %bb37.i.i<br>
-  br i1 false, label %bb9.i.i.i.i.preheader, label %bb2.i.i.i87<br>
-<br>
-bb9.i.i.i.i.preheader:         ; preds = %bb40.i.i<br>
-  br label %bb9.i.i.i.i<br>
-<br>
-bb.i.i.i.i84:          ; preds = %bb9.i.i.i.i<br>
-  switch i8 0, label %bb8.i.i.i.i [<br>
-  i8 -1, label %bb1.i.i.i.i85<br>
-  i8 1, label %bb9.i.i.i.i<br>
-  ]<br>
-<br>
-bb1.i.i.i.i85:         ; preds = %bb.i.i.i.i84<br>
-  br i1 false, label %bb5.i.i.i.i, label %bb2.i.i.i87<br>
-<br>
-bb5.i.i.i.i:           ; preds = %bb1.i.i.i.i85<br>
-  br label %bb2.i.i.i87<br>
-<br>
-bb8.i.i.i.i:           ; preds = %bb.i.i.i.i84<br>
-  br i1 false, label %bb2.i.i.i87, label %bb6.i.i.i95<br>
-<br>
-bb9.i.i.i.i:           ; preds = %bb.i.i.i.i84, %bb9.i.i.i.i.preheader<br>
-  br i1 false, label %bb.i.i.i.i84, label %bb10.i.i.i.i<br>
-<br>
-bb10.i.i.i.i:          ; preds = %bb9.i.i.i.i<br>
-  br label %bb2.i.i.i87<br>
-<br>
-bb2.i.i.i87:           ; preds = %bb10.i.i.i.i, %bb8.i.i.i.i, %bb5.i.i.i.i, %bb1.i.i.i.i85, %bb40.i.i<br>
-  br i1 false, label %bb3.i.i.i88, label %decide.exit.i.i<br>
-<br>
-bb3.i.i.i88:           ; preds = %bb2.i.i.i87<br>
-  br i1 false, label %bb4.i.i.i90, label %bb1.i23.i.i.i<br>
-<br>
-bb1.i23.i.i.i:         ; preds = %bb3.i.i.i88<br>
-  br i1 false, label %decide.exit.i.i, label %bb4.i.i.i90<br>
-<br>
-bb4.i.i.i90:           ; preds = %bb1.i23.i.i.i, %bb3.i.i.i88<br>
-  br i1 false, label %bb1.i9.i.i.i, label %bb5.i.i.i94<br>
-<br>
-bb1.i9.i.i.i:          ; preds = %bb4.i.i.i90<br>
-  br i1 false, label %bb.i.i27.i.i.i.i, label %bb1.i.i28.i.i.i.i<br>
-<br>
-bb.i.i27.i.i.i.i:              ; preds = %bb1.i9.i.i.i<br>
-  br label %int2lit.exit32.i.i.i.i<br>
-<br>
-bb1.i.i28.i.i.i.i:             ; preds = %bb1.i9.i.i.i<br>
-  br label %int2lit.exit32.i.i.i.i<br>
-<br>
-int2lit.exit32.i.i.i.i:                ; preds = %bb1.i.i28.i.i.i.i, %bb.i.i27.i.i.i.i<br>
-  br i1 false, label %bb8.i19.i.i.i, label %bb2.i.i.i.i91<br>
-<br>
-bb2.i.i.i.i91:         ; preds = %int2lit.exit32.i.i.i.i<br>
-  br label %bb4.i.i.i.i<br>
-<br>
-bb3.i.i.i.i92:         ; preds = %gcd.exit.i.i.i.i<br>
-  br label %bb4.i.i.i.i<br>
-<br>
-bb4.i.i.i.i:           ; preds = %bb3.i.i.i.i92, %bb2.i.i.i.i91<br>
-  br label %bb3.i.i13.i.i.i<br>
-<br>
-bb2.i.i12.i.i.i:               ; preds = %bb3.i.i13.i.i.i<br>
-  br label %bb3.i.i13.i.i.i<br>
-<br>
-bb3.i.i13.i.i.i:               ; preds = %bb2.i.i12.i.i.i, %bb4.i.i.i.i<br>
-  br i1 false, label %gcd.exit.i.i.i.i, label %bb2.i.i12.i.i.i<br>
-<br>
-gcd.exit.i.i.i.i:              ; preds = %bb3.i.i13.i.i.i<br>
-  br i1 false, label %bb5.i14.i.i.i.preheader, label %bb3.i.i.i.i92<br>
-<br>
-bb5.i14.i.i.i.preheader:               ; preds = %gcd.exit.i.i.i.i<br>
-  br label %bb5.i14.i.i.i<br>
-<br>
-bb5.i14.i.i.i:         ; preds = %int2lit.exit.i.i.i.i, %bb5.i14.i.i.i.preheader<br>
-  br i1 false, label %bb.i.i.i17.i.i.i, label %bb1.i.i.i18.i.i.i<br>
-<br>
-bb.i.i.i17.i.i.i:              ; preds = %bb5.i14.i.i.i<br>
-  br label %int2lit.exit.i.i.i.i<br>
-<br>
-bb1.i.i.i18.i.i.i:             ; preds = %bb5.i14.i.i.i<br>
-  br label %int2lit.exit.i.i.i.i<br>
-<br>
-int2lit.exit.i.i.i.i:          ; preds = %bb1.i.i.i18.i.i.i, %bb.i.i.i17.i.i.i<br>
-  br i1 false, label %bb8.i19.i.i.i.loopexit, label %bb5.i14.i.i.i<br>
-<br>
-bb8.i19.i.i.i.loopexit:                ; preds = %int2lit.exit.i.i.i.i<br>
-  br label %bb8.i19.i.i.i<br>
-<br>
-bb8.i19.i.i.i:         ; preds = %bb8.i19.i.i.i.loopexit, %int2lit.exit32.i.i.i.i<br>
-  br i1 false, label %bb5.i.i.i94, label %bb6.i.i.i95<br>
-<br>
-bb5.i.i.i94:           ; preds = %bb8.i19.i.i.i, %bb4.i.i.i90<br>
-  br label %bb.i2.i.i.i<br>
-<br>
-bb.i2.i.i.i:           ; preds = %hpop.exit.i.i.i.i, %bb5.i.i.i94<br>
-  br i1 false, label %hpop.exit.i.i.i.i, label %bb1.i.i.i.i.i<br>
-<br>
-bb1.i.i.i.i.i:         ; preds = %bb.i2.i.i.i<br>
-  br label %bb2.i.i.i.i.i<br>
-<br>
-bb2.i.i.i.i.i:         ; preds = %bb11.i.i.i.i.i, %bb1.i.i.i.i.i<br>
-  br i1 false, label %bb3.i.i.i.i.i, label %bb12.i.i.i.i.i<br>
-<br>
-bb3.i.i.i.i.i:         ; preds = %bb2.i.i.i.i.i<br>
-  br i1 false, label %bb4.i.i.i.i.i, label %bb1.i.i.i.i.i.i<br>
-<br>
-bb1.i.i.i.i.i.i:               ; preds = %bb3.i.i.i.i.i<br>
-  br i1 false, label %bb8.i.i.i.i.i, label %bb3.i.i.i.i.i.i<br>
-<br>
-bb3.i.i.i.i.i.i:               ; preds = %bb1.i.i.i.i.i.i<br>
-  br i1 false, label %bb4.i.i.i.i.i, label %bb8.i.i.i.i.i<br>
-<br>
-bb4.i.i.i.i.i:         ; preds = %bb3.i.i.i.i.i.i, %bb3.i.i.i.i.i<br>
-  br i1 false, label %bb5.i.i.i.i.i, label %bb11.i.i.i.i.i<br>
-<br>
-bb5.i.i.i.i.i:         ; preds = %bb4.i.i.i.i.i<br>
-  br i1 false, label %bb6.i.i.i.i.i, label %bb1.i21.i.i.i.i.i<br>
-<br>
-bb1.i21.i.i.i.i.i:             ; preds = %bb5.i.i.i.i.i<br>
-  br i1 false, label %bb11.i.i.i.i.i, label %bb3.i24.i.i.i.i.i<br>
-<br>
-bb3.i24.i.i.i.i.i:             ; preds = %bb1.i21.i.i.i.i.i<br>
-  br i1 false, label %bb6.i.i.i.i.i, label %bb11.i.i.i.i.i<br>
-<br>
-bb6.i.i.i.i.i:         ; preds = %bb3.i24.i.i.i.i.i, %bb5.i.i.i.i.i<br>
-  br label %bb11.i.i.i.i.i<br>
-<br>
-bb8.i.i.i.i.i:         ; preds = %bb3.i.i.i.i.i.i, %bb1.i.i.i.i.i.i<br>
-  br i1 false, label %bb9.i.i.i.i.i, label %bb12.i.i.i.i.i<br>
-<br>
-bb9.i.i.i.i.i:         ; preds = %bb8.i.i.i.i.i<br>
-  br i1 false, label %bb11.i.i.i.i.i, label %bb1.i8.i.i.i.i.i<br>
-<br>
-bb1.i8.i.i.i.i.i:              ; preds = %bb9.i.i.i.i.i<br>
-  br i1 false, label %bb12.i.i.i.i.i, label %bb3.i11.i.i.i.i.i<br>
-<br>
-bb3.i11.i.i.i.i.i:             ; preds = %bb1.i8.i.i.i.i.i<br>
-  br i1 false, label %bb11.i.i.i.i.i, label %bb12.i.i.i.i.i<br>
-<br>
-bb11.i.i.i.i.i:                ; preds = %bb3.i11.i.i.i.i.i, %bb9.i.i.i.i.i, %bb6.i.i.i.i.i, %bb3.i24.i.i.i.i.i, %bb1.i21.i.i.i.i.i, %bb4.i.i.i.i.i<br>
-  br label %bb2.i.i.i.i.i<br>
-<br>
-bb12.i.i.i.i.i:                ; preds = %bb3.i11.i.i.i.i.i, %bb1.i8.i.i.i.i.i, %bb8.i.i.i.i.i, %bb2.i.i.i.i.i<br>
-  br label %hpop.exit.i.i.i.i<br>
-<br>
-hpop.exit.i.i.i.i:             ; preds = %bb12.i.i.i.i.i, %bb.i2.i.i.i<br>
-  br i1 false, label %sdecide.exit.i.i.i, label %bb.i2.i.i.i<br>
-<br>
-sdecide.exit.i.i.i:            ; preds = %hpop.exit.i.i.i.i<br>
-  br label %bb6.i.i.i95<br>
-<br>
-bb6.i.i.i95:           ; preds = %sdecide.exit.i.i.i, %bb8.i19.i.i.i, %bb8.i.i.i.i<br>
-  br label %decide.exit.i.i<br>
-<br>
-decide.exit.i.i:               ; preds = %bb6.i.i.i95, %bb1.i23.i.i.i, %bb2.i.i.i87<br>
-  br i1 false, label %bb42.i.i, label %sat.exit.i.loopexit.loopexit2<br>
-<br>
-bb42.i.i:              ; preds = %decide.exit.i.i<br>
-  br label %bb13.i.i71.outer<br>
-<br>
-sat.exit.i.loopexit.loopexit:          ; preds = %bb24.i.i, %bb1.i68.i.i, %incincs.exit.i.i<br>
-  br label %sat.exit.i.loopexit<br>
-<br>
-sat.exit.i.loopexit.loopexit2:         ; preds = %decide.exit.i.i, %bb1.i48.i.i, %bb29.i.i<br>
-  br label %sat.exit.i.loopexit<br>
-<br>
-sat.exit.i.loopexit:           ; preds = %sat.exit.i.loopexit.loopexit2, %sat.exit.i.loopexit.loopexit<br>
-  br label %sat.exit.i<br>
-<br>
-sat.exit.i:            ; preds = %sat.exit.i.loopexit, %bb1.i61.i.i, %bb8.i.i67, %bb1.i.i.i63, %bb3.i.i59<br>
-  br i1 false, label %bb7.i, label %bb2.i96<br>
-<br>
-bb2.i96:               ; preds = %sat.exit.i<br>
-  switch i32 0, label %bb5.i99 [<br>
-  i32 10, label %bb4.i98<br>
-  i32 20, label %bb6.i100<br>
-  ]<br>
-<br>
-bb4.i98:               ; preds = %bb2.i96<br>
-  br label %bb6.i100<br>
-<br>
-bb5.i99:               ; preds = %bb2.i96<br>
-  br label %bb6.i100<br>
-<br>
-bb6.i100:              ; preds = %bb5.i99, %bb4.i98, %bb2.i96<br>
-  br label %bb7.i<br>
-<br>
-bb7.i:         ; preds = %bb6.i100, %sat.exit.i<br>
-  br i1 false, label %bb.i1.i, label %picosat_sat.exit<br>
-<br>
-bb.i1.i:               ; preds = %bb7.i<br>
-  br label %picosat_sat.exit<br>
-<br>
-picosat_sat.exit:              ; preds = %bb.i1.i, %bb7.i<br>
-  switch i32 0, label %bb166 [<br>
-  i32 20, label %bb150<br>
-  i32 10, label %bb163<br>
-  ]<br>
-<br>
-bb150:         ; preds = %picosat_sat.exit<br>
-  br i1 false, label %bb152, label %bb151<br>
-<br>
-bb151:         ; preds = %bb150<br>
-  br label %bb152<br>
-<br>
-bb152:         ; preds = %bb151, %bb150<br>
-  br i1 false, label %bb154, label %bb153<br>
-<br>
-bb153:         ; preds = %bb152<br>
-  br label %bb154<br>
-<br>
-bb154:         ; preds = %bb153, %bb152<br>
-  br i1 false, label %bb157, label %bb156<br>
-<br>
-bb156:         ; preds = %bb154<br>
-  br label %bb157<br>
-<br>
-bb157:         ; preds = %bb156, %bb154<br>
-  br i1 false, label %bb159, label %bb158<br>
-<br>
-bb158:         ; preds = %bb157<br>
-  br label %bb159<br>
-<br>
-bb159:         ; preds = %bb158, %bb157<br>
-  br i1 false, label %bb167, label %bb160<br>
-<br>
-bb160:         ; preds = %bb159<br>
-  br label %bb167<br>
-<br>
-bb163:         ; preds = %picosat_sat.exit<br>
-  br i1 false, label %bb167, label %bb164<br>
-<br>
-bb164:         ; preds = %bb163<br>
-  br label %bb4.i<br>
-<br>
-bb.i11:                ; preds = %bb4.i<br>
-  br i1 false, label %bb.i.i12, label %bb1.i.i14<br>
-<br>
-bb.i.i12:              ; preds = %bb.i11<br>
-  unreachable<br>
-<br>
-bb1.i.i14:             ; preds = %bb.i11<br>
-  br i1 false, label %bb3.i.i16, label %bb2.i.i15<br>
-<br>
-bb2.i.i15:             ; preds = %bb1.i.i14<br>
-  unreachable<br>
-<br>
-bb3.i.i16:             ; preds = %bb1.i.i14<br>
-  br i1 false, label %bb3.i, label %bb7.i.i<br>
-<br>
-bb7.i.i:               ; preds = %bb3.i.i16<br>
-  br i1 false, label %bb.i.i.i.i17, label %bb1.i.i.i.i18<br>
-<br>
-bb.i.i.i.i17:          ; preds = %bb7.i.i<br>
-  br label %int2lit.exit.i.i<br>
-<br>
-bb1.i.i.i.i18:         ; preds = %bb7.i.i<br>
-  br label %int2lit.exit.i.i<br>
-<br>
-int2lit.exit.i.i:              ; preds = %bb1.i.i.i.i18, %bb.i.i.i.i17<br>
-  br i1 false, label %bb3.i, label %bb9.i.i<br>
-<br>
-bb9.i.i:               ; preds = %int2lit.exit.i.i<br>
-  br label %bb3.i<br>
-<br>
-bb3.i:         ; preds = %bb9.i.i, %int2lit.exit.i.i, %bb3.i.i16<br>
-  br label %bb4.i<br>
-<br>
-bb4.i:         ; preds = %bb3.i, %bb164<br>
-  br i1 false, label %bb5.i, label %bb.i11<br>
-<br>
-bb5.i:         ; preds = %bb4.i<br>
-  br i1 false, label %bb6.i, label %bb167<br>
-<br>
-bb6.i:         ; preds = %bb5.i<br>
-  br label %bb167<br>
-<br>
-bb166:         ; preds = %picosat_sat.exit<br>
-  br label %bb167<br>
-<br>
-bb167:         ; preds = %bb166, %bb6.i, %bb5.i, %bb163, %bb160, %bb159, %picosat_print.exit<br>
-  br i1 false, label %bb168, label %bb170<br>
-<br>
-bb168:         ; preds = %bb167<br>
-  br i1 false, label %bb170, label %bb169<br>
-<br>
-bb169:         ; preds = %bb168<br>
-  br i1 false, label %bb.i7, label %picosat_time_stamp.exit9<br>
-<br>
-bb.i7:         ; preds = %bb169<br>
-  br label %picosat_time_stamp.exit9<br>
-<br>
-picosat_time_stamp.exit9:              ; preds = %bb.i7, %bb169<br>
-  br label %bb170<br>
-<br>
-bb170:         ; preds = %picosat_time_stamp.exit9, %bb168, %bb167, %bb129<br>
-  br i1 false, label %bb.i.i3, label %picosat_leave.exit<br>
-<br>
-bb.i.i3:               ; preds = %bb170<br>
-  br label %picosat_leave.exit<br>
-<br>
-picosat_leave.exit:            ; preds = %bb.i.i3, %bb170<br>
-  br i1 false, label %bb1.i.i, label %bb.i.i<br>
-<br>
-bb.i.i:                ; preds = %picosat_leave.exit<br>
-  unreachable<br>
-<br>
-bb1.i.i:               ; preds = %picosat_leave.exit<br>
-  br label %bb9.i.i.i<br>
-<br>
-bb3.i.i.i:             ; preds = %bb9.i.i.i<br>
-  br i1 false, label %bb5.i.i.i, label %bb4.i.i.i<br>
-<br>
-bb4.i.i.i:             ; preds = %bb3.i.i.i<br>
-  br label %bb5.i.i.i<br>
-<br>
-bb5.i.i.i:             ; preds = %bb4.i.i.i, %bb3.i.i.i<br>
-  br label %bb9.i.i.i<br>
-<br>
-bb9.i.i.i:             ; preds = %bb5.i.i.i, %bb1.i.i<br>
-  br i1 false, label %bb10.i.i.i, label %bb3.i.i.i<br>
-<br>
-bb10.i.i.i:            ; preds = %bb9.i.i.i<br>
-  br i1 false, label %delete.exit.i.i.i, label %bb1.i.i.i.i<br>
-<br>
-bb1.i.i.i.i:           ; preds = %bb10.i.i.i<br>
-  br label %delete.exit.i.i.i<br>
-<br>
-delete.exit.i.i.i:             ; preds = %bb1.i.i.i.i, %bb10.i.i.i<br>
-  br i1 false, label %delete_clauses.exit.i.i, label %bb1.i7.i.i.i<br>
-<br>
-bb1.i7.i.i.i:          ; preds = %delete.exit.i.i.i<br>
-  br label %delete_clauses.exit.i.i<br>
-<br>
-delete_clauses.exit.i.i:               ; preds = %bb1.i7.i.i.i, %delete.exit.i.i.i<br>
-  br label %bb3.i.i<br>
-<br>
-bb2.i.i:               ; preds = %bb3.i.i<br>
-  br i1 false, label %lrelease.exit.i.i, label %bb1.i.i23.i.i<br>
-<br>
-bb1.i.i23.i.i:         ; preds = %bb2.i.i<br>
-  br label %lrelease.exit.i.i<br>
-<br>
-lrelease.exit.i.i:             ; preds = %bb1.i.i23.i.i, %bb2.i.i<br>
-  br label %bb3.i.i<br>
-<br>
-bb3.i.i:               ; preds = %lrelease.exit.i.i, %delete_clauses.exit.i.i<br>
-  br i1 false, label %bb4.i.i, label %bb2.i.i<br>
-<br>
-bb4.i.i:               ; preds = %bb3.i.i<br>
-  br i1 false, label %delete.exit214.i.i, label %bb1.i208.i.i<br>
-<br>
-bb1.i208.i.i:          ; preds = %bb4.i.i<br>
-  br label %delete.exit214.i.i<br>
-<br>
-delete.exit214.i.i:            ; preds = %bb1.i208.i.i, %bb4.i.i<br>
-  br i1 false, label %delete.exit203.i.i, label %bb1.i197.i.i<br>
-<br>
-bb1.i197.i.i:          ; preds = %delete.exit214.i.i<br>
-  br label %delete.exit203.i.i<br>
-<br>
-delete.exit203.i.i:            ; preds = %bb1.i197.i.i, %delete.exit214.i.i<br>
-  br i1 false, label %delete.exit192.i.i, label %bb1.i186.i.i<br>
-<br>
-bb1.i186.i.i:          ; preds = %delete.exit203.i.i<br>
-  br label %delete.exit192.i.i<br>
-<br>
-delete.exit192.i.i:            ; preds = %bb1.i186.i.i, %delete.exit203.i.i<br>
-  br i1 false, label %delete.exit181.i.i, label %bb1.i175.i.i<br>
-<br>
-bb1.i175.i.i:          ; preds = %delete.exit192.i.i<br>
-  br label %delete.exit181.i.i<br>
-<br>
-delete.exit181.i.i:            ; preds = %bb1.i175.i.i, %delete.exit192.i.i<br>
-  br i1 false, label %delete.exit170.i.i, label %bb1.i164.i.i<br>
-<br>
-bb1.i164.i.i:          ; preds = %delete.exit181.i.i<br>
-  br label %delete.exit170.i.i<br>
-<br>
-delete.exit170.i.i:            ; preds = %bb1.i164.i.i, %delete.exit181.i.i<br>
-  br i1 false, label %delete.exit159.i.i, label %bb1.i153.i.i<br>
-<br>
-bb1.i153.i.i:          ; preds = %delete.exit170.i.i<br>
-  br label %delete.exit159.i.i<br>
-<br>
-delete.exit159.i.i:            ; preds = %bb1.i153.i.i, %delete.exit170.i.i<br>
-  br i1 false, label %delete.exit148.i.i, label %bb1.i142.i.i<br>
-<br>
-bb1.i142.i.i:          ; preds = %delete.exit159.i.i<br>
-  br label %delete.exit148.i.i<br>
-<br>
-delete.exit148.i.i:            ; preds = %bb1.i142.i.i, %delete.exit159.i.i<br>
-  br i1 false, label %delete.exit137.i.i, label %bb1.i131.i.i<br>
-<br>
-bb1.i131.i.i:          ; preds = %delete.exit148.i.i<br>
-  br label %delete.exit137.i.i<br>
-<br>
-delete.exit137.i.i:            ; preds = %bb1.i131.i.i, %delete.exit148.i.i<br>
-  br i1 false, label %delete.exit126.i.i, label %bb1.i120.i.i<br>
-<br>
-bb1.i120.i.i:          ; preds = %delete.exit137.i.i<br>
-  br label %delete.exit126.i.i<br>
-<br>
-delete.exit126.i.i:            ; preds = %bb1.i120.i.i, %delete.exit137.i.i<br>
-  br i1 false, label %delete.exit115.i.i, label %bb1.i109.i.i<br>
-<br>
-bb1.i109.i.i:          ; preds = %delete.exit126.i.i<br>
-  br label %delete.exit115.i.i<br>
-<br>
-delete.exit115.i.i:            ; preds = %bb1.i109.i.i, %delete.exit126.i.i<br>
-  br i1 false, label %delete.exit104.i.i, label %bb1.i98.i.i<br>
-<br>
-bb1.i98.i.i:           ; preds = %delete.exit115.i.i<br>
-  br label %delete.exit104.i.i<br>
-<br>
-delete.exit104.i.i:            ; preds = %bb1.i98.i.i, %delete.exit115.i.i<br>
-  br i1 false, label %delete.exit93.i.i, label %bb1.i87.i.i<br>
-<br>
-bb1.i87.i.i:           ; preds = %delete.exit104.i.i<br>
-  br label %delete.exit93.i.i<br>
-<br>
-delete.exit93.i.i:             ; preds = %bb1.i87.i.i, %delete.exit104.i.i<br>
-  br i1 false, label %delete.exit82.i.i, label %bb1.i76.i.i<br>
-<br>
-bb1.i76.i.i:           ; preds = %delete.exit93.i.i<br>
-  br label %delete.exit82.i.i<br>
-<br>
-delete.exit82.i.i:             ; preds = %bb1.i76.i.i, %delete.exit93.i.i<br>
-  br i1 false, label %delete.exit71.i.i, label %bb1.i65.i.i<br>
-<br>
-bb1.i65.i.i:           ; preds = %delete.exit82.i.i<br>
-  br label %delete.exit71.i.i<br>
-<br>
-delete.exit71.i.i:             ; preds = %bb1.i65.i.i, %delete.exit82.i.i<br>
-  br i1 false, label %delete.exit60.i.i, label %bb1.i54.i.i<br>
-<br>
-bb1.i54.i.i:           ; preds = %delete.exit71.i.i<br>
-  br label %delete.exit60.i.i<br>
-<br>
-delete.exit60.i.i:             ; preds = %bb1.i54.i.i, %delete.exit71.i.i<br>
-  br i1 false, label %delete.exit38.i.i, label %bb1.i32.i.i<br>
-<br>
-bb1.i32.i.i:           ; preds = %delete.exit60.i.i<br>
-  br label %delete.exit38.i.i<br>
-<br>
-delete.exit38.i.i:             ; preds = %bb1.i32.i.i, %delete.exit60.i.i<br>
-  br i1 false, label %delete.exit18.i.i, label %bb1.i12.i.i<br>
-<br>
-bb1.i12.i.i:           ; preds = %delete.exit38.i.i<br>
-  br label %delete.exit18.i.i<br>
-<br>
-delete.exit18.i.i:             ; preds = %bb1.i12.i.i, %delete.exit38.i.i<br>
-  br i1 false, label %picosat_reset.exit, label %bb1.i2.i.i<br>
-<br>
-bb1.i2.i.i:            ; preds = %delete.exit18.i.i<br>
-  br label %picosat_reset.exit<br>
-<br>
-picosat_reset.exit:            ; preds = %bb1.i2.i.i, %delete.exit18.i.i<br>
-  br label %bb171<br>
-<br>
-bb171:         ; preds = %picosat_reset.exit, %bb110<br>
-  br i1 false, label %bb173, label %bb172<br>
-<br>
-bb172:         ; preds = %bb171<br>
-  br label %bb173<br>
-<br>
-bb173:         ; preds = %bb172, %bb171<br>
-  br i1 false, label %bb175, label %bb174<br>
-<br>
-bb174:         ; preds = %bb173<br>
-  br label %bb175<br>
-<br>
-bb175:         ; preds = %bb174, %bb173<br>
-  br i1 false, label %bb177, label %bb176<br>
-<br>
-bb176:         ; preds = %bb175<br>
-  br label %bb177<br>
-<br>
-bb177:         ; preds = %bb176, %bb175<br>
-  br i1 false, label %bb179, label %bb178<br>
-<br>
-bb178:         ; preds = %bb177<br>
-  ret i32 0<br>
-<br>
-bb179:         ; preds = %bb177<br>
-  ret i32 0<br>
-}<br>
-<br>
-define i32 @main(i32 %argc, i8** %argv) nounwind {<br>
-entry:<br>
-  br label %bb2<br>
-<br>
-bb:            ; preds = %bb2<br>
-  br i1 false, label %bb3, label %bb2<br>
-<br>
-bb2:           ; preds = %bb, %entry<br>
-  br i1 false, label %bb5.loopexit, label %bb<br>
-<br>
-bb3:           ; preds = %bb<br>
-  br i1 false, label %bb5, label %bb4<br>
-<br>
-bb4:           ; preds = %bb3<br>
-  br label %bb5<br>
-<br>
-bb5.loopexit:          ; preds = %bb2<br>
-  br label %bb5<br>
-<br>
-bb5:           ; preds = %bb5.loopexit, %bb4, %bb3<br>
-  %0 = call fastcc i32 @picosat_main(i32 %argc, i8** %argv) nounwind           ; <i32> [#uses=2]<br>
-  br i1 false, label %bb7, label %bb6<br>
-<br>
-bb6:           ; preds = %bb5<br>
-  ret i32 %0<br>
-<br>
-bb7:           ; preds = %bb5<br>
-  ret i32 %0<br>
-}<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll<br>
index b2bca62068a3..50bfcce5a3af 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr32917.ll<br>
@@ -1,17 +1,27 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR 32917<br>
<br>
 @b = common local_unnamed_addr global i32 0, align 4<br>
 @a = common local_unnamed_addr global i32 0, align 4<br>
<br>
 define i32 @fn2() local_unnamed_addr {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn2() local_unnamed_addr<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = sext i32 [[TMP1]] to i64<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32*<br>
-; CHECK-NEXT:    call fastcc void @fn1(i32* nofree readonly align 4 [[TMP3]])<br>
-; CHECK-NEXT:    ret i32 undef<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@fn2() local_unnamed_addr<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4<br>
+; IS__TUNIT____-NEXT:    [[TMP2:%.*]] = sext i32 [[TMP1]] to i64<br>
+; IS__TUNIT____-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32*<br>
+; IS__TUNIT____-NEXT:    call fastcc void @fn1(i32* nofree readonly align 4 [[TMP3]])<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@fn2() local_unnamed_addr<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* @b, align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = sext i32 [[TMP1]] to i64<br>
+; IS__CGSCC____-NEXT:    [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to i32*<br>
+; IS__CGSCC____-NEXT:    call fastcc void @fn1(i32* nofree nonnull readonly align 4 [[TMP3]])<br>
+; IS__CGSCC____-NEXT:    ret i32 undef<br>
 ;<br>
   %1 = load i32, i32* @b, align 4<br>
   %2 = sext i32 %1 to i64<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll<br>
index de67b8970c23..fff94d452e00 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/pr33641_remove_arg_dbgvalue.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Fix for PR33641. ArgumentPromotion removed the argument to bar but left the call to<br>
 ; dbg.value which still used the removed argument.<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/profile.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/profile.ll<br>
index b9b10cf86005..1f50e1f9e5b1 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/profile.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/profile.ll<br>
@@ -1,16 +1,31 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 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"<br>
<br>
 ; Checks if !prof metadata is corret in deadargelim.<br>
<br>
 define void @caller() #0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller()<br>
-; CHECK-NEXT:    [[X:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 42, i32* [[X]], align 4<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[X]], align 1<br>
-; CHECK-NEXT:    call void @promote_i32_ptr(i32 [[TMP1]]), !prof !0<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@caller()<br>
+; IS__TUNIT_OPM-NEXT:    [[X:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    store i32 42, i32* [[X]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    call void @promote_i32_ptr(i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[X]]), !prof !0<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@caller()<br>
+; IS__TUNIT_NPM-NEXT:    [[X:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 42, i32* [[X]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[X]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call void @promote_i32_ptr(i32 [[TMP1]]), !prof !0<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller()<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    store i32 42, i32* [[X]], align 4<br>
+; IS__CGSCC____-NEXT:    call void @promote_i32_ptr(i32* noalias nonnull readonly align 4 dereferenceable(4) [[X]]), !prof !0<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %x = alloca i32<br>
   store i32 42, i32* %x<br>
@@ -19,13 +34,25 @@ define void @caller() #0 {<br>
 }<br>
<br>
 define internal void @promote_i32_ptr(i32* %xp) {<br>
-; CHECK-LABEL: define {{[^@]+}}@promote_i32_ptr<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]])<br>
-; CHECK-NEXT:    [[XP_PRIV:%.*]] = alloca i32<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[XP_PRIV]]<br>
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[XP_PRIV]], align 4<br>
-; CHECK-NEXT:    call void @use_i32(i32 [[X]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@promote_i32_ptr<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[XP:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[X:%.*]] = load i32, i32* [[XP]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    call void @use_i32(i32 [[X]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@promote_i32_ptr<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[XP_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[XP_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[X:%.*]] = load i32, i32* [[XP_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    call void @use_i32(i32 [[X]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@promote_i32_ptr<br>
+; IS__CGSCC____-SAME: (i32* nocapture nonnull readonly align 4 dereferenceable(4) [[XP:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = load i32, i32* [[XP]], align 4<br>
+; IS__CGSCC____-NEXT:    call void @use_i32(i32 [[X]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %x = load i32, i32* %xp<br>
   call void @use_i32(i32 %x)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll<br>
index d8d582b12563..dbceea83a4fe 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/reserve-tbaa.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; PR17906<br>
 ; When we promote two arguments in a single function with <br>
diff erent types,<br>
@@ -14,13 +17,20 @@<br>
 @d = global i8 0, align 1<br>
<br>
 define internal fastcc void @fn(i32* nocapture readonly %p1, i64* nocapture readonly %p2) {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn<br>
-; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P1:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* @g, align 4, !tbaa !0<br>
-; CHECK-NEXT:    [[CONV1:%.*]] = trunc i32 [[TMP0]] to i8<br>
-; CHECK-NEXT:    store i8 [[CONV1]], i8* @d, align 1, !tbaa !4<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@fn<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P1:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* @g, align 4, !tbaa !0<br>
+; IS__TUNIT____-NEXT:    [[CONV1:%.*]] = trunc i32 [[TMP0]] to i8<br>
+; IS__TUNIT____-NEXT:    store i8 [[CONV1]], i8* @d, align 1, !tbaa !4<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@fn()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* @g, align 4, !tbaa !0<br>
+; IS__CGSCC____-NEXT:    [[CONV1:%.*]] = trunc i32 [[TMP0]] to i8<br>
+; IS__CGSCC____-NEXT:    store i8 [[CONV1]], i8* @d, align 1, !tbaa !4<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %0 = load i64, i64* %p2, align 8, !tbaa !1<br>
@@ -32,14 +42,23 @@ entry:<br>
 }<br>
<br>
 define i32 @main() {<br>
-; CHECK-LABEL: define {{[^@]+}}@main()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32**, i32*** @e, align 8, !tbaa !5<br>
-; CHECK-NEXT:    store i32* @g, i32** [[TMP0]], align 8, !tbaa !5<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32*, i32** @a, align 8, !tbaa !5<br>
-; CHECK-NEXT:    store i32 1, i32* [[TMP1]], align 4, !tbaa !0<br>
-; CHECK-NEXT:    call fastcc void @fn(i32* nofree nonnull readonly align 4 dereferenceable(4) @g)<br>
-; CHECK-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@main()<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32**, i32*** @e, align 8, !tbaa !5<br>
+; IS__TUNIT____-NEXT:    store i32* @g, i32** [[TMP0]], align 8, !tbaa !5<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32*, i32** @a, align 8, !tbaa !5<br>
+; IS__TUNIT____-NEXT:    store i32 1, i32* [[TMP1]], align 4, !tbaa !0<br>
+; IS__TUNIT____-NEXT:    call fastcc void @fn(i32* nofree nonnull readonly align 4 dereferenceable(4) @g)<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32**, i32*** @e, align 8, !tbaa !5<br>
+; IS__CGSCC____-NEXT:    store i32* @g, i32** [[TMP0]], align 8, !tbaa !5<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32*, i32** @a, align 8, !tbaa !5<br>
+; IS__CGSCC____-NEXT:    store i32 1, i32* [[TMP1]], align 4, !tbaa !0<br>
+; IS__CGSCC____-NEXT:    call fastcc void @fn()<br>
+; IS__CGSCC____-NEXT:    ret i32 0<br>
 ;<br>
 entry:<br>
   %0 = load i32**, i32*** @e, align 8, !tbaa !8<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll<br>
index 5e3e9881c509..d1d2c556b971 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/sret.ll<br>
@@ -1,19 +1,43 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-pc-windows-msvc"<br>
<br>
 define internal void @add({i32, i32}* %this, i32* sret %r) {<br>
-; CHECK-LABEL: define {{[^@]+}}@add<br>
-; CHECK-SAME: ({ i32, i32 }* noalias nocapture nofree nonnull readonly align 8 dereferenceable(8) [[THIS:%.*]], i32* noalias nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R:%.*]])<br>
-; CHECK-NEXT:    [[AP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 0<br>
-; CHECK-NEXT:    [[BP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[A:%.*]] = load i32, i32* [[AP]], align 8<br>
-; CHECK-NEXT:    [[B:%.*]] = load i32, i32* [[BP]], align 4<br>
-; CHECK-NEXT:    [[AB:%.*]] = add i32 [[A]], [[B]]<br>
-; CHECK-NEXT:    store i32 [[AB]], i32* [[R]], align 4<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@add<br>
+; IS__TUNIT_OPM-SAME: ({ i32, i32 }* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[THIS:%.*]], i32* nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[AP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[BP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = load i32, i32* [[AP]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = load i32, i32* [[BP]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[AB:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[AB]], i32* [[R]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@add<br>
+; IS__TUNIT_NPM-SAME: ({ i32, i32 }* noalias nocapture nofree nonnull readonly align 8 dereferenceable(8) [[THIS:%.*]], i32* noalias nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[AP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    [[BP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = load i32, i32* [[AP]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = load i32, i32* [[BP]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[AB:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[AB]], i32* [[R]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@add<br>
+; IS__CGSCC____-SAME: ({ i32, i32 }* nocapture nofree nonnull readonly align 4 dereferenceable(8) [[THIS:%.*]], i32* nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[AP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[BP:%.*]] = getelementptr { i32, i32 }, { i32, i32 }* [[THIS]], i32 0, i32 1<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = load i32, i32* [[AP]], align 4<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = load i32, i32* [[BP]], align 4<br>
+; IS__CGSCC____-NEXT:    [[AB:%.*]] = add i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    store i32 [[AB]], i32* [[R]], align 4<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %ap = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 0<br>
   %bp = getelementptr {i32, i32}, {i32, i32}* %this, i32 0, i32 1<br>
@@ -25,11 +49,29 @@ define internal void @add({i32, i32}* %this, i32* sret %r) {<br>
 }<br>
<br>
 define void @f() {<br>
-; CHECK-LABEL: define {{[^@]+}}@f()<br>
-; CHECK-NEXT:    [[R:%.*]] = alloca i32<br>
-; CHECK-NEXT:    [[PAIR:%.*]] = alloca { i32, i32 }<br>
-; CHECK-NEXT:    call void @add({ i32, i32 }* noalias nocapture nofree nonnull readonly align 8 dereferenceable(8) [[PAIR]], i32* noalias nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__TUNIT_OPM-NEXT:    [[R:%.*]] = alloca i32<br>
+; IS__TUNIT_OPM-NEXT:    [[PAIR:%.*]] = alloca { i32, i32 }<br>
+; IS__TUNIT_OPM-NEXT:    call void @add({ i32, i32 }* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[PAIR]], i32* nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__TUNIT_NPM-NEXT:    [[R:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    [[PAIR:%.*]] = alloca { i32, i32 }<br>
+; IS__TUNIT_NPM-NEXT:    call void @add({ i32, i32 }* noalias nocapture nofree nonnull readonly align 8 dereferenceable(8) [[PAIR]], i32* noalias nocapture nofree nonnull sret writeonly align 4 dereferenceable(4) [[R]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__CGSCC_OPM-NEXT:    [[R:%.*]] = alloca i32<br>
+; IS__CGSCC_OPM-NEXT:    [[PAIR:%.*]] = alloca { i32, i32 }<br>
+; IS__CGSCC_OPM-NEXT:    call void @add({ i32, i32 }* nofree nonnull readonly align 8 dereferenceable(8) [[PAIR]], i32* nofree nonnull sret writeonly align 4 dereferenceable(4) [[R]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@f()<br>
+; IS__CGSCC_NPM-NEXT:    [[R:%.*]] = alloca i32<br>
+; IS__CGSCC_NPM-NEXT:    [[PAIR:%.*]] = alloca { i32, i32 }<br>
+; IS__CGSCC_NPM-NEXT:    call void @add({ i32, i32 }* noalias nofree nonnull readonly align 8 dereferenceable(8) [[PAIR]], i32* noalias nofree nonnull sret writeonly align 4 dereferenceable(4) [[R]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
   %r = alloca i32<br>
   %pair = alloca {i32, i32}<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll<br>
index 6141c5f3073b..7502ae651c4f 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/tail.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR14710<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
@@ -9,29 +12,48 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 declare i8* @foo(%pair*)<br>
<br>
 define internal void @bar(%pair* byval %Data) {<br>
-; CHECK-LABEL: define {{[^@]+}}@bar<br>
-; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; CHECK-NEXT:    [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]]<br>
-; CHECK-NEXT:    [[DATA_PRIV_CAST:%.*]] = bitcast %pair* [[DATA_PRIV]] to i32*<br>
-; CHECK-NEXT:    store i32 [[TMP0]], i32* [[DATA_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[DATA_PRIV_0_1:%.*]] = getelementptr [[PAIR]], %pair* [[DATA_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i32 [[TMP1]], i32* [[DATA_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = call i8* @foo(%pair* [[DATA_PRIV]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS________OPM-LABEL: define {{[^@]+}}@bar<br>
+; IS________OPM-SAME: (%pair* noalias byval [[DATA:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call i8* @foo(%pair* [[DATA]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@bar<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS________NPM-NEXT:    [[DATA_PRIV:%.*]] = alloca [[PAIR:%.*]]<br>
+; IS________NPM-NEXT:    [[DATA_PRIV_CAST:%.*]] = bitcast %pair* [[DATA_PRIV]] to i32*<br>
+; IS________NPM-NEXT:    store i32 [[TMP0]], i32* [[DATA_PRIV_CAST]]<br>
+; IS________NPM-NEXT:    [[DATA_PRIV_0_1:%.*]] = getelementptr [[PAIR]], %pair* [[DATA_PRIV]], i32 0, i32 1<br>
+; IS________NPM-NEXT:    store i32 [[TMP1]], i32* [[DATA_PRIV_0_1]]<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = call i8* @foo(%pair* [[DATA_PRIV]])<br>
+; IS________NPM-NEXT:    ret void<br>
 ;<br>
   tail call i8* @foo(%pair* %Data)<br>
   ret void<br>
 }<br>
<br>
 define void @zed(%pair* byval %Data) {<br>
-; CHECK-LABEL: define {{[^@]+}}@zed<br>
-; CHECK-SAME: (%pair* noalias nocapture readonly byval [[DATA:%.*]])<br>
-; CHECK-NEXT:    [[DATA_CAST:%.*]] = bitcast %pair* [[DATA]] to i32*<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DATA_CAST]], align 1<br>
-; CHECK-NEXT:    [[DATA_0_1:%.*]] = getelementptr [[PAIR:%.*]], %pair* [[DATA]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DATA_0_1]], align 1<br>
-; CHECK-NEXT:    call void @bar(i32 [[TMP1]], i32 [[TMP2]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS________OPM-LABEL: define {{[^@]+}}@zed<br>
+; IS________OPM-SAME: (%pair* noalias nocapture readonly byval [[DATA:%.*]])<br>
+; IS________OPM-NEXT:    call void @bar(%pair* noalias nocapture readonly byval [[DATA]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@zed<br>
+; IS__TUNIT_NPM-SAME: (%pair* noalias nocapture readonly byval [[DATA:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[DATA_CAST:%.*]] = bitcast %pair* [[DATA]] to i32*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DATA_CAST]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[DATA_0_1:%.*]] = getelementptr [[PAIR:%.*]], %pair* [[DATA]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DATA_0_1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    call void @bar(i32 [[TMP1]], i32 [[TMP2]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@zed<br>
+; IS__CGSCC_NPM-SAME: (%pair* noalias nocapture nonnull readonly byval dereferenceable(8) [[DATA:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:    [[DATA_CAST:%.*]] = bitcast %pair* [[DATA]] to i32*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[DATA_CAST]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[DATA_0_1:%.*]] = getelementptr [[PAIR:%.*]], %pair* [[DATA]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[DATA_0_1]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    call void @bar(i32 [[TMP1]], i32 [[TMP2]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
   call void @bar(%pair* byval %Data)<br>
   ret void<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/ArgumentPromotion/variadic.ll b/llvm/test/Transforms/Attributor/ArgumentPromotion/variadic.ll<br>
index b637d39a50de..694c2ef250ef 100644<br>
--- a/llvm/test/Transforms/Attributor/ArgumentPromotion/variadic.ll<br>
+++ b/llvm/test/Transforms/Attributor/ArgumentPromotion/variadic.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Unused arguments from variadic functions cannot be eliminated as that changes<br>
 ; their classiciation according to the SysV amd64 ABI. Clang and other frontends<br>
@@ -28,11 +31,17 @@ entry:<br>
<br>
 ; Function Attrs: nounwind uwtable<br>
 define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...) {<br>
-; CHECK-LABEL: define {{[^@]+}}@callee_t0f<br>
-; CHECK-SAME: (i8* noalias nocapture nofree nonnull readnone [[TP13:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP14:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP15:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP16:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP17:%.*]], ...)<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    call void @sink(i32 0)<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@callee_t0f<br>
+; IS__TUNIT____-SAME: (i8* noalias nocapture nofree nonnull readnone [[TP13:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP14:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP15:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP16:%.*]], i8* noalias nocapture nofree nonnull readnone [[TP17:%.*]], ...)<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    call void @sink(i32 0)<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callee_t0f<br>
+; IS__CGSCC____-SAME: (i8* nocapture nofree nonnull readnone [[TP13:%.*]], i8* nocapture nofree nonnull readnone [[TP14:%.*]], i8* nocapture nofree nonnull readnone [[TP15:%.*]], i8* nocapture nofree nonnull readnone [[TP16:%.*]], i8* nocapture nofree nonnull readnone [[TP17:%.*]], ...)<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    call void @sink(i32 0)<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   call void @sink(i32 0)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/2008-06-09-WeakProp.ll b/llvm/test/Transforms/Attributor/IPConstantProp/2008-06-09-WeakProp.ll<br>
index d05e3b113191..8669f0794826 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/2008-06-09-WeakProp.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/2008-06-09-WeakProp.ll<br>
@@ -1,5 +1,9 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt < %s -passes=attributor -S | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
 ; Should not propagate the result of a weak function.<br>
 ; PR2411<br>
<br>
<br>
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<br>
index 26b37d7a67eb..1b7b90d4471d 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/2009-09-24-byval-ptr.ll<br>
@@ -1,10 +1,41 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=6 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
 ; Don't constant-propagate byval pointers, since they are not pointers!<br>
 ; PR5038<br>
 %struct.MYstr = type { i8, i32 }<br>
 @mystr = internal global %struct.MYstr zeroinitializer ; <%struct.MYstr*> [#uses=3]<br>
 define internal void @vfu1(%struct.MYstr* byval align 4 %u) nounwind {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@vfu1<br>
+; IS__CGSCC_OPM-SAME: (%struct.MYstr* noalias nocapture nofree nonnull writeonly byval align 4 dereferenceable(1) [[U:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* [[U]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 99, i32* [[TMP0]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    store i8 97, i8* [[TMP1]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC_OPM:       return:<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@vfu1<br>
+; IS__CGSCC_NPM-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 99, i32* [[TMP2]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    store i8 97, i8* [[TMP3]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC_NPM:       return:<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %0 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1]<br>
   store i32 99, i32* %0, align 4<br>
@@ -17,21 +48,42 @@ return:                                           ; preds = %entry<br>
 }<br>
<br>
 define internal i32 @vfu2(%struct.MYstr* byval align 4 %u) nounwind readonly {<br>
-; CHECK-LABEL: define {{[^@]+}}@vfu2<br>
-; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
-; CHECK-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
-; CHECK-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]]<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 0<br>
-; CHECK-NEXT:    [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 8<br>
-; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32<br>
-; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP3]]<br>
-; CHECK-NEXT:    ret i32 [[TMP7]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@vfu2<br>
+; IS__TUNIT_OPM-SAME: (%struct.MYstr* noalias nocapture nofree nonnull readonly byval align 8 dereferenceable(8) [[U:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = load i8, i8* [[TMP2]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = zext i8 [[TMP3]] to i32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP1]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP5]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@vfu2<br>
+; IS__TUNIT_NPM-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP3]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[TMP7]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@vfu2()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* @mystr, i32 0, i32 0<br>
+; IS__CGSCC____-NEXT:    [[TMP3:%.*]] = load i8, i8* [[TMP2]], align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP4:%.*]] = zext i8 [[TMP3]] to i32<br>
+; IS__CGSCC____-NEXT:    [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP1]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[TMP5]]<br>
 ;<br>
 entry:<br>
   %0 = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1 ; <i32*> [#uses=1]<br>
@@ -44,14 +96,24 @@ entry:<br>
 }<br>
<br>
 define i32 @unions() nounwind {<br>
-; CHECK-LABEL: define {{[^@]+}}@unions()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[MYSTR_CAST:%.*]] = bitcast %struct.MYstr* @mystr to i8*<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i8, i8* [[MYSTR_CAST]], align 1<br>
-; CHECK-NEXT:    [[MYSTR_0_1:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[MYSTR_0_1]], align 1<br>
-; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @vfu2(i8 [[TMP0]], i32 [[TMP1]])<br>
-; CHECK-NEXT:    ret i32 [[RESULT]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@unions()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2(%struct.MYstr* nofree nonnull readonly byval align 8 dereferenceable(8) @mystr)<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[RESULT]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@unions()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[MYSTR_CAST:%.*]] = bitcast %struct.MYstr* @mystr to i8*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i8, i8* [[MYSTR_CAST]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[MYSTR_0_1:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[MYSTR_0_1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2(i8 [[TMP0]], i32 [[TMP1]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[RESULT]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@unions()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[RESULT:%.*]] = call i32 @vfu2()<br>
+; IS__CGSCC____-NEXT:    ret i32 [[RESULT]]<br>
 ;<br>
 entry:<br>
   call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind<br>
@@ -60,23 +122,67 @@ entry:<br>
 }<br>
<br>
 define internal i32 @vfu2_v2(%struct.MYstr* byval align 4 %u) nounwind readonly {<br>
-; CHECK-LABEL: define {{[^@]+}}@vfu2_v2<br>
-; CHECK-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
-; CHECK-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
-; CHECK-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
-; CHECK-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
-; CHECK-NEXT:    [[Z:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    store i32 99, i32* [[Z]], align 4<br>
-; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]]<br>
-; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 0<br>
-; CHECK-NEXT:    [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 8<br>
-; CHECK-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32<br>
-; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP3]]<br>
-; CHECK-NEXT:    ret i32 [[TMP7]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@vfu2_v2<br>
+; IS__TUNIT_OPM-SAME: (%struct.MYstr* noalias nocapture nofree nonnull byval align 8 dereferenceable(8) [[U:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[Z:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* [[U]], i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    store i32 99, i32* [[Z]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U]], i32 0, i32 1<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U]], i32 0, i32 0<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = load i8, i8* [[TMP2]], align 8<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP4:%.*]] = zext i8 [[TMP3]] to i32<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP1]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[TMP5]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@vfu2_v2<br>
+; IS__TUNIT_NPM-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
+; IS__TUNIT_NPM-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
+; IS__TUNIT_NPM-NEXT:    [[Z:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    store i32 99, i32* [[Z]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 0<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP3]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[TMP7]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@vfu2_v2<br>
+; IS__CGSCC_OPM-SAME: (%struct.MYstr* noalias nocapture nofree nonnull byval align 4 dereferenceable(1) [[U:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[Z:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* [[U]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    store i32 99, i32* [[Z]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U]], i32 0, i32 1<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[TMP0]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = load i8, i8* [[TMP2]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP4:%.*]] = zext i8 [[TMP3]] to i32<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP5:%.*]] = add i32 [[TMP4]], [[TMP1]]<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[TMP5]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@vfu2_v2<br>
+; IS__CGSCC_NPM-SAME: (i8 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV:%.*]] = alloca [[STRUCT_MYSTR:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV_CAST:%.*]] = bitcast %struct.MYstr* [[U_PRIV]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i8 [[TMP0]], i8* [[U_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[U_PRIV_0_1:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[TMP1]], i32* [[U_PRIV_0_1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[Z:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    store i32 99, i32* [[Z]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP2:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = getelementptr [[STRUCT_MYSTR]], %struct.MYstr* [[U_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP5:%.*]] = load i8, i8* [[TMP4]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP6:%.*]] = zext i8 [[TMP5]] to i32<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP7:%.*]] = add i32 [[TMP6]], [[TMP3]]<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[TMP7]]<br>
 ;<br>
 entry:<br>
   %z = getelementptr %struct.MYstr, %struct.MYstr* %u, i32 0, i32 1<br>
@@ -91,14 +197,33 @@ entry:<br>
 }<br>
<br>
 define i32 @unions_v2() nounwind {<br>
-; CHECK-LABEL: define {{[^@]+}}@unions_v2()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[MYSTR_CAST:%.*]] = bitcast %struct.MYstr* @mystr to i8*<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i8, i8* [[MYSTR_CAST]], align 1<br>
-; CHECK-NEXT:    [[MYSTR_0_1:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[MYSTR_0_1]], align 1<br>
-; CHECK-NEXT:    [[RESULT:%.*]] = call i32 @vfu2_v2(i8 [[TMP0]], i32 [[TMP1]])<br>
-; CHECK-NEXT:    ret i32 [[RESULT]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@unions_v2()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2_v2(%struct.MYstr* nofree nonnull readonly byval align 8 dereferenceable(8) @mystr)<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[RESULT]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@unions_v2()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[MYSTR_CAST:%.*]] = bitcast %struct.MYstr* @mystr to i8*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i8, i8* [[MYSTR_CAST]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[MYSTR_0_1:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[MYSTR_0_1]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2_v2(i8 [[TMP0]], i32 [[TMP1]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[RESULT]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@unions_v2()<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2_v2(%struct.MYstr* noalias nofree nonnull readnone byval align 8 dereferenceable(8) @mystr)<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 [[RESULT]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@unions_v2()<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[MYSTR_CAST1:%.*]] = bitcast %struct.MYstr* @mystr to i8*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i8, i8* [[MYSTR_CAST1]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[MYSTR_0_12:%.*]] = getelementptr [[STRUCT_MYSTR:%.*]], %struct.MYstr* @mystr, i32 0, i32 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[MYSTR_0_12]], align 1<br>
+; IS__CGSCC_NPM-NEXT:    [[RESULT:%.*]] = call i32 @vfu2_v2(i8 [[TMP0]], i32 [[TMP1]])<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[RESULT]]<br>
 ;<br>
 entry:<br>
   call void @vfu1(%struct.MYstr* byval align 4 @mystr) nounwind<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll<br>
index e53d4fa4306b..786873f8dedf 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR16052.ll<br>
@@ -1,14 +1,22 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=2 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-unknown-linux-gnu"<br>
<br>
 define i64 @fn2() {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn2()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 undef) #1, !range !0<br>
-; CHECK-NEXT:    ret i64 [[CALL2]]<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@fn2()<br>
+; NOT_TUNIT_NPM-NEXT:  entry:<br>
+; NOT_TUNIT_NPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 undef)<br>
+; NOT_TUNIT_NPM-NEXT:    ret i64 [[CALL2]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fn2()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 undef) #1, !range !0<br>
+; IS__TUNIT_NPM-NEXT:    ret i64 [[CALL2]]<br>
 ;<br>
 entry:<br>
   %conv = sext i32 undef to i64<br>
@@ -18,13 +26,21 @@ entry:<br>
 }<br>
<br>
 define i64 @fn2b(i32 %arg) {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn2b<br>
-; CHECK-SAME: (i32 [[ARG:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[CONV:%.*]] = sext i32 [[ARG]] to i64<br>
-; CHECK-NEXT:    [[DIV:%.*]] = sdiv i64 8, [[CONV]]<br>
-; CHECK-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 [[DIV]]) #1, !range !0<br>
-; CHECK-NEXT:    ret i64 [[CALL2]]<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@fn2b<br>
+; NOT_TUNIT_NPM-SAME: (i32 [[ARG:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  entry:<br>
+; NOT_TUNIT_NPM-NEXT:    [[CONV:%.*]] = sext i32 [[ARG]] to i64<br>
+; NOT_TUNIT_NPM-NEXT:    [[DIV:%.*]] = sdiv i64 8, [[CONV]]<br>
+; NOT_TUNIT_NPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 [[DIV]])<br>
+; NOT_TUNIT_NPM-NEXT:    ret i64 [[CALL2]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fn2b<br>
+; IS__TUNIT_NPM-SAME: (i32 [[ARG:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[CONV:%.*]] = sext i32 [[ARG]] to i64<br>
+; IS__TUNIT_NPM-NEXT:    [[DIV:%.*]] = sdiv i64 8, [[CONV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 [[DIV]]) #1, !range !0<br>
+; IS__TUNIT_NPM-NEXT:    ret i64 [[CALL2]]<br>
 ;<br>
 entry:<br>
   %conv = sext i32 %arg to i64<br>
@@ -34,10 +50,19 @@ entry:<br>
 }<br>
<br>
 define i64 @fn2c() {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn2c()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 42) #1, !range !0<br>
-; CHECK-NEXT:    ret i64 [[CALL2]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@fn2c()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 42)<br>
+; IS__TUNIT_OPM-NEXT:    ret i64 [[CALL2]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@fn2c()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL2:%.*]] = call i64 @fn1(i64 42) #1, !range !0<br>
+; IS__TUNIT_NPM-NEXT:    ret i64 [[CALL2]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@fn2c()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    ret i64 42<br>
 ;<br>
 entry:<br>
   %conv = sext i32 undef to i64<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll<br>
index cf77bbf78436..d4eef4c20642 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR26044.ll<br>
@@ -1,21 +1,42 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 target triple = "x86_64-unknown-linux-gnu"<br>
<br>
 define void @fn2(i32* %P, i1 %C) {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn2<br>
-; CHECK-SAME: (i32* nocapture nofree [[P:%.*]], i1 %C)<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    br label [[IF_END:%.*]]<br>
-; CHECK:       for.cond1:<br>
-; CHECK-NEXT:    br i1 %C, label %if.end, label %exit<br>
-; CHECK:       if.end:<br>
-; CHECK-NEXT:    [[E_2:%.*]] = phi i32* [ %P, %entry ], [ null, %for.cond1 ]<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_2]], align 4<br>
-; CHECK-NEXT:    [[CALL:%.*]] = call i32 @fn1(i32 [[TMP0]])<br>
-; CHECK-NEXT:    store i32 [[CALL]], i32* [[P]]<br>
-; CHECK-NEXT:    br label %for.cond1<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@fn2<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree [[P:%.*]], i1 [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    br label [[IF_END:%.*]]<br>
+; IS__TUNIT____:       for.cond1:<br>
+; IS__TUNIT____-NEXT:    br i1 [[C]], label [[IF_END]], label [[EXIT:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    [[E_2:%.*]] = phi i32* [ [[P]], [[ENTRY:%.*]] ], [ null, [[FOR_COND1:%.*]] ]<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_2]], align 4<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @fn1(i32 [[TMP0]])<br>
+; IS__TUNIT____-NEXT:    store i32 [[CALL]], i32* [[P]]<br>
+; IS__TUNIT____-NEXT:    br label [[FOR_COND1]]<br>
+; IS__TUNIT____:       exit:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@fn2<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull align 4 dereferenceable(4) [[P:%.*]], i1 [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    br label [[IF_END:%.*]]<br>
+; IS__CGSCC____:       for.cond1:<br>
+; IS__CGSCC____-NEXT:    br i1 [[C]], label [[IF_END]], label [[EXIT:%.*]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    [[E_2:%.*]] = phi i32* [ [[P]], [[ENTRY:%.*]] ], [ null, [[FOR_COND1:%.*]] ]<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[E_2]], align 4<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @fn1(i32 [[TMP0]])<br>
+; IS__CGSCC____-NEXT:    store i32 [[CALL]], i32* [[P]], align 4<br>
+; IS__CGSCC____-NEXT:    br label [[FOR_COND1]]<br>
+; IS__CGSCC____:       exit:<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   br label %if.end<br>
@@ -48,18 +69,51 @@ entry:<br>
 }<br>
<br>
 define void @fn_no_null_opt(i32* %P, i1 %C) "null-pointer-is-valid"="true" {<br>
-; CHECK-LABEL: define {{[^@]+}}@fn_no_null_opt<br>
-; CHECK-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i1 %C)<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    br label [[IF_END:%.*]]<br>
-; CHECK:       for.cond1:<br>
-; CHECK-NEXT:    br i1 %C, label %if.end, label %exit<br>
-; CHECK:       if.end:<br>
-; CHECK-NEXT:    [[E_2:%.*]] = phi i32* [ undef, %entry ], [ null, %for.cond1 ]<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* null, align 4<br>
-; CHECK-NEXT:    [[CALL:%.*]] = call i32 @fn0(i32 [[TMP0]])<br>
-; CHECK-NEXT:    store i32 [[CALL]], i32* [[P]]<br>
-; CHECK-NEXT:    br label %for.cond1<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@fn_no_null_opt<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i1 [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    br label [[IF_END:%.*]]<br>
+; IS__TUNIT____:       for.cond1:<br>
+; IS__TUNIT____-NEXT:    br i1 [[C]], label [[IF_END]], label [[EXIT:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    [[E_2:%.*]] = phi i32* [ undef, [[ENTRY:%.*]] ], [ null, [[FOR_COND1:%.*]] ]<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* null, align 4<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @fn0(i32 [[TMP0]])<br>
+; IS__TUNIT____-NEXT:    store i32 [[CALL]], i32* [[P]]<br>
+; IS__TUNIT____-NEXT:    br label [[FOR_COND1]]<br>
+; IS__TUNIT____:       exit:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@fn_no_null_opt<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture nofree writeonly align 4 dereferenceable_or_null(4) [[P:%.*]], i1 [[C:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    br label [[IF_END:%.*]]<br>
+; IS__CGSCC_OPM:       for.cond1:<br>
+; IS__CGSCC_OPM-NEXT:    br i1 [[C]], label [[IF_END]], label [[EXIT:%.*]]<br>
+; IS__CGSCC_OPM:       if.end:<br>
+; IS__CGSCC_OPM-NEXT:    [[E_2:%.*]] = phi i32* [ undef, [[ENTRY:%.*]] ], [ null, [[FOR_COND1:%.*]] ]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = load i32, i32* null, align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32 @fn0(i32 [[TMP0]])<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[CALL]], i32* [[P]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    br label [[FOR_COND1]]<br>
+; IS__CGSCC_OPM:       exit:<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@fn_no_null_opt<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nofree writeonly align 4 dereferenceable_or_null(4) [[P:%.*]], i1 [[C:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[IF_END:%.*]]<br>
+; IS__CGSCC_NPM:       for.cond1:<br>
+; IS__CGSCC_NPM-NEXT:    br i1 [[C]], label [[IF_END]], label [[EXIT:%.*]]<br>
+; IS__CGSCC_NPM:       if.end:<br>
+; IS__CGSCC_NPM-NEXT:    [[E_2:%.*]] = phi i32* [ undef, [[ENTRY:%.*]] ], [ null, [[FOR_COND1:%.*]] ]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32, i32* null, align 536870912<br>
+; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32 @fn0(i32 [[TMP0]])<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[CALL]], i32* [[P]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    br label [[FOR_COND1]]<br>
+; IS__CGSCC_NPM:       exit:<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   br label %if.end<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll b/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll<br>
index 16f45449d38f..bb8283125ebe 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/PR43857.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 %struct.wobble = type { i32 }<br>
 %struct.zot = type { %struct.wobble, %struct.wobble, %struct.wobble }<br>
@@ -17,10 +20,16 @@ bb:<br>
 }<br>
<br>
 define void @baz(<8 x i32> %arg) local_unnamed_addr {<br>
-; CHECK-LABEL: define {{[^@]+}}@baz<br>
-; CHECK-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr<br>
-; CHECK-NEXT:  bb:<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@baz<br>
+; IS__TUNIT____-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr<br>
+; IS__TUNIT____-NEXT:  bb:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@baz<br>
+; IS__CGSCC____-SAME: (<8 x i32> [[ARG:%.*]]) local_unnamed_addr<br>
+; IS__CGSCC____-NEXT:  bb:<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = extractvalue [[STRUCT_ZOT:%.*]] undef, 0, 0<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 bb:<br>
   %tmp = call %struct.zot @widget(<8 x i32> %arg)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll<br>
index 64c9fce32300..2a6bd94e1daf 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-count-mismatch.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; The original C source looked like this:<br>
 ;<br>
@@ -76,11 +79,18 @@ define internal i16 @bar2(i16 %p1, i16 %p2) {<br>
 ; been provided),<br>
<br>
 define dso_local i16 @vararg_tests(i16 %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@vararg_tests<br>
-; CHECK-SAME: (i16 [[A:%.*]])<br>
-; CHECK-NEXT:    [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)<br>
-; CHECK-NEXT:    [[ADD:%.*]] = add i16 7, [[CALL2]]<br>
-; CHECK-NEXT:    ret i16 [[ADD]]<br>
+; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@vararg_tests<br>
+; NOT_CGSCC_OPM-SAME: (i16 [[A:%.*]])<br>
+; NOT_CGSCC_OPM-NEXT:    [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)<br>
+; NOT_CGSCC_OPM-NEXT:    [[ADD:%.*]] = add i16 7, [[CALL2]]<br>
+; NOT_CGSCC_OPM-NEXT:    ret i16 [[ADD]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@vararg_tests<br>
+; IS__CGSCC_OPM-SAME: (i16 [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL1:%.*]] = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 [[A]])<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL2:%.*]] = call i16 bitcast (i16 (i16, i16, ...)* @vararg_no_prop to i16 (i16)*)(i16 7)<br>
+; IS__CGSCC_OPM-NEXT:    [[ADD:%.*]] = add i16 [[CALL1]], [[CALL2]]<br>
+; IS__CGSCC_OPM-NEXT:    ret i16 [[ADD]]<br>
 ;<br>
   %call1 = call i16 (i16, ...) @vararg_prop(i16 7, i16 8, i16 %a)<br>
   %call2 = call i16 bitcast (i16 (i16, i16, ...) * @vararg_no_prop to i16 (i16) *) (i16 7)<br>
@@ -89,6 +99,10 @@ define dso_local i16 @vararg_tests(i16 %a) {<br>
 }<br>
<br>
 define internal i16 @vararg_prop(i16 %p1, ...) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@vararg_prop<br>
+; IS__CGSCC____-SAME: (i16 returned [[P1:%.*]], ...)<br>
+; IS__CGSCC____-NEXT:    ret i16 7<br>
+;<br>
   ret i16 %p1<br>
 }<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll<br>
index a91e8eeee5ee..576a6fb9f084 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/arg-type-mismatch.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; This test is just to verify that we do not crash/assert due to mismatch in<br>
 ; argument type between the caller and callee.<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll<br>
index 2fcde7a92288..41428b3ff5e4 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/comdat-ipo.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; See PR26774<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll b/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll<br>
index 679067650870..489ddb66da71 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/dangling-block-address.ll<br>
@@ -1,23 +1,51 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes='internalize,attributor' -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR5569<br>
<br>
 ; IPSCCP should prove that the blocks are dead and delete them, and<br>
 ; properly handle the dangling blockaddress constants.<br>
<br>
-; CHECK: @bar.l = internal constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
+; NOT_CGSCC_OPM: @bar.l = internal constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
+; IS__CGSCC_OPM: @bar.l = internal constant [2 x i8*] [i8* blockaddress(@bar, %lab0), i8* blockaddress(@bar, %end)]<br>
<br>
 @code = global [5 x i32] [i32 0, i32 0, i32 0, i32 0, i32 1], align 4 ; <[5 x i32]*> [#uses=0]<br>
 @bar.l = internal constant [2 x i8*] [i8* blockaddress(@bar, %lab0), i8* blockaddress(@bar, %end)] ; <[2 x i8*]*> [#uses=1]<br>
<br>
-define void @foo(i32 %x) nounwind readnone {<br>
+define internal void @foo(i32 %x) nounwind readnone {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC____-SAME: (i32 [[X:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    store volatile i32 -1, i32* [[B]]<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %b = alloca i32, align 4                        ; <i32*> [#uses=1]<br>
   store volatile i32 -1, i32* %b<br>
   ret void<br>
 }<br>
<br>
-define void @bar(i32* nocapture %pc) nounwind readonly {<br>
+define internal void @bar(i32* nocapture %pc) nounwind readonly {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@bar<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture [[PC:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    br label [[INDIRECTGOTO:%.*]]<br>
+; IS__CGSCC_OPM:       lab0:<br>
+; IS__CGSCC_OPM-NEXT:    [[INDVAR_NEXT:%.*]] = add i32 [[INDVAR:%.*]], 1<br>
+; IS__CGSCC_OPM-NEXT:    br label [[INDIRECTGOTO]]<br>
+; IS__CGSCC_OPM:       end:<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+; IS__CGSCC_OPM:       indirectgoto:<br>
+; IS__CGSCC_OPM-NEXT:    [[INDVAR]] = phi i32 [ [[INDVAR_NEXT]], [[LAB0:%.*]] ], [ 0, [[ENTRY:%.*]] ]<br>
+; IS__CGSCC_OPM-NEXT:    [[PC_ADDR_0:%.*]] = getelementptr i32, i32* [[PC]], i32 [[INDVAR]]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1_PN:%.*]] = load i32, i32* [[PC_ADDR_0]]<br>
+; IS__CGSCC_OPM-NEXT:    [[INDIRECT_GOTO_DEST_IN:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* @bar.l, i32 0, i32 [[TMP1_PN]]<br>
+; IS__CGSCC_OPM-NEXT:    [[INDIRECT_GOTO_DEST:%.*]] = load i8*, i8** [[INDIRECT_GOTO_DEST_IN]]<br>
+; IS__CGSCC_OPM-NEXT:    indirectbr i8* [[INDIRECT_GOTO_DEST]], [label [[LAB0]], label %end]<br>
+;<br>
 entry:<br>
   br label %indirectgoto<br>
<br>
@@ -38,6 +66,10 @@ indirectgoto:                                     ; preds = %lab0, %entry<br>
 }<br>
<br>
 define i32 @main() nounwind readnone {<br>
+; CHECK-LABEL: define {{[^@]+}}@main()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
 entry:<br>
   ret i32 0<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll b/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll<br>
index c84f4dee2487..b5742a49e64d 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/deadarg.ll<br>
@@ -1,6 +1,14 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 -disable-output < %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 define internal void @foo(i32 %X) {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo<br>
+; CHECK-SAME: (i32 [[X:%.*]])<br>
+; CHECK-NEXT:    call void @foo(i32 [[X]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @foo( i32 %X )<br>
   ret void<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/fp-bc-icmp-const-fold.ll b/llvm/test/Transforms/Attributor/IPConstantProp/fp-bc-icmp-const-fold.ll<br>
index 8d8dd00cf53c..727785260f76 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/fp-bc-icmp-const-fold.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/fp-bc-icmp-const-fold.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 target datalayout = "E-m:e-i64:64-n32:64"<br>
 target triple = "powerpc64-bgq-linux"<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/global.ll b/llvm/test/Transforms/Attributor/IPConstantProp/global.ll<br>
index 7b186f05976e..4326239f1932 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/global.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/global.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 @_ZL6test1g = internal global i32 42, align 4<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll b/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll<br>
index 3a3f0fe210f5..bbef0302b6ce 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/multiple_callbacks.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ;<br>
 ;                            /---------------------------------------|<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll b/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll<br>
index d14c06760cb7..fa2a136fcc73 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll<br>
@@ -1,26 +1,46 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=4 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR36485<br>
 ; musttail call result can't be replaced with a constant, unless the call can be removed<br>
<br>
 declare i32 @external()<br>
<br>
 define i8* @start(i8 %v) {<br>
-; CHECK-LABEL: define {{[^@]+}}@start<br>
-; CHECK-SAME: (i8 [[V:%.*]])<br>
-; CHECK-NEXT:    [[C1:%.*]] = icmp eq i8 [[V]], 0<br>
-; CHECK-NEXT:    br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]<br>
-; CHECK:       true:<br>
-; CHECK-NEXT:    [[CA:%.*]] = musttail call i8* @side_effects(i8 [[V]])<br>
-; CHECK-NEXT:    ret i8* [[CA]]<br>
-; CHECK:       false:<br>
-; CHECK-NEXT:    [[C2:%.*]] = icmp eq i8 [[V]], 1<br>
-; CHECK-NEXT:    br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]<br>
-; CHECK:       c2_true:<br>
-; CHECK-NEXT:    ret i8* null<br>
-; CHECK:       c2_false:<br>
-; CHECK-NEXT:    [[CA2:%.*]] = musttail call i8* @dont_zap_me(i8 undef)<br>
-; CHECK-NEXT:    ret i8* [[CA2]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@start<br>
+; IS__TUNIT____-SAME: (i8 [[V:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[C1:%.*]] = icmp eq i8 [[V]], 0<br>
+; IS__TUNIT____-NEXT:    br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]<br>
+; IS__TUNIT____:       true:<br>
+; IS__TUNIT____-NEXT:    [[CA:%.*]] = musttail call i8* @side_effects(i8 [[V]])<br>
+; IS__TUNIT____-NEXT:    ret i8* [[CA]]<br>
+; IS__TUNIT____:       false:<br>
+; IS__TUNIT____-NEXT:    [[C2:%.*]] = icmp eq i8 [[V]], 1<br>
+; IS__TUNIT____-NEXT:    br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]<br>
+; IS__TUNIT____:       c2_true:<br>
+; IS__TUNIT____-NEXT:    ret i8* null<br>
+; IS__TUNIT____:       c2_false:<br>
+; IS__TUNIT____-NEXT:    [[CA2:%.*]] = musttail call i8* @dont_zap_me(i8 undef)<br>
+; IS__TUNIT____-NEXT:    ret i8* [[CA2]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@start<br>
+; IS__CGSCC____-SAME: (i8 [[V:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[C1:%.*]] = icmp eq i8 [[V]], 0<br>
+; IS__CGSCC____-NEXT:    br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]<br>
+; IS__CGSCC____:       true:<br>
+; IS__CGSCC____-NEXT:    [[CA:%.*]] = musttail call noalias align 536870912 i8* @side_effects(i8 [[V]])<br>
+; IS__CGSCC____-NEXT:    ret i8* [[CA]]<br>
+; IS__CGSCC____:       false:<br>
+; IS__CGSCC____-NEXT:    [[C2:%.*]] = icmp eq i8 [[V]], 1<br>
+; IS__CGSCC____-NEXT:    br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]<br>
+; IS__CGSCC____:       c2_true:<br>
+; IS__CGSCC____-NEXT:    [[CA1:%.*]] = musttail call noalias align 536870912 i8* @no_side_effects(i8 [[V]])<br>
+; IS__CGSCC____-NEXT:    ret i8* [[CA1]]<br>
+; IS__CGSCC____:       c2_false:<br>
+; IS__CGSCC____-NEXT:    [[CA2:%.*]] = musttail call noalias align 536870912 i8* @dont_zap_me(i8 [[V]])<br>
+; IS__CGSCC____-NEXT:    ret i8* [[CA2]]<br>
 ;<br>
   %c1 = icmp eq i8 %v, 0<br>
   br i1 %c1, label %true, label %false<br>
@@ -41,11 +61,17 @@ c2_false:<br>
 }<br>
<br>
 define internal i8* @side_effects(i8 %v) {<br>
-; CHECK-LABEL: define {{[^@]+}}@side_effects<br>
-; CHECK-SAME: (i8 [[V:%.*]])<br>
-; CHECK-NEXT:    [[I1:%.*]] = call i32 @external()<br>
-; CHECK-NEXT:    [[CA:%.*]] = musttail call i8* @start(i8 [[V]])<br>
-; CHECK-NEXT:    ret i8* [[CA]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@side_effects<br>
+; IS__TUNIT____-SAME: (i8 [[V:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[I1:%.*]] = call i32 @external()<br>
+; IS__TUNIT____-NEXT:    [[CA:%.*]] = musttail call i8* @start(i8 [[V]])<br>
+; IS__TUNIT____-NEXT:    ret i8* [[CA]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@side_effects<br>
+; IS__CGSCC____-SAME: (i8 [[V:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[I1:%.*]] = call i32 @external()<br>
+; IS__CGSCC____-NEXT:    [[CA:%.*]] = musttail call noalias align 536870912 i8* @start(i8 [[V]])<br>
+; IS__CGSCC____-NEXT:    ret i8* [[CA]]<br>
 ;<br>
   %i1 = call i32 @external()<br>
<br>
@@ -60,14 +86,23 @@ define internal i8* @side_effects(i8 %v) {<br>
 }<br>
<br>
 define internal i8* @no_side_effects(i8 %v) readonly nounwind {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@no_side_effects<br>
+; IS__CGSCC____-SAME: (i8 [[V:%.*]])<br>
+; IS__CGSCC____-NEXT:    ret i8* null<br>
+;<br>
   ret i8* null<br>
 }<br>
<br>
 define internal i8* @dont_zap_me(i8 %v) {<br>
-; CHECK-LABEL: define {{[^@]+}}@dont_zap_me<br>
-; CHECK-SAME: (i8 [[V:%.*]])<br>
-; CHECK-NEXT:    [[I1:%.*]] = call i32 @external()<br>
-; CHECK-NEXT:    ret i8* undef<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@dont_zap_me<br>
+; IS__TUNIT____-SAME: (i8 [[V:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[I1:%.*]] = call i32 @external()<br>
+; IS__TUNIT____-NEXT:    ret i8* undef<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@dont_zap_me<br>
+; IS__CGSCC____-SAME: (i8 [[V:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[I1:%.*]] = call i32 @external()<br>
+; IS__CGSCC____-NEXT:    ret i8* null<br>
 ;<br>
   %i1 = call i32 @external()<br>
   ret i8* null<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/naked-return.ll b/llvm/test/Transforms/Attributor/IPConstantProp/naked-return.ll<br>
index 818f299142a5..badb82bd566f 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/naked-return.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/naked-return.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"<br>
 target triple = "i686-pc-windows-msvc19.0.24215"<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/openmp_parallel_for.ll b/llvm/test/Transforms/Attributor/IPConstantProp/openmp_parallel_for.ll<br>
index 1e662f1f199f..258bb0745b4c 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/openmp_parallel_for.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/openmp_parallel_for.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=3 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ;    void bar(int, float, double);<br>
 ;<br>
@@ -25,16 +28,49 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 @1 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, align 8<br>
<br>
 define dso_local void @foo(i32 %N) {<br>
-; CHECK-LABEL: define {{[^@]+}}@foo<br>
-; CHECK-SAME: (i32 [[N:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4<br>
-; CHECK-NEXT:    [[P:%.*]] = alloca float, align 4<br>
-; CHECK-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4<br>
-; CHECK-NEXT:    store float 3.000000e+00, float* [[P]], align 4<br>
-; CHECK-NEXT:    store i32 7, i32* [[N_ADDR]], align 4<br>
-; CHECK-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @1, i32 3, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[P]], i64 undef)<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@foo<br>
+; IS__TUNIT_OPM-SAME: (i32 [[N:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[P:%.*]] = alloca float, align 4<br>
+; IS__TUNIT_OPM-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    store float 3.000000e+00, float* [[P]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    store i32 7, i32* [[N_ADDR]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @1, i32 3, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nocapture nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float* nocapture nonnull readonly align 4 dereferenceable(4) [[P]], i64 undef)<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@foo<br>
+; IS__TUNIT_NPM-SAME: (i32 [[N:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[P:%.*]] = alloca float, align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    store float 3.000000e+00, float* [[P]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 7, i32* [[N_ADDR]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @1, i32 3, void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[P]], i64 undef)<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC_OPM-SAME: (i32 [[N:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_OPM-NEXT:    [[P:%.*]] = alloca float, align 4<br>
+; IS__CGSCC_OPM-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    store float 3.000000e+00, float* [[P]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    store i32 7, i32* [[N_ADDR]], align 4<br>
+; IS__CGSCC_OPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @1, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* nonnull align 4 dereferenceable(4) [[N_ADDR]], float* nonnull align 4 dereferenceable(4) [[P]], i64 4617315517961601024)<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC_NPM-SAME: (i32 [[N:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[N_ADDR:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[P:%.*]] = alloca float, align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[N]], i32* [[N_ADDR]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store float 3.000000e+00, float* [[P]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 7, i32* [[N_ADDR]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull align 8 dereferenceable(24) @1, i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, float*, i64)* @.omp_outlined. to void (i32*, i32*, ...)*), i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[N_ADDR]], float* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[P]], i64 4617315517961601024)<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %N.addr = alloca i32, align 4<br>
@@ -47,13 +83,195 @@ entry:<br>
 }<br>
<br>
 define internal void @.omp_outlined.(i32* noalias %.global_tid., i32* noalias %.bound_tid., i32* dereferenceable(4) %N, float* dereferenceable(4) %p, i64 %q) {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@.omp_outlined.<br>
+; IS________OPM-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* nocapture nonnull readonly align 4 dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[Q_ADDR:%.*]] = alloca i64, align 8<br>
+; IS________OPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4<br>
+; IS________OPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4<br>
+; IS________OPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4<br>
+; IS________OPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4<br>
+; IS________OPM-NEXT:    store i64 4617315517961601024, i64* [[Q_ADDR]], align 8<br>
+; IS________OPM-NEXT:    [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*<br>
+; IS________OPM-NEXT:    [[TMP:%.*]] = load i32, i32* [[N]], align 4<br>
+; IS________OPM-NEXT:    [[SUB3:%.*]] = add nsw i32 [[TMP]], -3<br>
+; IS________OPM-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2<br>
+; IS________OPM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]<br>
+; IS________OPM:       omp.precond.then:<br>
+; IS________OPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4<br>
+; IS________OPM-NEXT:    store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4<br>
+; IS________OPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4<br>
+; IS________OPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4<br>
+; IS________OPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS________OPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP5]], i32 34, i32* nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 1, i32 1)<br>
+; IS________OPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS________OPM-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]<br>
+; IS________OPM-NEXT:    br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS________OPM:       cond.true:<br>
+; IS________OPM-NEXT:    br label [[COND_END:%.*]]<br>
+; IS________OPM:       cond.false:<br>
+; IS________OPM-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS________OPM-NEXT:    br label [[COND_END]]<br>
+; IS________OPM:       cond.end:<br>
+; IS________OPM-NEXT:    [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]<br>
+; IS________OPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4<br>
+; IS________OPM-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4<br>
+; IS________OPM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]<br>
+; IS________OPM:       omp.inner.for.cond:<br>
+; IS________OPM-NEXT:    [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]<br>
+; IS________OPM-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS________OPM-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]<br>
+; IS________OPM-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]<br>
+; IS________OPM:       omp.inner.for.cond.cleanup:<br>
+; IS________OPM-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]<br>
+; IS________OPM:       omp.inner.for.body:<br>
+; IS________OPM-NEXT:    [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2<br>
+; IS________OPM-NEXT:    [[TMP10:%.*]] = load float, float* [[P]], align 4<br>
+; IS________OPM-NEXT:    [[TMP11:%.*]] = load double, double* [[CONV]], align 8<br>
+; IS________OPM-NEXT:    call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])<br>
+; IS________OPM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]<br>
+; IS________OPM:       omp.body.continue:<br>
+; IS________OPM-NEXT:    br label [[OMP_INNER_FOR_INC]]<br>
+; IS________OPM:       omp.inner.for.inc:<br>
+; IS________OPM-NEXT:    [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1<br>
+; IS________OPM-NEXT:    br label [[OMP_INNER_FOR_COND]]<br>
+; IS________OPM:       omp.inner.for.end:<br>
+; IS________OPM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]<br>
+; IS________OPM:       omp.loop.exit:<br>
+; IS________OPM-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS________OPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP12]])<br>
+; IS________OPM-NEXT:    br label [[OMP_PRECOND_END]]<br>
+; IS________OPM:       omp.precond.end:<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@.omp_outlined.<br>
+; IS__TUNIT_NPM-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* noalias nocapture nonnull readonly align 4 dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[Q_ADDR:%.*]] = alloca i64, align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i64 4617315517961601024, i64* [[Q_ADDR]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP:%.*]] = load i32, i32* [[N]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[SUB3:%.*]] = add nsw i32 [[TMP]], -3<br>
+; IS__TUNIT_NPM-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2<br>
+; IS__TUNIT_NPM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]<br>
+; IS__TUNIT_NPM:       omp.precond.then:<br>
+; IS__TUNIT_NPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP5]], i32 34, i32* nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 1, i32 1)<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]<br>
+; IS__TUNIT_NPM-NEXT:    br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__TUNIT_NPM:       cond.true:<br>
+; IS__TUNIT_NPM-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__TUNIT_NPM:       cond.false:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    br label [[COND_END]]<br>
+; IS__TUNIT_NPM:       cond.end:<br>
+; IS__TUNIT_NPM-NEXT:    [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]<br>
+; IS__TUNIT_NPM:       omp.inner.for.cond:<br>
+; IS__TUNIT_NPM-NEXT:    [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]<br>
+; IS__TUNIT_NPM-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]<br>
+; IS__TUNIT_NPM:       omp.inner.for.cond.cleanup:<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]<br>
+; IS__TUNIT_NPM:       omp.inner.for.body:<br>
+; IS__TUNIT_NPM-NEXT:    [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP10:%.*]] = load float, float* [[P]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP11:%.*]] = load double, double* [[CONV]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]<br>
+; IS__TUNIT_NPM:       omp.body.continue:<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_INNER_FOR_INC]]<br>
+; IS__TUNIT_NPM:       omp.inner.for.inc:<br>
+; IS__TUNIT_NPM-NEXT:    [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_INNER_FOR_COND]]<br>
+; IS__TUNIT_NPM:       omp.inner.for.end:<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]<br>
+; IS__TUNIT_NPM:       omp.loop.exit:<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP12]])<br>
+; IS__TUNIT_NPM-NEXT:    br label [[OMP_PRECOND_END]]<br>
+; IS__TUNIT_NPM:       omp.precond.end:<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@.omp_outlined.<br>
+; IS__CGSCC_NPM-SAME: (i32* noalias nocapture readonly [[DOTGLOBAL_TID_:%.*]], i32* noalias nocapture nofree readnone [[DOTBOUND_TID_:%.*]], i32* nocapture nonnull readonly align 4 dereferenceable(4) [[N:%.*]], float* nocapture nonnull readonly dereferenceable(4) [[P:%.*]], i64 [[Q:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[Q_ADDR:%.*]] = alloca i64, align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[DOTOMP_LB:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[DOTOMP_UB:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i64 4617315517961601024, i64* [[Q_ADDR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[CONV:%.*]] = bitcast i64* [[Q_ADDR]] to double*<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP:%.*]] = load i32, i32* [[N]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[SUB3:%.*]] = add nsw i32 [[TMP]], -3<br>
+; IS__CGSCC_NPM-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[TMP]], 2<br>
+; IS__CGSCC_NPM-NEXT:    br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]]<br>
+; IS__CGSCC_NPM:       omp.precond.then:<br>
+; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[DOTOMP_LB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[SUB3]], i32* [[DOTOMP_UB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 1, i32* [[DOTOMP_STRIDE]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    store i32 0, i32* [[DOTOMP_IS_LAST]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    call void @__kmpc_for_static_init_4(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP5]], i32 34, i32* nonnull align 4 dereferenceable(4) [[DOTOMP_IS_LAST]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_LB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_UB]], i32* nonnull align 4 dereferenceable(4) [[DOTOMP_STRIDE]], i32 1, i32 1)<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP6:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[TMP6]], [[SUB3]]<br>
+; IS__CGSCC_NPM-NEXT:    br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__CGSCC_NPM:       cond.true:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__CGSCC_NPM:       cond.false:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP7:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    br label [[COND_END]]<br>
+; IS__CGSCC_NPM:       cond.end:<br>
+; IS__CGSCC_NPM-NEXT:    [[COND:%.*]] = phi i32 [ [[SUB3]], [[COND_TRUE]] ], [ [[TMP7]], [[COND_FALSE]] ]<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[COND]], i32* [[DOTOMP_UB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP8:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_INNER_FOR_COND:%.*]]<br>
+; IS__CGSCC_NPM:       omp.inner.for.cond:<br>
+; IS__CGSCC_NPM-NEXT:    [[DOTOMP_IV_0:%.*]] = phi i32 [ [[TMP8]], [[COND_END]] ], [ [[ADD11:%.*]], [[OMP_INNER_FOR_INC:%.*]] ]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP9:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[CMP8:%.*]] = icmp sgt i32 [[DOTOMP_IV_0]], [[TMP9]]<br>
+; IS__CGSCC_NPM-NEXT:    br i1 [[CMP8]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]], label [[OMP_INNER_FOR_BODY:%.*]]<br>
+; IS__CGSCC_NPM:       omp.inner.for.cond.cleanup:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_INNER_FOR_END:%.*]]<br>
+; IS__CGSCC_NPM:       omp.inner.for.body:<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD10:%.*]] = add nsw i32 [[DOTOMP_IV_0]], 2<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP10:%.*]] = load float, float* [[P]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP11:%.*]] = load double, double* [[CONV]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    call void @bar(i32 [[ADD10]], float [[TMP10]], double [[TMP11]])<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_BODY_CONTINUE:%.*]]<br>
+; IS__CGSCC_NPM:       omp.body.continue:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_INNER_FOR_INC]]<br>
+; IS__CGSCC_NPM:       omp.inner.for.inc:<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD11]] = add nsw i32 [[DOTOMP_IV_0]], 1<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_INNER_FOR_COND]]<br>
+; IS__CGSCC_NPM:       omp.inner.for.end:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_LOOP_EXIT:%.*]]<br>
+; IS__CGSCC_NPM:       omp.loop.exit:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP12:%.*]] = load i32, i32* [[DOTGLOBAL_TID_]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    call void @__kmpc_for_static_fini(%struct.ident_t* nonnull align 8 dereferenceable(24) @0, i32 [[TMP12]])<br>
+; IS__CGSCC_NPM-NEXT:    br label [[OMP_PRECOND_END]]<br>
+; IS__CGSCC_NPM:       omp.precond.end:<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %q.addr = alloca i64, align 8<br>
   %.<a href="http://omp.lb" rel="noreferrer" target="_blank">omp.lb</a> = alloca i32, align 4<br>
   %.omp.ub = alloca i32, align 4<br>
   %.omp.stride = alloca i32, align 4<br>
   %.omp.is_last = alloca i32, align 4<br>
-; CHECK: store i64 4617315517961601024, i64* %q.addr, align 8<br>
   store i64 %q, i64* %q.addr, align 8<br>
   %conv = bitcast i64* %q.addr to double*<br>
   %tmp = load i32, i32* %N, align 4<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll b/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll<br>
index 12fb1234c9c6..4399f3a37a8b 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/pthreads.ll<br>
@@ -1,6 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s --check-prefixes=CHECK,MODULE<br>
-; RUN: opt -S -passes=attributor-cgscc -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s --check-prefixes=CHECK,CGSCC<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ;    #include <pthread.h><br>
 ;<br>
@@ -29,27 +31,38 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 ; FIXME: nocapture & noalias for %alloc2 in %call3<br>
<br>
 define dso_local i32 @main() {<br>
-; MODULE-LABEL: define {{[^@]+}}@main()<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    [[ALLOC1:%.*]] = alloca i8, align 8<br>
-; MODULE-NEXT:    [[ALLOC2:%.*]] = alloca i8, align 8<br>
-; MODULE-NEXT:    [[THREAD:%.*]] = alloca i64, align 8<br>
-; MODULE-NEXT:    [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @foo, i8* noalias nofree readnone align 536870912 undef)<br>
-; MODULE-NEXT:    [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @bar, i8* noalias nofree nonnull readnone align 8 dereferenceable(8) undef)<br>
-; MODULE-NEXT:    [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC1]])<br>
-; MODULE-NEXT:    [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @buz, i8* noalias nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC2]])<br>
-; MODULE-NEXT:    ret i32 0<br>
-;<br>
-; CGSCC-LABEL: define {{[^@]+}}@main()<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    [[ALLOC1:%.*]] = alloca i8, align 8<br>
-; CGSCC-NEXT:    [[ALLOC2:%.*]] = alloca i8, align 8<br>
-; CGSCC-NEXT:    [[THREAD:%.*]] = alloca i64, align 8<br>
-; CGSCC-NEXT:    [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @foo, i8* noalias nofree readnone align 536870912 null)<br>
-; CGSCC-NEXT:    [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @bar, i8* noalias nofree nonnull readnone align 8 dereferenceable(8) bitcast (i8** @GlobalVPtr to i8*))<br>
-; CGSCC-NEXT:    [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC1]])<br>
-; CGSCC-NEXT:    [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @buz, i8* noalias nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC2]])<br>
-; CGSCC-NEXT:    ret i32 0<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@main()<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[ALLOC1:%.*]] = alloca i8, align 8<br>
+; IS__TUNIT____-NEXT:    [[ALLOC2:%.*]] = alloca i8, align 8<br>
+; IS__TUNIT____-NEXT:    [[THREAD:%.*]] = alloca i64, align 8<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @foo, i8* noalias nofree readnone align 536870912 undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @bar, i8* noalias nofree nonnull readnone align 8 dereferenceable(8) undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC1]])<br>
+; IS__TUNIT____-NEXT:    [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @buz, i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[ALLOC2]])<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[ALLOC1:%.*]] = alloca i8, align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[ALLOC2:%.*]] = alloca i8, align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[THREAD:%.*]] = alloca i64, align 8<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @foo, i8* noalias align 536870912 null)<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @bar, i8* nonnull align 8 dereferenceable(8) bitcast (i8** @GlobalVPtr to i8*))<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @baz, i8* nocapture nonnull align 8 dereferenceable(1) [[ALLOC1]])<br>
+; IS__CGSCC_OPM-NEXT:    [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @buz, i8* nonnull align 8 dereferenceable(1) [[ALLOC2]])<br>
+; IS__CGSCC_OPM-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@main()<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[ALLOC1:%.*]] = alloca i8, align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[ALLOC2:%.*]] = alloca i8, align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[THREAD:%.*]] = alloca i64, align 8<br>
+; IS__CGSCC_NPM-NEXT:    [[CALL:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @foo, i8* noalias nofree readnone align 536870912 null)<br>
+; IS__CGSCC_NPM-NEXT:    [[CALL1:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @bar, i8* noalias nofree nonnull readnone align 8 dereferenceable(8) bitcast (i8** @GlobalVPtr to i8*))<br>
+; IS__CGSCC_NPM-NEXT:    [[CALL2:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @baz, i8* noalias nocapture nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC1]])<br>
+; IS__CGSCC_NPM-NEXT:    [[CALL3:%.*]] = call i32 @pthread_create(i64* nonnull align 8 dereferenceable(8) [[THREAD]], %union.pthread_attr_t* noalias align 536870912 null, i8* (i8*)* nonnull @buz, i8* noalias nofree nonnull readnone align 8 dereferenceable(1) [[ALLOC2]])<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 0<br>
 ;<br>
 entry:<br>
   %alloc1 = alloca i8, align 8<br>
@@ -65,60 +78,75 @@ entry:<br>
 declare !callback !0 dso_local i32 @pthread_create(i64*, %union.pthread_attr_t*, i8* (i8*)*, i8*)<br>
<br>
 define internal i8* @foo(i8* %arg) {<br>
-; MODULE-LABEL: define {{[^@]+}}@foo<br>
-; MODULE-SAME: (i8* noalias nofree readnone returned align 536870912 [[ARG:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    ret i8* null<br>
+; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@foo<br>
+; NOT_CGSCC_NPM-SAME: (i8* noalias nofree readnone returned align 536870912 "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; NOT_CGSCC_NPM-NEXT:  entry:<br>
+; NOT_CGSCC_NPM-NEXT:    ret i8* null<br>
 ;<br>
-; CGSCC-LABEL: define {{[^@]+}}@foo<br>
-; CGSCC-SAME: (i8* noalias nofree readnone returned [[ARG:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    ret i8* null<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC_NPM-SAME: (i8* noalias nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    ret i8* null<br>
 ;<br>
 entry:<br>
   ret i8* %arg<br>
 }<br>
<br>
 define internal i8* @bar(i8* %arg) {<br>
-; MODULE-LABEL: define {{[^@]+}}@bar<br>
-; MODULE-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(8) [[ARG:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    ret i8* bitcast (i8** @GlobalVPtr to i8*)<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@bar<br>
+; IS__TUNIT____-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(8) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    ret i8* bitcast (i8** @GlobalVPtr to i8*)<br>
 ;<br>
-; CGSCC-LABEL: define {{[^@]+}}@bar<br>
-; CGSCC-SAME: (i8* nofree readnone returned [[ARG:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    ret i8* bitcast (i8** @GlobalVPtr to i8*)<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@bar<br>
+; IS__CGSCC_OPM-SAME: (i8* nofree nonnull readnone returned align 8 dereferenceable(8) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    ret i8* bitcast (i8** @GlobalVPtr to i8*)<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@bar<br>
+; IS__CGSCC_NPM-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    ret i8* bitcast (i8** @GlobalVPtr to i8*)<br>
 ;<br>
 entry:<br>
   ret i8* %arg<br>
 }<br>
<br>
 define internal i8* @baz(i8* %arg) {<br>
-; MODULE-LABEL: define {{[^@]+}}@baz<br>
-; MODULE-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(1) [[ARG:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    ret i8* [[ARG]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@baz<br>
+; IS__TUNIT____-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    ret i8* [[ARG]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@baz<br>
+; IS__CGSCC_OPM-SAME: (i8* nofree nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    ret i8* [[ARG]]<br>
 ;<br>
-; CGSCC-LABEL: define {{[^@]+}}@baz<br>
-; CGSCC-SAME: (i8* nofree readnone returned [[ARG:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    ret i8* [[ARG]]<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@baz<br>
+; IS__CGSCC_NPM-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    ret i8* [[ARG]]<br>
 ;<br>
 entry:<br>
   ret i8* %arg<br>
 }<br>
<br>
 define internal i8* @buz(i8* %arg) {<br>
-; MODULE-LABEL: define {{[^@]+}}@buz<br>
-; MODULE-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(1) [[ARG:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    ret i8* [[ARG]]<br>
-;<br>
-; CGSCC-LABEL: define {{[^@]+}}@buz<br>
-; CGSCC-SAME: (i8* nofree readnone returned [[ARG:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    ret i8* [[ARG]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@buz<br>
+; IS__TUNIT____-SAME: (i8* noalias nofree nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    ret i8* [[ARG]]<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@buz<br>
+; IS__CGSCC_OPM-SAME: (i8* nofree nonnull readnone returned align 8 dereferenceable(1) "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    ret i8* [[ARG]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@buz<br>
+; IS__CGSCC_NPM-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[ARG:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    ret i8* [[ARG]]<br>
 ;<br>
 entry:<br>
   ret i8* %arg<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll b/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll<br>
index 831c0c6ebb98..1351d3117853 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/recursion.ll<br>
@@ -1,9 +1,15 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; CHECK-NOT: %X<br>
<br>
 define internal i32 @foo(i32 %X) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@foo()<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
   %Y = call i32 @foo( i32 %X )            ; <i32> [#uses=1]<br>
   %Z = add i32 %Y, 1              ; <i32> [#uses=1]<br>
   ret i32 %Z<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll<br>
index 9420f53980cb..5b11512f9b6d 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/remove-call-inst.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; PR5596<br>
<br>
 ; IPSCCP should propagate the 0 argument, eliminate the switch, and propagate<br>
@@ -18,6 +21,17 @@ entry:<br>
 }<br>
<br>
 define internal i32 @wwrite(i64 %i) nounwind readnone {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@wwrite()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
+; IS__CGSCC____-NEXT:    i64 3, label [[RETURN:%.*]]<br>
+; IS__CGSCC____-NEXT:    i64 10, label [[RETURN]]<br>
+; IS__CGSCC____-NEXT:    ]<br>
+; IS__CGSCC____:       sw.default:<br>
+; IS__CGSCC____-NEXT:    ret i32 123<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   switch i64 %i, label %sw.default [<br>
   i64 3, label %return<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll<br>
index 05b0107a3bb4..80c0ba7b5fb7 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-argument.ll<br>
@@ -1,20 +1,36 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=8 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=8 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ;; This function returns its second argument on all return statements<br>
 define internal i32* @incdec(i1 %C, i32* %V) {<br>
-; CHECK-LABEL: define {{[^@]+}}@incdec<br>
-; CHECK-SAME: (i1 [[C:%.*]], i32* noalias nofree nonnull returned align 4 dereferenceable(4) [[V:%.*]])<br>
-; CHECK-NEXT:    [[X:%.*]] = load i32, i32* [[V]], align 4<br>
-; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
-; CHECK:       T:<br>
-; CHECK-NEXT:    [[X1:%.*]] = add i32 [[X]], 1<br>
-; CHECK-NEXT:    store i32 [[X1]], i32* [[V]], align 4<br>
-; CHECK-NEXT:    ret i32* [[V]]<br>
-; CHECK:       F:<br>
-; CHECK-NEXT:    [[X2:%.*]] = sub i32 [[X]], 1<br>
-; CHECK-NEXT:    store i32 [[X2]], i32* [[V]], align 4<br>
-; CHECK-NEXT:    ret i32* [[V]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@incdec<br>
+; IS__TUNIT____-SAME: (i1 [[C:%.*]], i32* noalias nofree nonnull returned align 4 dereferenceable(4) "no-capture-maybe-returned" [[V:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[X:%.*]] = load i32, i32* [[V]], align 4<br>
+; IS__TUNIT____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; IS__TUNIT____:       T:<br>
+; IS__TUNIT____-NEXT:    [[X1:%.*]] = add i32 [[X]], 1<br>
+; IS__TUNIT____-NEXT:    store i32 [[X1]], i32* [[V]], align 4<br>
+; IS__TUNIT____-NEXT:    ret i32* [[V]]<br>
+; IS__TUNIT____:       F:<br>
+; IS__TUNIT____-NEXT:    [[X2:%.*]] = sub i32 [[X]], 1<br>
+; IS__TUNIT____-NEXT:    store i32 [[X2]], i32* [[V]], align 4<br>
+; IS__TUNIT____-NEXT:    ret i32* [[V]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@incdec<br>
+; IS__CGSCC____-SAME: (i1 [[C:%.*]], i32* nofree nonnull returned align 4 dereferenceable(4) "no-capture-maybe-returned" [[V:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[X:%.*]] = load i32, i32* [[V]], align 4<br>
+; IS__CGSCC____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; IS__CGSCC____:       T:<br>
+; IS__CGSCC____-NEXT:    [[X1:%.*]] = add i32 [[X]], 1<br>
+; IS__CGSCC____-NEXT:    store i32 [[X1]], i32* [[V]], align 4<br>
+; IS__CGSCC____-NEXT:    ret i32* [[V]]<br>
+; IS__CGSCC____:       F:<br>
+; IS__CGSCC____-NEXT:    [[X2:%.*]] = sub i32 [[X]], 1<br>
+; IS__CGSCC____-NEXT:    store i32 [[X2]], i32* [[V]], align 4<br>
+; IS__CGSCC____-NEXT:    ret i32* [[V]]<br>
 ;<br>
   %X = load i32, i32* %V<br>
   br i1 %C, label %T, label %F<br>
@@ -47,25 +63,43 @@ define internal { i32, i32 } @foo(i32 %A, i32 %B) {<br>
 }<br>
<br>
 define void @caller(i1 %C) personality i32 (...)* @__gxx_personality_v0 {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller<br>
-; CHECK-SAME: (i1 [[C:%.*]]) #2 personality i32 (...)* @__gxx_personality_v0<br>
-; CHECK-NEXT:    [[Q:%.*]] = alloca i32<br>
-; CHECK-NEXT:    [[W:%.*]] = call align 4 i32* @incdec(i1 [[C]], i32* noalias nofree nonnull align 4 dereferenceable(4) [[Q]])<br>
-; CHECK-NEXT:    [[S1:%.*]] = call { i32, i32 } @foo(i32 1, i32 2)<br>
-; CHECK-NEXT:    [[X1:%.*]] = extractvalue { i32, i32 } [[S1]], 0<br>
-; CHECK-NEXT:    [[S2:%.*]] = invoke { i32, i32 } @foo(i32 3, i32 4)<br>
-; CHECK-NEXT:    to label [[OK:%.*]] unwind label [[LPAD:%.*]]<br>
-; CHECK:       OK:<br>
-; CHECK-NEXT:    [[X2:%.*]] = extractvalue { i32, i32 } [[S2]], 0<br>
-; CHECK-NEXT:    [[Z:%.*]] = add i32 [[X1]], [[X2]]<br>
-; CHECK-NEXT:    store i32 [[Z]], i32* [[W]], align 4<br>
-; CHECK-NEXT:    br label [[RET:%.*]]<br>
-; CHECK:       LPAD:<br>
-; CHECK-NEXT:    [[EXN:%.*]] = landingpad { i8*, i32 }<br>
-; CHECK-NEXT:    cleanup<br>
-; CHECK-NEXT:    br label [[RET]]<br>
-; CHECK:       RET:<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller<br>
+; IS__TUNIT____-SAME: (i1 [[C:%.*]]) #2 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__TUNIT____-NEXT:    [[Q:%.*]] = alloca i32<br>
+; IS__TUNIT____-NEXT:    [[W:%.*]] = call align 4 i32* @incdec(i1 [[C]], i32* noalias nofree nonnull align 4 dereferenceable(4) "no-capture-maybe-returned" [[Q]])<br>
+; IS__TUNIT____-NEXT:    [[S1:%.*]] = call { i32, i32 } @foo(i32 1, i32 2)<br>
+; IS__TUNIT____-NEXT:    [[X1:%.*]] = extractvalue { i32, i32 } [[S1]], 0<br>
+; IS__TUNIT____-NEXT:    [[S2:%.*]] = invoke { i32, i32 } @foo(i32 3, i32 4)<br>
+; IS__TUNIT____-NEXT:    to label [[OK:%.*]] unwind label [[LPAD:%.*]]<br>
+; IS__TUNIT____:       OK:<br>
+; IS__TUNIT____-NEXT:    [[X2:%.*]] = extractvalue { i32, i32 } [[S2]], 0<br>
+; IS__TUNIT____-NEXT:    [[Z:%.*]] = add i32 [[X1]], [[X2]]<br>
+; IS__TUNIT____-NEXT:    store i32 [[Z]], i32* [[W]], align 4<br>
+; IS__TUNIT____-NEXT:    br label [[RET:%.*]]<br>
+; IS__TUNIT____:       LPAD:<br>
+; IS__TUNIT____-NEXT:    [[EXN:%.*]] = landingpad { i8*, i32 }<br>
+; IS__TUNIT____-NEXT:    cleanup<br>
+; IS__TUNIT____-NEXT:    br label [[RET]]<br>
+; IS__TUNIT____:       RET:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller<br>
+; IS__CGSCC____-SAME: (i1 [[C:%.*]]) #1 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__CGSCC____-NEXT:    [[Q:%.*]] = alloca i32<br>
+; IS__CGSCC____-NEXT:    [[W:%.*]] = call align 4 i32* @incdec(i1 [[C]], i32* noalias nofree nonnull align 4 dereferenceable(4) [[Q]])<br>
+; IS__CGSCC____-NEXT:    [[S1:%.*]] = call { i32, i32 } @foo(i32 1, i32 2)<br>
+; IS__CGSCC____-NEXT:    [[X1:%.*]] = extractvalue { i32, i32 } [[S1]], 0<br>
+; IS__CGSCC____-NEXT:    [[S2:%.*]] = call { i32, i32 } @foo(i32 3, i32 4)<br>
+; IS__CGSCC____-NEXT:    br label [[OK:%.*]]<br>
+; IS__CGSCC____:       OK:<br>
+; IS__CGSCC____-NEXT:    [[X2:%.*]] = extractvalue { i32, i32 } [[S2]], 0<br>
+; IS__CGSCC____-NEXT:    [[Z:%.*]] = add i32 [[X1]], [[X2]]<br>
+; IS__CGSCC____-NEXT:    store i32 [[Z]], i32* [[W]], align 4<br>
+; IS__CGSCC____-NEXT:    br label [[RET:%.*]]<br>
+; IS__CGSCC____:       LPAD:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       RET:<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   %Q = alloca i32<br>
   ;; Call incdec to see if %W is properly replaced by %Q<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll<br>
index 1810b07e7549..d7c5e9278a81 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-constant.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; FIXME: icmp folding is missing<br>
<br>
@@ -24,13 +27,21 @@ FAIL:<br>
 }<br>
<br>
 define internal i32 @foo(i1 %C) {<br>
-; CHECK-LABEL: define {{[^@]+}}@foo<br>
-; CHECK-SAME: (i1 [[C:%.*]])<br>
-; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
-; CHECK:       T:<br>
-; CHECK-NEXT:    ret i32 undef<br>
-; CHECK:       F:<br>
-; CHECK-NEXT:    ret i32 undef<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@foo<br>
+; IS__TUNIT____-SAME: (i1 [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; IS__TUNIT____:       T:<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
+; IS__TUNIT____:       F:<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@foo<br>
+; IS__CGSCC____-SAME: (i1 [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; IS__CGSCC____:       T:<br>
+; IS__CGSCC____-NEXT:    ret i32 52<br>
+; IS__CGSCC____:       F:<br>
+; IS__CGSCC____-NEXT:    ret i32 52<br>
 ;<br>
   br i1 %C, label %T, label %F<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll b/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll<br>
index d53b11b4fc4c..51d94f7be855 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/return-constants.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=7 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ;; FIXME: support for extractvalue and insertvalue missing.<br>
<br>
<br>
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<br>
index b5663c9c8c13..6ed063662dfa 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/solve-after-each-resolving-undefs-for-function.ll<br>
@@ -1,7 +1,21 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define internal i32 @testf(i1 %c) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@testf<br>
+; IS__CGSCC____-SAME: (i1 [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    br i1 [[C]], label [[IF_COND:%.*]], label [[IF_END:%.*]]<br>
+; IS__CGSCC____:       if.cond:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    ret i32 10<br>
+;<br>
 entry:<br>
   br i1 %c, label %if.cond, label %if.end<br>
<br>
@@ -16,6 +30,17 @@ if.end:                                          ; preds = %if.then1, %entry<br>
 }<br>
<br>
 define internal i32 @test1(i1 %c) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test1<br>
+; IS__CGSCC____-SAME: (i1 [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    br label [[IF_THEN:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    br label [[RET1:%.*]]<br>
+; IS__CGSCC____:       ret1:<br>
+; IS__CGSCC____-NEXT:    ret i32 99<br>
+; IS__CGSCC____:       ret2:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   br label %if.then<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll b/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll<br>
index 3c11e799b3d2..10e2ac8006d5 100644<br>
--- a/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll<br>
+++ b/llvm/test/Transforms/Attributor/IPConstantProp/thread_local_acs.ll<br>
@@ -1,5 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-max-iterations=1 < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ;    #include <threads.h><br>
 ;    thread_local int gtl = 0;<br>
@@ -37,10 +40,15 @@ entry:<br>
 }<br>
<br>
 define dso_local void @caller() {<br>
-; CHECK-LABEL: define {{[^@]+}}@caller()<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    call void @broker(i32* nofree nonnull readonly align 4 dereferenceable(4) @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nofree nonnull readonly align 4 dereferenceable(4) undef)<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@caller()<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    call void @broker(i32* nofree nonnull readonly align 4 dereferenceable(4) @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nofree nonnull readonly align 4 dereferenceable(4) undef)<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@caller()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    call void @broker(i32* nofree nonnull readonly align 4 dereferenceable(4) @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nofree nonnull readonly align 4 dereferenceable(4) @gsh)<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   call void @broker(i32* nonnull @gtl, i32 (i32*, i32*)* nonnull @callee, i32* nonnull @gsh)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/align.ll b/llvm/test/Transforms/Attributor/align.ll<br>
index 882d0e8b8c7f..88d070fb8768 100644<br>
--- a/llvm/test/Transforms/Attributor/align.ll<br>
+++ b/llvm/test/Transforms/Attributor/align.ll<br>
@@ -1,8 +1,8 @@<br>
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --disable --function-signature --scrub-attributes<br>
-; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_MODULE<br>
-; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_CGSCC<br>
-; RUN: opt -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_MODULE<br>
-; RUN: opt -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_CGSCC<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
@@ -11,27 +11,41 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
<br>
 ; TEST 1<br>
-; ATTRIBUTOR: define align 8 i32* @test1(i32* nofree readnone returned align 8 "no-capture-maybe-returned" %0)<br>
 define i32* @test1(i32* align 8 %0) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test1<br>
+; CHECK-SAME: (i32* nofree readnone returned align 8 "no-capture-maybe-returned" [[TMP0:%.*]])<br>
+; CHECK-NEXT:    ret i32* [[TMP0]]<br>
+;<br>
   ret i32* %0<br>
 }<br>
<br>
 ; TEST 2<br>
-; ATTRIBUTOR: define i32* @test2(i32* nofree readnone returned "no-capture-maybe-returned" %0)<br>
 define i32* @test2(i32* %0) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2<br>
+; CHECK-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[TMP0:%.*]])<br>
+; CHECK-NEXT:    ret i32* [[TMP0]]<br>
+;<br>
   ret i32* %0<br>
 }<br>
<br>
 ; TEST 3<br>
-; ATTRIBUTOR: define align 4 i32* @test3(i32* nofree readnone align 8 "no-capture-maybe-returned" %0, i32* nofree readnone align 4 "no-capture-maybe-returned" %1, i1 %2)<br>
 define i32* @test3(i32* align 8 %0, i32* align 4 %1, i1 %2) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test3<br>
+; CHECK-SAME: (i32* nofree readnone align 8 "no-capture-maybe-returned" [[TMP0:%.*]], i32* nofree readnone align 4 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]])<br>
+; CHECK-NEXT:    [[RET:%.*]] = select i1 [[TMP2]], i32* [[TMP0]], i32* [[TMP1]]<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = select i1 %2, i32* %0, i32* %1<br>
   ret i32* %ret<br>
 }<br>
<br>
 ; TEST 4<br>
-; ATTRIBUTOR: define align 32 i32* @test4(i32* nofree readnone align 32 "no-capture-maybe-returned" %0, i32* nofree readnone align 32 "no-capture-maybe-returned" %1, i1 %2)<br>
 define i32* @test4(i32* align 32 %0, i32* align 32 %1, i1 %2) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test4<br>
+; CHECK-SAME: (i32* nofree readnone align 32 "no-capture-maybe-returned" [[TMP0:%.*]], i32* nofree readnone align 32 "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]])<br>
+; CHECK-NEXT:    [[RET:%.*]] = select i1 [[TMP2]], i32* [[TMP0]], i32* [[TMP1]]<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = select i1 %2, i32* %0, i32* %1<br>
   ret i32* %ret<br>
 }<br>
@@ -41,28 +55,38 @@ declare i32* @unknown()<br>
 declare align 8 i32* @align8()<br>
<br>
<br>
-; ATTRIBUTOR: define align 8 i32* @test5_1()<br>
 define i32* @test5_1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test5_1()<br>
+; CHECK-NEXT:    [[RET:%.*]] = tail call align 8 i32* @unknown()<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = tail call align 8 i32* @unknown()<br>
   ret i32* %ret<br>
 }<br>
<br>
-; ATTRIBUTOR: define align 8 i32* @test5_2()<br>
 define i32* @test5_2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test5_2()<br>
+; CHECK-NEXT:    [[RET:%.*]] = tail call align 8 i32* @align8()<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = tail call i32* @align8()<br>
   ret i32* %ret<br>
 }<br>
<br>
 ; TEST 6<br>
 ; SCC<br>
-; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @test6_1()<br>
 define i32* @test6_1() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6_1()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %ret = tail call i32* @test6_2()<br>
   ret i32* %ret<br>
 }<br>
<br>
-; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @test6_2()<br>
 define i32* @test6_2() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6_2()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %ret = tail call i32* @test6_1()<br>
   ret i32* %ret<br>
 }<br>
@@ -87,6 +111,28 @@ define i32* @test6_2() #0 {<br>
<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@f1<br>
+; IS__TUNIT____-SAME: (i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; IS__TUNIT____-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; IS__TUNIT____-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; IS__TUNIT____:       3:<br>
+; IS__TUNIT____-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2()<br>
+; IS__TUNIT____-NEXT:    br label [[TMP5]]<br>
+; IS__TUNIT____:       5:<br>
+; IS__TUNIT____-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; IS__TUNIT____-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@f1<br>
+; IS__CGSCC____-SAME: (i8* nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; IS__CGSCC____-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; IS__CGSCC____:       3:<br>
+; IS__CGSCC____-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2()<br>
+; IS__CGSCC____-NEXT:    br label [[TMP5]]<br>
+; IS__CGSCC____:       5:<br>
+; IS__CGSCC____-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; IS__CGSCC____-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -102,6 +148,19 @@ define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {<br>
<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@f2() local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a1, null<br>
+; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP4:%.*]], label [[TMP2:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @f1(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" @a1)<br>
+; CHECK-NEXT:    br label [[TMP6:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i8* @f3()<br>
+; CHECK-NEXT:    br label [[TMP6]]<br>
+; CHECK:       6:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ [[TMP5]], [[TMP4]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP7]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %5, label %3<br>
<br>
@@ -121,6 +180,16 @@ define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {<br>
<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@f3() local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a2, null<br>
+; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP4:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @f1(i8* noalias nofree nonnull readnone align 16 dereferenceable(1) @a2)<br>
+; CHECK-NEXT:    br label [[TMP4]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ @a1, [[TMP0:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP5]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -133,18 +202,16 @@ define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {<br>
   ret i8* %6<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
-<br>
 ; TEST 7<br>
 ; Better than IR information<br>
 define align 4 i8* @test7() #0 {<br>
-; ATTRIBUTOR_MODULE-LABEL: define {{[^@]+}}@test7()<br>
-; ATTRIBUTOR_MODULE-NEXT:    [[C:%.*]] = tail call i8* @f1(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
-; ATTRIBUTOR_MODULE-NEXT:    ret i8* [[C]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test7()<br>
+; IS__TUNIT____-NEXT:    [[C:%.*]] = tail call i8* @f1(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
+; IS__TUNIT____-NEXT:    ret i8* [[C]]<br>
 ;<br>
-; ATTRIBUTOR_CGSCC-LABEL: define {{[^@]+}}@test7()<br>
-; ATTRIBUTOR_CGSCC-NEXT:    [[C:%.*]] = tail call nonnull align 8 dereferenceable(1) i8* @f1(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
-; ATTRIBUTOR_CGSCC-NEXT:    ret i8* [[C]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test7()<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = tail call nonnull align 8 dereferenceable(1) i8* @f1(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
+; IS__CGSCC____-NEXT:    ret i8* [[C]]<br>
 ;<br>
   %c = tail call i8* @f1(i8* align 8 dereferenceable(1) @a1)<br>
   ret i8* %c<br>
@@ -153,31 +220,31 @@ define align 4 i8* @test7() #0 {<br>
 ; TEST 7b<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f1b(i8* readnone %0) local_unnamed_addr #0 {<br>
-; ATTRIBUTOR_MODULE-LABEL: define {{[^@]+}}@f1b<br>
-; ATTRIBUTOR_MODULE-SAME: (i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
-; ATTRIBUTOR_MODULE-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
-; ATTRIBUTOR_MODULE-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
-; ATTRIBUTOR_MODULE:       3:<br>
-; ATTRIBUTOR_MODULE-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2b()<br>
-; ATTRIBUTOR_MODULE-NEXT:    [[L:%.*]] = load i8, i8* [[TMP4]], align 8<br>
-; ATTRIBUTOR_MODULE-NEXT:    store i8 [[L]], i8* @a1, align 8<br>
-; ATTRIBUTOR_MODULE-NEXT:    br label [[TMP5]]<br>
-; ATTRIBUTOR_MODULE:       5:<br>
-; ATTRIBUTOR_MODULE-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
-; ATTRIBUTOR_MODULE-NEXT:    ret i8* [[TMP6]]<br>
-;<br>
-; ATTRIBUTOR_CGSCC-LABEL: define {{[^@]+}}@f1b<br>
-; ATTRIBUTOR_CGSCC-SAME: (i8* nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
-; ATTRIBUTOR_CGSCC-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
-; ATTRIBUTOR_CGSCC-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
-; ATTRIBUTOR_CGSCC:       3:<br>
-; ATTRIBUTOR_CGSCC-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2b()<br>
-; ATTRIBUTOR_CGSCC-NEXT:    [[L:%.*]] = load i8, i8* [[TMP4]], align 8<br>
-; ATTRIBUTOR_CGSCC-NEXT:    store i8 [[L]], i8* @a1, align 8<br>
-; ATTRIBUTOR_CGSCC-NEXT:    br label [[TMP5]]<br>
-; ATTRIBUTOR_CGSCC:       5:<br>
-; ATTRIBUTOR_CGSCC-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
-; ATTRIBUTOR_CGSCC-NEXT:    ret i8* [[TMP6]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@f1b<br>
+; IS__TUNIT____-SAME: (i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; IS__TUNIT____-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; IS__TUNIT____-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; IS__TUNIT____:       3:<br>
+; IS__TUNIT____-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2b()<br>
+; IS__TUNIT____-NEXT:    [[L:%.*]] = load i8, i8* [[TMP4]], align 8<br>
+; IS__TUNIT____-NEXT:    store i8 [[L]], i8* @a1, align 8<br>
+; IS__TUNIT____-NEXT:    br label [[TMP5]]<br>
+; IS__TUNIT____:       5:<br>
+; IS__TUNIT____-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; IS__TUNIT____-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@f1b<br>
+; IS__CGSCC____-SAME: (i8* nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; IS__CGSCC____-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; IS__CGSCC____-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; IS__CGSCC____:       3:<br>
+; IS__CGSCC____-NEXT:    [[TMP4:%.*]] = tail call align 8 i8* @f2b()<br>
+; IS__CGSCC____-NEXT:    [[L:%.*]] = load i8, i8* [[TMP4]], align 8<br>
+; IS__CGSCC____-NEXT:    store i8 [[L]], i8* @a1, align 8<br>
+; IS__CGSCC____-NEXT:    br label [[TMP5]]<br>
+; IS__CGSCC____:       5:<br>
+; IS__CGSCC____-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; IS__CGSCC____-NEXT:    ret i8* [[TMP6]]<br>
 ;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
@@ -196,18 +263,18 @@ define internal i8* @f1b(i8* readnone %0) local_unnamed_addr #0 {<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f2b(i8* readnone %0) local_unnamed_addr #0 {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@f2b() local_unnamed_addr<br>
-; ATTRIBUTOR-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a1, null<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP1]], label [[TMP4:%.*]], label [[TMP2:%.*]]<br>
-; ATTRIBUTOR:       2:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" @a1)<br>
-; ATTRIBUTOR-NEXT:    br label [[TMP6:%.*]]<br>
-; ATTRIBUTOR:       4:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = tail call i8* @f3b()<br>
-; ATTRIBUTOR-NEXT:    br label [[TMP6]]<br>
-; ATTRIBUTOR:       6:<br>
-; ATTRIBUTOR-NEXT:    [[TMP7:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ [[TMP5]], [[TMP4]] ]<br>
-; ATTRIBUTOR-NEXT:    ret i8* [[TMP7]]<br>
+; CHECK-LABEL: define {{[^@]+}}@f2b() local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a1, null<br>
+; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP4:%.*]], label [[TMP2:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) "no-capture-maybe-returned" @a1)<br>
+; CHECK-NEXT:    br label [[TMP6:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i8* @f3b()<br>
+; CHECK-NEXT:    br label [[TMP6]]<br>
+; CHECK:       6:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ [[TMP5]], [[TMP4]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP7]]<br>
 ;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %5, label %3<br>
@@ -229,15 +296,15 @@ define internal i8* @f2b(i8* readnone %0) local_unnamed_addr #0 {<br>
 ; Function Attrs: nounwind readnone ssp uwtable<br>
 define internal i8* @f3b(i8* readnone %0) local_unnamed_addr #0 {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@f3b() local_unnamed_addr<br>
-; ATTRIBUTOR-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a2, null<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP4:%.*]]<br>
-; ATTRIBUTOR:       2:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 16 dereferenceable(1) @a2)<br>
-; ATTRIBUTOR-NEXT:    br label [[TMP4]]<br>
-; ATTRIBUTOR:       4:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ @a1, [[TMP0:%.*]] ]<br>
-; ATTRIBUTOR-NEXT:    ret i8* [[TMP5]]<br>
+; CHECK-LABEL: define {{[^@]+}}@f3b() local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i8* @a2, null<br>
+; CHECK-NEXT:    br i1 [[TMP1]], label [[TMP2:%.*]], label [[TMP4:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 16 dereferenceable(1) @a2)<br>
+; CHECK-NEXT:    br label [[TMP4]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = phi i8* [ [[TMP3]], [[TMP2]] ], [ @a1, [[TMP0:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP5]]<br>
 ;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
@@ -252,36 +319,52 @@ define internal i8* @f3b(i8* readnone %0) local_unnamed_addr #0 {<br>
 }<br>
<br>
 define align 4 i32* @test7b(i32* align 32 %p) #0 {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@test7b<br>
-; ATTRIBUTOR-SAME: (i32* nofree readnone returned align 32 "no-capture-maybe-returned" [[P:%.*]])<br>
-; ATTRIBUTOR-NEXT:    [[TMP1:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
-; ATTRIBUTOR-NEXT:    ret i32* [[P]]<br>
+; CHECK-LABEL: define {{[^@]+}}@test7b<br>
+; CHECK-SAME: (i32* nofree readnone returned align 32 "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* @f1b(i8* noalias nofree nonnull readnone align 8 dereferenceable(1) @a1)<br>
+; CHECK-NEXT:    ret i32* [[P]]<br>
 ;<br>
   tail call i8* @f1b(i8* align 8 dereferenceable(1) @a1)<br>
   ret i32* %p<br>
 }<br>
<br>
-; UTC_ARGS: --disable<br>
-<br>
 ; TEST 8<br>
 define void @test8_helper() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test8_helper()<br>
+; CHECK-NEXT:    [[PTR0:%.*]] = tail call i32* @unknown()<br>
+; CHECK-NEXT:    [[PTR1:%.*]] = tail call align 4 i32* @unknown()<br>
+; CHECK-NEXT:    [[PTR2:%.*]] = tail call align 8 i32* @unknown()<br>
+; CHECK-NEXT:    tail call void @test8(i32* noalias readnone align 4 [[PTR1]], i32* noalias readnone align 4 [[PTR1]], i32* noalias readnone [[PTR0]])<br>
+; CHECK-NEXT:    tail call void @test8(i32* noalias readnone align 8 [[PTR2]], i32* noalias readnone align 4 [[PTR1]], i32* noalias readnone align 4 [[PTR1]])<br>
+; CHECK-NEXT:    tail call void @test8(i32* noalias readnone align 8 [[PTR2]], i32* noalias readnone align 4 [[PTR1]], i32* noalias readnone align 4 [[PTR1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr0 = tail call i32* @unknown()<br>
   %ptr1 = tail call align 4 i32* @unknown()<br>
   %ptr2 = tail call align 8 i32* @unknown()<br>
<br>
   tail call void @test8(i32* %ptr1, i32* %ptr1, i32* %ptr0)<br>
-; ATTRIBUTOR: tail call void @test8(i32* noalias readnone align 4 %ptr1, i32* noalias readnone align 4 %ptr1, i32* noalias readnone %ptr0)<br>
   tail call void @test8(i32* %ptr2, i32* %ptr1, i32* %ptr1)<br>
-; ATTRIBUTOR: tail call void @test8(i32* noalias readnone align 8 %ptr2, i32* noalias readnone align 4 %ptr1, i32* noalias readnone align 4 %ptr1)<br>
   tail call void @test8(i32* %ptr2, i32* %ptr1, i32* %ptr1)<br>
-; ATTRIBUTOR: tail call void @test8(i32* noalias readnone align 8 %ptr2, i32* noalias readnone align 4 %ptr1, i32* noalias readnone align 4 %ptr1)<br>
   ret void<br>
 }<br>
<br>
 declare void @user_i32_ptr(i32* nocapture readnone) nounwind<br>
 define internal void @test8(i32* %a, i32* %b, i32* %c) {<br>
-; ATTRIBUTOR_MODULE: define internal void @test8(i32* noalias nocapture readnone align 4 %a, i32* noalias nocapture readnone align 4 %b, i32* noalias nocapture readnone %c)<br>
-; ATTRIBUTOR_CGSCC: define internal void @test8(i32* nocapture readnone align 4 %a, i32* nocapture readnone align 4 %b, i32* nocapture readnone %c)<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test8<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture readnone align 4 [[A:%.*]], i32* noalias nocapture readnone align 4 [[B:%.*]], i32* noalias nocapture readnone [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[A]])<br>
+; IS__TUNIT____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[B]])<br>
+; IS__TUNIT____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone [[C]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test8<br>
+; IS__CGSCC____-SAME: (i32* nocapture readnone align 4 [[A:%.*]], i32* nocapture readnone align 4 [[B:%.*]], i32* nocapture readnone [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[A]])<br>
+; IS__CGSCC____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[B]])<br>
+; IS__CGSCC____-NEXT:    call void @user_i32_ptr(i32* noalias nocapture readnone [[C]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   call void @user_i32_ptr(i32* %a)<br>
   call void @user_i32_ptr(i32* %b)<br>
   call void @user_i32_ptr(i32* %c)<br>
@@ -289,33 +372,53 @@ define internal void @test8(i32* %a, i32* %b, i32* %c) {<br>
 }<br>
<br>
 declare void @test9_helper(i32* %A)<br>
-define void @test9_traversal(i1 %c, i32* align 4 %B, i32* align 8 %C) {<br>
-  %sel = select i1 %c, i32* %B, i32* %C<br>
+define void @test9_traversal(i1 %cnd, i32* align 4 %B, i32* align 8 %C) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test9_traversal<br>
+; CHECK-SAME: (i1 [[CND:%.*]], i32* align 4 [[B:%.*]], i32* align 8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CND]], i32* [[B]], i32* [[C]]<br>
+; CHECK-NEXT:    call void @test9_helper(i32* align 4 [[SEL]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  %sel = select i1 %cnd, i32* %B, i32* %C<br>
   call void @test9_helper(i32* %sel)<br>
   ret void<br>
 }<br>
<br>
 ; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
 ;             define align 32 i32* @test10a(i32* align 32 "no-capture-maybe-returned" %p)<br>
-; ATTRIBUTOR: define i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" %p)<br>
+; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
+;             store i32 1, i32* %r, align 32<br>
+; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
+;             store i32 -1, i32* %g1, align 32<br>
 define i32* @test10a(i32* align 32 %p) {<br>
-; ATTRIBUTOR: %l = load i32, i32* %p, align 32<br>
+; CHECK-LABEL: define {{[^@]+}}@test10a<br>
+; CHECK-SAME: (i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[L:%.*]] = load i32, i32* [[P]], align 32<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[L]], 0<br>
+; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    [[R:%.*]] = call i32* @test10a(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]])<br>
+; CHECK-NEXT:    store i32 1, i32* [[R]]<br>
+; CHECK-NEXT:    [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8<br>
+; CHECK-NEXT:    br label [[E:%.*]]<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 8<br>
+; CHECK-NEXT:    store i32 -1, i32* [[G1]], align 4<br>
+; CHECK-NEXT:    br label [[E]]<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]<br>
+; CHECK-NEXT:    ret i32* [[PHI]]<br>
+;<br>
   %l = load i32, i32* %p<br>
   %c = icmp eq i32 %l, 0<br>
   br i1 %c, label %t, label %f<br>
 t:<br>
   %r = call i32* @test10a(i32* %p)<br>
-; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
-;             store i32 1, i32* %r, align 32<br>
-; ATTRIBUTOR: store i32 1, i32* %r<br>
   store i32 1, i32* %r<br>
   %g0 = getelementptr i32, i32* %p, i32 8<br>
   br label %e<br>
 f:<br>
   %g1 = getelementptr i32, i32* %p, i32 8<br>
-; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
-;             store i32 -1, i32* %g1, align 32<br>
-; ATTRIBUTOR: store i32 -1, i32* %g1<br>
   store i32 -1, i32* %g1<br>
   br label %e<br>
 e:<br>
@@ -325,25 +428,39 @@ e:<br>
<br>
 ; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
 ;             define align 32 i32* @test10b(i32* align 32 "no-capture-maybe-returned" %p)<br>
-; ATTRIBUTOR: define i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" %p)<br>
+; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
+;             store i32 1, i32* %r, align 32<br>
+; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
+;             store i32 -1, i32* %g1, align 32<br>
 define i32* @test10b(i32* align 32 %p) {<br>
-; ATTRIBUTOR: %l = load i32, i32* %p, align 32<br>
+; CHECK-LABEL: define {{[^@]+}}@test10b<br>
+; CHECK-SAME: (i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[L:%.*]] = load i32, i32* [[P]], align 32<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp eq i32 [[L]], 0<br>
+; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    [[R:%.*]] = call i32* @test10b(i32* nofree nonnull align 32 dereferenceable(4) "no-capture-maybe-returned" [[P]])<br>
+; CHECK-NEXT:    store i32 1, i32* [[R]]<br>
+; CHECK-NEXT:    [[G0:%.*]] = getelementptr i32, i32* [[P]], i32 8<br>
+; CHECK-NEXT:    br label [[E:%.*]]<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    [[G1:%.*]] = getelementptr i32, i32* [[P]], i32 -8<br>
+; CHECK-NEXT:    store i32 -1, i32* [[G1]], align 4<br>
+; CHECK-NEXT:    br label [[E]]<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi i32* [ [[G0]], [[T]] ], [ [[G1]], [[F]] ]<br>
+; CHECK-NEXT:    ret i32* [[PHI]]<br>
+;<br>
   %l = load i32, i32* %p<br>
   %c = icmp eq i32 %l, 0<br>
   br i1 %c, label %t, label %f<br>
 t:<br>
   %r = call i32* @test10b(i32* %p)<br>
-; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
-;             store i32 1, i32* %r, align 32<br>
-; ATTRIBUTOR: store i32 1, i32* %r<br>
   store i32 1, i32* %r<br>
   %g0 = getelementptr i32, i32* %p, i32 8<br>
   br label %e<br>
 f:<br>
   %g1 = getelementptr i32, i32* %p, i32 -8<br>
-; FIXME: This will work with an upcoming patch (D66618 or similar)<br>
-;             store i32 -1, i32* %g1, align 32<br>
-; ATTRIBUTOR: store i32 -1, i32* %g1<br>
   store i32 -1, i32* %g1<br>
   br label %e<br>
 e:<br>
@@ -352,8 +469,13 @@ e:<br>
 }<br>
<br>
<br>
-; ATTRIBUTOR: define i64 @test11(i32* nocapture nofree nonnull readonly align 8 dereferenceable(8) %p)<br>
 define i64 @test11(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test11<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[RET:%.*]] = load i64, i64* [[P_CAST]], align 8<br>
+; CHECK-NEXT:    ret i64 [[RET]]<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %ret = load i64, i64* %p-cast, align 8<br>
   ret i64 %ret<br>
@@ -363,8 +485,15 @@ define i64 @test11(i32* %p) {<br>
 ; Test for deduction using must-be-executed-context and GEP instruction<br>
<br>
 ; FXIME: %p should have nonnull<br>
-; ATTRIBUTOR: define i64 @test12-1(i32* nocapture nofree readonly align 16 %p)<br>
 define i64 @test12-1(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-1<br>
+; CHECK-SAME: (i32* nocapture nofree readonly align 16 [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 1<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr i64, i64* [[ARRAYIDX0]], i64 3<br>
+; CHECK-NEXT:    [[RET:%.*]] = load i64, i64* [[ARRAYIDX1]], align 16<br>
+; CHECK-NEXT:    ret i64 [[RET]]<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 1<br>
   %arrayidx1 = getelementptr i64, i64* %arrayidx0, i64 3<br>
@@ -372,8 +501,14 @@ define i64 @test12-1(i32* align 4 %p) {<br>
   ret i64 %ret<br>
 }<br>
<br>
-; ATTRIBUTOR: define i64 @test12-2(i32* nocapture nofree nonnull readonly align 16 dereferenceable(8) %p)<br>
 define i64 @test12-2(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-2<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 16 dereferenceable(8) [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 0<br>
+; CHECK-NEXT:    [[RET:%.*]] = load i64, i64* [[ARRAYIDX0]], align 16<br>
+; CHECK-NEXT:    ret i64 [[RET]]<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 0<br>
   %ret = load i64, i64* %arrayidx0, align 16<br>
@@ -381,8 +516,15 @@ define i64 @test12-2(i32* align 4 %p) {<br>
 }<br>
<br>
 ; FXIME: %p should have nonnull<br>
-; ATTRIBUTOR: define void @test12-3(i32* nocapture nofree writeonly align 16 %p)<br>
 define void @test12-3(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-3<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly align 16 [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 1<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr i64, i64* [[ARRAYIDX0]], i64 3<br>
+; CHECK-NEXT:    store i64 0, i64* [[ARRAYIDX1]], align 16<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 1<br>
   %arrayidx1 = getelementptr i64, i64* %arrayidx0, i64 3<br>
@@ -390,8 +532,14 @@ define void @test12-3(i32* align 4 %p) {<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test12-4(i32* nocapture nofree nonnull writeonly align 16 dereferenceable(8) %p)<br>
 define void @test12-4(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-4<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 16 dereferenceable(8) [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 0<br>
+; CHECK-NEXT:    store i64 0, i64* [[ARRAYIDX0]], align 16<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 0<br>
   store i64 0, i64* %arrayidx0, align 16<br>
@@ -400,8 +548,15 @@ define void @test12-4(i32* align 4 %p) {<br>
<br>
 declare void @use(i64*) willreturn nounwind<br>
<br>
-; ATTRIBUTOR: define void @test12-5(i32* align 16 %p)<br>
 define void @test12-5(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-5<br>
+; CHECK-SAME: (i32* align 16 [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 1<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr i64, i64* [[ARRAYIDX0]], i64 3<br>
+; CHECK-NEXT:    tail call void @use(i64* align 16 [[ARRAYIDX1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 1<br>
   %arrayidx1 = getelementptr i64, i64* %arrayidx0, i64 3<br>
@@ -409,8 +564,14 @@ define void @test12-5(i32* align 4 %p) {<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test12-6(i32* align 16 %p)<br>
 define void @test12-6(i32* align 4 %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12-6<br>
+; CHECK-SAME: (i32* align 16 [[P:%.*]])<br>
+; CHECK-NEXT:    [[P_CAST:%.*]] = bitcast i32* [[P]] to i64*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i64, i64* [[P_CAST]], i64 0<br>
+; CHECK-NEXT:    tail call void @use(i64* align 16 [[ARRAYIDX0]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %p-cast = bitcast i32* %p to i64*<br>
   %arrayidx0 = getelementptr i64, i64* %p-cast, i64 0<br>
   tail call void @use(i64* align 16 %arrayidx0)<br>
@@ -418,17 +579,17 @@ define void @test12-6(i32* align 4 %p) {<br>
 }<br>
<br>
 define void @test13(i1 %c, i32* align 32 %dst) #0 {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@test13<br>
-; ATTRIBUTOR-SAME: (i1 [[C:%.*]], i32* nocapture nofree writeonly align 32 [[DST:%.*]])<br>
-; ATTRIBUTOR-NEXT:    br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
-; ATTRIBUTOR:       truebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END:%.*]]<br>
-; ATTRIBUTOR:       falsebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END]]<br>
-; ATTRIBUTOR:       end:<br>
-; ATTRIBUTOR-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST]], [[TRUEBB]] ], [ null, [[FALSEBB]] ]<br>
-; ATTRIBUTOR-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@test13<br>
+; CHECK-SAME: (i1 [[C:%.*]], i32* nocapture nofree writeonly align 32 [[DST:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
+; CHECK:       truebb:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       falsebb:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST]], [[TRUEBB]] ], [ null, [[FALSEBB]] ]<br>
+; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %c, label %truebb, label %falsebb<br>
 truebb:<br>
@@ -442,16 +603,17 @@ end:<br>
 }<br>
<br>
 define void @test13-1(i1 %c, i32* align 32 %dst) {<br>
-; ATTRIBUTOR-LABEL: @test13-1(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[C:%.*]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
-; ATTRIBUTOR:       truebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END:%.*]]<br>
-; ATTRIBUTOR:       falsebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END]]<br>
-; ATTRIBUTOR:       end:<br>
-; ATTRIBUTOR-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST:%.*]], [[TRUEBB]] ], [ inttoptr (i64 48 to i32*), [[FALSEBB]] ]<br>
-; ATTRIBUTOR-NEXT:    store i32 0, i32* [[PTR]], align 16<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@test13-1<br>
+; CHECK-SAME: (i1 [[C:%.*]], i32* nocapture nofree writeonly align 32 [[DST:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
+; CHECK:       truebb:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       falsebb:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST]], [[TRUEBB]] ], [ inttoptr (i64 48 to i32*), [[FALSEBB]] ]<br>
+; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 16<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %c, label %truebb, label %falsebb<br>
 truebb:<br>
@@ -465,16 +627,17 @@ end:<br>
 }<br>
<br>
 define void @test13-2(i1 %c, i32* align 32 %dst) {<br>
-; ATTRIBUTOR-LABEL: @test13-2(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[C:%.*]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
-; ATTRIBUTOR:       truebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END:%.*]]<br>
-; ATTRIBUTOR:       falsebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END]]<br>
-; ATTRIBUTOR:       end:<br>
-; ATTRIBUTOR-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST:%.*]], [[TRUEBB]] ], [ inttoptr (i64 160 to i32*), [[FALSEBB]] ]<br>
-; ATTRIBUTOR-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@test13-2<br>
+; CHECK-SAME: (i1 [[C:%.*]], i32* nocapture nofree writeonly align 32 [[DST:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
+; CHECK:       truebb:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       falsebb:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST]], [[TRUEBB]] ], [ inttoptr (i64 160 to i32*), [[FALSEBB]] ]<br>
+; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %c, label %truebb, label %falsebb<br>
 truebb:<br>
@@ -488,16 +651,17 @@ end:<br>
 }<br>
<br>
 define void @test13-3(i1 %c, i32* align 32 %dst) {<br>
-; ATTRIBUTOR-LABEL: @test13-3(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[C:%.*]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
-; ATTRIBUTOR:       truebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END:%.*]]<br>
-; ATTRIBUTOR:       falsebb:<br>
-; ATTRIBUTOR-NEXT:    br label [[END]]<br>
-; ATTRIBUTOR:       end:<br>
-; ATTRIBUTOR-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST:%.*]], [[TRUEBB]] ], [ inttoptr (i64 128 to i32*), [[FALSEBB]] ]<br>
-; ATTRIBUTOR-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@test13-3<br>
+; CHECK-SAME: (i1 [[C:%.*]], i32* nocapture nofree writeonly align 32 [[DST:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[TRUEBB:%.*]], label [[FALSEBB:%.*]]<br>
+; CHECK:       truebb:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       falsebb:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[PTR:%.*]] = phi i32* [ [[DST]], [[TRUEBB]] ], [ inttoptr (i64 128 to i32*), [[FALSEBB]] ]<br>
+; CHECK-NEXT:    store i32 0, i32* [[PTR]], align 32<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %c, label %truebb, label %falsebb<br>
 truebb:<br>
@@ -512,29 +676,42 @@ end:<br>
<br>
 ; Don't crash on ptr2int/int2ptr uses.<br>
 define i64 @ptr2int(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@ptr2int<br>
+; CHECK-SAME: (i32* nofree readnone [[P:%.*]])<br>
+; CHECK-NEXT:    [[P2I:%.*]] = ptrtoint i32* [[P]] to i64<br>
+; CHECK-NEXT:    ret i64 [[P2I]]<br>
+;<br>
   %p2i = ptrtoint i32* %p to i64<br>
   ret i64 %p2i<br>
 }<br>
 define i64* @int2ptr(i64 %i) {<br>
+; CHECK-LABEL: define {{[^@]+}}@int2ptr<br>
+; CHECK-SAME: (i64 [[I:%.*]])<br>
+; CHECK-NEXT:    [[I2P:%.*]] = inttoptr i64 [[I]] to i64*<br>
+; CHECK-NEXT:    ret i64* [[I2P]]<br>
+;<br>
   %i2p = inttoptr i64 %i to i64*<br>
   ret i64* %i2p<br>
 }<br>
<br>
 ; Use the store alignment only for the pointer operand.<br>
 define void @aligned_store(i8* %Value, i8** %Ptr) {<br>
-; ATTRIBUTOR: define void @aligned_store(i8* nofree writeonly %Value, i8** nocapture nofree nonnull writeonly align 32 dereferenceable(8) %Ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@aligned_store<br>
+; CHECK-SAME: (i8* nofree writeonly [[VALUE:%.*]], i8** nocapture nofree nonnull writeonly align 32 dereferenceable(8) [[PTR:%.*]])<br>
+; CHECK-NEXT:    store i8* [[VALUE]], i8** [[PTR]], align 32<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8* %Value, i8** %Ptr, align 32<br>
   ret void<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
 declare i8* @some_func(i8*)<br>
 define void @align_call_op_not_store(i8* align 2048 %arg) {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@align_call_op_not_store<br>
-; ATTRIBUTOR-SAME: (i8* align 2048 [[ARG:%.*]])<br>
-; ATTRIBUTOR-NEXT:    [[UNKNOWN:%.*]] = call i8* @some_func(i8* align 2048 [[ARG]])<br>
-; ATTRIBUTOR-NEXT:    store i8 0, i8* [[UNKNOWN]]<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@align_call_op_not_store<br>
+; CHECK-SAME: (i8* align 2048 [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[UNKNOWN:%.*]] = call i8* @some_func(i8* align 2048 [[ARG]])<br>
+; CHECK-NEXT:    store i8 0, i8* [[UNKNOWN]]<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %unknown = call i8* @some_func(i8* %arg)<br>
   store i8 0, i8* %unknown<br>
@@ -542,11 +719,11 @@ define void @align_call_op_not_store(i8* align 2048 %arg) {<br>
 }<br>
 define void @align_store_after_bc(i32* align 2048 %arg) {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@align_store_after_bc<br>
-; ATTRIBUTOR-SAME: (i32* nocapture nofree nonnull writeonly align 2048 dereferenceable(1) [[ARG:%.*]])<br>
-; ATTRIBUTOR-NEXT:    [[BC:%.*]] = bitcast i32* [[ARG]] to i8*<br>
-; ATTRIBUTOR-NEXT:    store i8 0, i8* [[BC]], align 2048<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@align_store_after_bc<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 2048 dereferenceable(1) [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[BC:%.*]] = bitcast i32* [[ARG]] to i8*<br>
+; CHECK-NEXT:    store i8 0, i8* [[BC]], align 2048<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %bc = bitcast i32* %arg to i8*<br>
   store i8 0, i8* %bc<br>
@@ -557,10 +734,35 @@ define void @align_store_after_bc(i32* align 2048 %arg) {<br>
 ; we cannot also put on the caller.<br>
 @cnd = external global i1<br>
 define i32 @musttail_callee_1(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@musttail_callee_1<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly dereferenceable(4) [[P:%.*]])<br>
+; CHECK-NEXT:    [[V:%.*]] = load i32, i32* [[P]], align 32<br>
+; CHECK-NEXT:    ret i32 [[V]]<br>
+;<br>
   %v = load i32, i32* %p, align 32<br>
   ret i32 %v<br>
 }<br>
 define i32 @musttail_caller_1(i32* %p) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@musttail_caller_1<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[C:%.*]] = load i1, i1* @cnd, align 1<br>
+; IS__TUNIT____-NEXT:    br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]]<br>
+; IS__TUNIT____:       mt:<br>
+; IS__TUNIT____-NEXT:    [[V:%.*]] = musttail call i32 @musttail_callee_1(i32* nocapture nofree readonly [[P]])<br>
+; IS__TUNIT____-NEXT:    ret i32 [[V]]<br>
+; IS__TUNIT____:       exit:<br>
+; IS__TUNIT____-NEXT:    ret i32 0<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@musttail_caller_1<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree readonly [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = load i1, i1* @cnd, align 1<br>
+; IS__CGSCC____-NEXT:    br i1 [[C]], label [[MT:%.*]], label [[EXIT:%.*]]<br>
+; IS__CGSCC____:       mt:<br>
+; IS__CGSCC____-NEXT:    [[V:%.*]] = musttail call i32 @musttail_callee_1(i32* nocapture nofree nonnull readonly dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[V]]<br>
+; IS__CGSCC____:       exit:<br>
+; IS__CGSCC____-NEXT:    ret i32 0<br>
+;<br>
   %c = load i1, i1* @cnd<br>
   br i1 %c, label %mt, label %exit<br>
 mt:<br>
@@ -569,7 +771,6 @@ mt:<br>
 exit:<br>
   ret i32 0<br>
 }<br>
-; UTC_ARGS: --disable<br>
<br>
 attributes #0 = { nounwind uwtable noinline }<br>
 attributes #1 = { uwtable noinline }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/alwaysinline.ll b/llvm/test/Transforms/Attributor/alwaysinline.ll<br>
index 1be433310457..91a7e8fd21b5 100644<br>
--- a/llvm/test/Transforms/Attributor/alwaysinline.ll<br>
+++ b/llvm/test/Transforms/Attributor/alwaysinline.ll<br>
@@ -1,14 +1,18 @@<br>
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
-; RUN: opt -attributor -attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefix=CHECK<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ; When a function is marked `alwaysinline` and is able to be inlined,<br>
 ; we can IPO its boundaries<br>
<br>
 ; the function is not exactly defined, and marked alwaysinline and can be inlined,<br>
 ; so the function can be analyzed<br>
-; CHECK: Function Attrs: alwaysinline nofree nosync nounwind readnone willreturn<br>
+; CHECK: Function Attrs: alwaysinline<br>
+; CHECK-SAME: willreturn<br>
 define linkonce void @inner1() alwaysinline {<br>
-; CHECK-LABEL: @inner1(<br>
+; CHECK-LABEL: define {{[^@]+}}@inner1()<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    ret void<br>
 ;<br>
@@ -16,9 +20,10 @@ entry:<br>
   ret void<br>
 }<br>
<br>
-; CHECK: Function Attrs: nofree nosync nounwind readnone willreturn<br>
+; CHECK: Function Attrs:<br>
+; CHECK-SAME: willreturn<br>
 define void @outer1() {<br>
-; CHECK-LABEL: @outer1(<br>
+; CHECK-LABEL: define {{[^@]+}}@outer1()<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    ret void<br>
 ;<br>
@@ -31,7 +36,7 @@ entry:<br>
 ; so it will not be analyzed<br>
 ; CHECK-NOT: Function Attrs:<br>
 define linkonce i32 @inner2() {<br>
-; CHECK-LABEL: @inner2(<br>
+; CHECK-LABEL: define {{[^@]+}}@inner2()<br>
 ; CHECK-NEXT:  entry:<br>
 ; CHECK-NEXT:    ret i32 1<br>
 ;<br>
@@ -41,9 +46,9 @@ entry:<br>
<br>
 ; CHECK-NOT: Function Attrs<br>
 define i32 @outer2() {<br>
-; CHECK-LABEL: @outer2(<br>
+; CHECK-LABEL: define {{[^@]+}}@outer2()<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[R:%.*]] = call i32 @inner2() #2<br>
+; CHECK-NEXT:    [[R:%.*]] = call i32 @inner2()<br>
 ; CHECK-NEXT:    ret i32 [[R]]<br>
 ;<br>
 entry:<br>
@@ -55,11 +60,15 @@ entry:<br>
 ; it is `unexactly defined` and alwaysinline but cannot be inlined.<br>
 ; so it will not be analyzed<br>
 ; CHECK: Function Attrs:<br>
-; CHECK-NOT: nofree nosync nounwind readnone<br>
+; CHECK-NOT: nofree<br>
+; CHECK-NOT: nosync<br>
+; CHECK-NOT: nounwind<br>
+; CHECK-NOT: readnone<br>
 define linkonce i32 @inner3(i8* %addr) alwaysinline {<br>
-; CHECK-LABEL: @inner3(<br>
+; CHECK-LABEL: define {{[^@]+}}@inner3<br>
+; CHECK-SAME: (i8* [[ADDR:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    indirectbr i8* [[ADDR:%.*]], [label [[ONE:%.*]], label %two]<br>
+; CHECK-NEXT:    indirectbr i8* [[ADDR]], [label [[ONE:%.*]], label %two]<br>
 ; CHECK:       one:<br>
 ; CHECK-NEXT:    ret i32 42<br>
 ; CHECK:       two:<br>
@@ -77,8 +86,9 @@ two:<br>
<br>
 ; CHECK-NOT: Function Attrs:<br>
 define i32 @outer3(i32 %x) {<br>
-; CHECK-LABEL: @outer3(<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X:%.*]], 42<br>
+; CHECK-LABEL: define {{[^@]+}}@outer3<br>
+; CHECK-SAME: (i32 [[X:%.*]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[X]], 42<br>
 ; CHECK-NEXT:    [[ADDR:%.*]] = select i1 [[CMP]], i8* blockaddress(@inner3, [[ONE:%.*]]), i8* blockaddress(@inner3, [[TWO:%.*]])<br>
 ; CHECK-NEXT:    [[CALL:%.*]] = call i32 @inner3(i8* [[ADDR]])<br>
 ; CHECK-NEXT:    ret i32 [[CALL]]<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/callbacks.ll b/llvm/test/Transforms/Attributor/callbacks.ll<br>
index 12af0c8e1a7e..d6efa5326c68 100644<br>
--- a/llvm/test/Transforms/Attributor/callbacks.ll<br>
+++ b/llvm/test/Transforms/Attributor/callbacks.ll<br>
@@ -1,8 +1,9 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; FIXME: Add -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations below.<br>
-;        This flag was removed because max iterations is 2 in most cases, but in windows it is 1.<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-annotate-decl-cs < %s | FileCheck %s<br>
-; ModuleID = 'callback_simple.c'<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
 ; Test 0<br>
@@ -15,19 +16,54 @@ target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16<br>
 ; transfer in both directions.<br>
<br>
 define void @t0_caller(i32* %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t0_caller<br>
-; CHECK-SAME: (i32* align 256 [[A:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
-; CHECK-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
-; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
-; CHECK-NEXT:    store i32 42, i32* [[B]], align 32<br>
-; CHECK-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
-; CHECK-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@t0_caller<br>
+; IS__TUNIT_OPM-SAME: (i32* align 256 [[A:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* align 256 [[A]], i64 undef, i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t0_caller<br>
+; IS__TUNIT_NPM-SAME: (i32* align 256 [[A:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@t0_caller<br>
+; IS__CGSCC_OPM-SAME: (i32* [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* [[A]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t0_caller<br>
+; IS__CGSCC_NPM-SAME: (i32* align 256 [[A:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t0_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t0_callback_callee to void (i32*, i32*, ...)*), i32* align 256 [[A]], i64 99, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
-<br>
 entry:<br>
   %b = alloca i32, align 32<br>
   %c = alloca i32*, align 64<br>
@@ -42,14 +78,33 @@ entry:<br>
 ; Note that the first two arguments are provided by the callback_broker according to the callback in !1 below!<br>
 ; The others are annotated with alignment information, amongst others, or even replaced by the constants passed to the call.<br>
 define internal void @t0_callback_callee(i32* %is_not_null, i32* %ptr, i32* %a, i64 %b, i32** %c) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t0_callback_callee<br>
-; CHECK-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
-; CHECK-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
-; CHECK-NEXT:    tail call void @t0_check(i32* align 256 [[A]], i64 99, i32* [[TMP0]])<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS________OPM-LABEL: define {{[^@]+}}@t0_callback_callee<br>
+; IS________OPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS________OPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS________OPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS________OPM-NEXT:    tail call void @t0_check(i32* align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t0_callback_callee<br>
+; IS__TUNIT_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    tail call void @t0_check(i32* align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t0_callback_callee<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 8 dereferenceable(8) [[C:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    tail call void @t0_check(i32* align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %ptr_val = load i32, i32* %ptr, align 8<br>
@@ -69,17 +124,53 @@ declare !callback !0 void @t0_callback_broker(i32*, i32*, void (i32*, i32*, ...)<br>
 ; we deduce and propagate noalias and others properly.<br>
<br>
 define void @t1_caller(i32* noalias %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t1_caller<br>
-; CHECK-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
-; CHECK-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
-; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
-; CHECK-NEXT:    store i32 42, i32* [[B]], align 32<br>
-; CHECK-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
-; CHECK-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t1_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t1_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@t1_caller<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t1_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t1_callback_callee to void (i32*, i32*, ...)*), i32* nocapture align 256 [[A]], i64 undef, i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t1_caller<br>
+; IS__TUNIT_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t1_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t1_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@t1_caller<br>
+; IS__CGSCC_OPM-SAME: (i32* noalias [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t1_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t1_callback_callee to void (i32*, i32*, ...)*), i32* [[A]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t1_caller<br>
+; IS__CGSCC_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t1_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t1_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 99, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %b = alloca i32, align 32<br>
@@ -95,14 +186,33 @@ entry:<br>
 ; Note that the first two arguments are provided by the callback_broker according to the callback in !1 below!<br>
 ; The others are annotated with alignment information, amongst others, or even replaced by the constants passed to the call.<br>
 define internal void @t1_callback_callee(i32* %is_not_null, i32* %ptr, i32* %a, i64 %b, i32** %c) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t1_callback_callee<br>
-; CHECK-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* noalias nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
-; CHECK-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
-; CHECK-NEXT:    tail call void @t1_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS________OPM-LABEL: define {{[^@]+}}@t1_callback_callee<br>
+; IS________OPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS________OPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS________OPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS________OPM-NEXT:    tail call void @t1_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t1_callback_callee<br>
+; IS__TUNIT_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* noalias nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    tail call void @t1_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t1_callback_callee<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 8 dereferenceable(8) [[C:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    tail call void @t1_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %ptr_val = load i32, i32* %ptr, align 8<br>
@@ -121,17 +231,53 @@ declare !callback !0 void @t1_callback_broker(i32* nocapture , i32* nocapture ,<br>
 ; Similar to test 1 but checking that the noalias is only placed if potential synchronization through @t2_check is preserved.<br>
<br>
 define void @t2_caller(i32* noalias %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t2_caller<br>
-; CHECK-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
-; CHECK-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
-; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
-; CHECK-NEXT:    store i32 42, i32* [[B]], align 32<br>
-; CHECK-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
-; CHECK-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t2_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t2_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@t2_caller<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t2_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t2_callback_callee to void (i32*, i32*, ...)*), i32* nocapture align 256 [[A]], i64 undef, i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t2_caller<br>
+; IS__TUNIT_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t2_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t2_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@t2_caller<br>
+; IS__CGSCC_OPM-SAME: (i32* noalias [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t2_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t2_callback_callee to void (i32*, i32*, ...)*), i32* [[A]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t2_caller<br>
+; IS__CGSCC_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t2_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t2_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 99, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %b = alloca i32, align 32<br>
@@ -149,14 +295,33 @@ entry:<br>
 ;<br>
 ; FIXME: We should derive noalias for %a and add a "fake use" of %a in all potentially synchronizing calls.<br>
 define internal void @t2_callback_callee(i32* %is_not_null, i32* %ptr, i32* %a, i64 %b, i32** %c) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t2_callback_callee<br>
-; CHECK-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
-; CHECK-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
-; CHECK-NEXT:    tail call void @t2_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS________OPM-LABEL: define {{[^@]+}}@t2_callback_callee<br>
+; IS________OPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS________OPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS________OPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS________OPM-NEXT:    tail call void @t2_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t2_callback_callee<br>
+; IS__TUNIT_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    tail call void @t2_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t2_callback_callee<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 8 dereferenceable(8) [[C:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    tail call void @t2_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %ptr_val = load i32, i32* %ptr, align 8<br>
@@ -175,18 +340,57 @@ declare !callback !0 void @t2_callback_broker(i32* nocapture , i32* nocapture ,<br>
 ; Basically test 2 with the casted callback callee used twice.<br>
<br>
 define void @t3_caller(i32* noalias %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t3_caller<br>
-; CHECK-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
-; CHECK-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
-; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
-; CHECK-NEXT:    store i32 42, i32* [[B]], align 32<br>
-; CHECK-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
-; CHECK-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
-; CHECK-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@t3_caller<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* nocapture align 256 [[A]], i64 undef, i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* nocapture align 256 [[A]], i64 undef, i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t3_caller<br>
+; IS__TUNIT_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__TUNIT_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__TUNIT_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__TUNIT_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* nonnull bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 undef, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@t3_caller<br>
+; IS__CGSCC_OPM-SAME: (i32* noalias [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_OPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_OPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_OPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* [[A]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_OPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* [[A]], i64 99, i32** nonnull align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t3_caller<br>
+; IS__CGSCC_NPM-SAME: (i32* noalias nocapture align 256 [[A:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[B:%.*]] = alloca i32, align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[C:%.*]] = alloca i32*, align 64<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR:%.*]] = alloca i32, align 128<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = bitcast i32* [[B]] to i8*<br>
+; IS__CGSCC_NPM-NEXT:    store i32 42, i32* [[B]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    store i32* [[B]], i32** [[C]], align 64<br>
+; IS__CGSCC_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 99, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_NPM-NEXT:    call void (i32*, i32*, void (i32*, i32*, ...)*, ...) @t3_callback_broker(i32* noalias align 536870912 null, i32* noalias nonnull align 128 dereferenceable(4) [[PTR]], void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32*, i64, i32**)* @t3_callback_callee to void (i32*, i32*, ...)*), i32* noalias nocapture align 256 [[A]], i64 99, i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %b = alloca i32, align 32<br>
@@ -205,14 +409,33 @@ entry:<br>
 ;<br>
 ; FIXME: We should derive noalias for %a and add a "fake use" of %a in all potentially synchronizing calls.<br>
 define internal void @t3_callback_callee(i32* %is_not_null, i32* %ptr, i32* %a, i64 %b, i32** %c) {<br>
-; CHECK-LABEL: define {{[^@]+}}@t3_callback_callee<br>
-; CHECK-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
-; CHECK-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
-; CHECK-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
-; CHECK-NEXT:    tail call void @t3_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS________OPM-LABEL: define {{[^@]+}}@t3_callback_callee<br>
+; IS________OPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS________OPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS________OPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS________OPM-NEXT:    tail call void @t3_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@t3_callback_callee<br>
+; IS__TUNIT_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** noalias nocapture nonnull readonly align 64 dereferenceable(8) [[C:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 64<br>
+; IS__TUNIT_NPM-NEXT:    tail call void @t3_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__TUNIT_NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@t3_callback_callee<br>
+; IS__CGSCC_NPM-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[IS_NOT_NULL:%.*]], i32* nocapture nonnull readonly align 8 dereferenceable(4) [[PTR:%.*]], i32* nocapture align 256 [[A:%.*]], i64 [[B:%.*]], i32** nocapture nonnull readonly align 8 dereferenceable(8) [[C:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:  entry:<br>
+; IS__CGSCC_NPM-NEXT:    [[PTR_VAL:%.*]] = load i32, i32* [[PTR]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    store i32 [[PTR_VAL]], i32* [[IS_NOT_NULL]], align 4<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP0:%.*]] = load i32*, i32** [[C]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    tail call void @t3_check(i32* nocapture align 256 [[A]], i64 99, i32* [[TMP0]])<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %ptr_val = load i32, i32* %ptr, align 8<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/dereferenceable-1.ll b/llvm/test/Transforms/Attributor/dereferenceable-1.ll<br>
index 7a6de53f3f69..a1da5fbe2d7c 100644<br>
--- a/llvm/test/Transforms/Attributor/dereferenceable-1.ll<br>
+++ b/llvm/test/Transforms/Attributor/dereferenceable-1.ll<br>
@@ -1,16 +1,22 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor -attributor-manifest-internal --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=16 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ; FIXME: Figure out why we need 16 iterations here.<br>
<br>
-; UTC_ARGS: --disable<br>
-<br>
 declare void @deref_phi_user(i32* %a);<br>
<br>
 ; TEST 1<br>
 ; take mininimum of return values<br>
 ;<br>
 define i32* @test1(i32* dereferenceable(4) %0, double* dereferenceable(8) %1, i1 zeroext %2) local_unnamed_addr {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(4) i32* @test1(i32* nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" %0, double* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" %1, i1 zeroext %2)<br>
+; CHECK-LABEL: define {{[^@]+}}@test1<br>
+; CHECK-SAME: (i32* nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[TMP0:%.*]], double* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1:%.*]], i1 zeroext [[TMP2:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast double* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i32* [[TMP0]], i32* [[TMP4]]<br>
+; CHECK-NEXT:    ret i32* [[TMP5]]<br>
+;<br>
   %4 = bitcast double* %1 to i32*<br>
   %5 = select i1 %2, i32* %0, i32* %4<br>
   ret i32* %5<br>
@@ -18,7 +24,12 @@ define i32* @test1(i32* dereferenceable(4) %0, double* dereferenceable(8) %1, i1<br>
<br>
 ; TEST 2<br>
 define i32* @test2(i32* dereferenceable_or_null(4) %0, double* dereferenceable(8) %1, i1 zeroext %2) local_unnamed_addr {<br>
-; ATTRIBUTOR: define dereferenceable_or_null(4) i32* @test2(i32* nofree readnone dereferenceable_or_null(4) "no-capture-maybe-returned" %0, double* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" %1, i1 zeroext %2)<br>
+; CHECK-LABEL: define {{[^@]+}}@test2<br>
+; CHECK-SAME: (i32* nofree readnone dereferenceable_or_null(4) "no-capture-maybe-returned" [[TMP0:%.*]], double* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1:%.*]], i1 zeroext [[TMP2:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast double* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = select i1 [[TMP2]], i32* [[TMP0]], i32* [[TMP4]]<br>
+; CHECK-NEXT:    ret i32* [[TMP5]]<br>
+;<br>
   %4 = bitcast double* %1 to i32*<br>
   %5 = select i1 %2, i32* %0, i32* %4<br>
   ret i32* %5<br>
@@ -27,19 +38,33 @@ define i32* @test2(i32* dereferenceable_or_null(4) %0, double* dereferenceable(8<br>
 ; TEST 3<br>
 ; GEP inbounds<br>
 define i32* @test3_1(i32* dereferenceable(8) %0) local_unnamed_addr {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(4) i32* @test3_1(i32* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@test3_1<br>
+; CHECK-SAME: (i32* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[RET:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 1<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = getelementptr inbounds i32, i32* %0, i64 1<br>
   ret i32* %ret<br>
 }<br>
<br>
 define i32* @test3_2(i32* dereferenceable_or_null(32) %0) local_unnamed_addr {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(16) i32* @test3_2(i32* nofree readnone dereferenceable_or_null(32) "no-capture-maybe-returned" %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@test3_2<br>
+; CHECK-SAME: (i32* nofree readnone dereferenceable_or_null(32) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[RET:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 4<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret = getelementptr inbounds i32, i32* %0, i64 4<br>
   ret i32* %ret<br>
 }<br>
<br>
 define i32* @test3_3(i32* dereferenceable(8) %0, i32* dereferenceable(16) %1, i1 %2) local_unnamed_addr {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(4) i32* @test3_3(i32* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" %0, i32* nofree nonnull readnone dereferenceable(16) "no-capture-maybe-returned" %1, i1 %2) local_unnamed_addr<br>
+; CHECK-LABEL: define {{[^@]+}}@test3_3<br>
+; CHECK-SAME: (i32* nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]], i32* nofree nonnull readnone dereferenceable(16) "no-capture-maybe-returned" [[TMP1:%.*]], i1 [[TMP2:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[RET1:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 1<br>
+; CHECK-NEXT:    [[RET2:%.*]] = getelementptr inbounds i32, i32* [[TMP1]], i64 2<br>
+; CHECK-NEXT:    [[RET:%.*]] = select i1 [[TMP2]], i32* [[RET1]], i32* [[RET2]]<br>
+; CHECK-NEXT:    ret i32* [[RET]]<br>
+;<br>
   %ret1 = getelementptr inbounds i32, i32* %0, i64 1<br>
   %ret2 = getelementptr inbounds i32, i32* %1, i64 2<br>
   %ret = select i1 %2, i32* %ret1, i32* %ret2<br>
@@ -50,20 +75,44 @@ define i32* @test3_3(i32* dereferenceable(8) %0, i32* dereferenceable(16) %1, i1<br>
 ; Better than known in IR.<br>
<br>
 define dereferenceable(4) i32* @test4(i32* dereferenceable(8) %0) local_unnamed_addr {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(8) i32* @test4(i32* nofree nonnull readnone returned dereferenceable(8) "no-capture-maybe-returned" %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@test4<br>
+; CHECK-SAME: (i32* nofree nonnull readnone returned dereferenceable(8) "no-capture-maybe-returned" [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    ret i32* [[TMP0]]<br>
+;<br>
   ret i32* %0<br>
 }<br>
<br>
 ; TEST 5<br>
 ; loop in which dereferenceabily "grows"<br>
 define void @deref_phi_growing(i32* dereferenceable(4000) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@deref_phi_growing<br>
+; CHECK-SAME: (i32* nonnull dereferenceable(4000) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]<br>
+; CHECK:       for.cond:<br>
+; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]<br>
+; CHECK-NEXT:    [[A_ADDR_0:%.*]] = phi i32* [ [[A]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ]<br>
+; CHECK-NEXT:    call void @deref_phi_user(i32* nonnull dereferenceable(4000) [[A_ADDR_0]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = load i32, i32* [[A_ADDR_0]], align 4<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_0]], [[TMP]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    br label [[FOR_END:%.*]]<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    br label [[FOR_INC]]<br>
+; CHECK:       for.inc:<br>
+; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_0]], i64 -1<br>
+; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_0]], 1<br>
+; CHECK-NEXT:    br label [[FOR_COND]]<br>
+; CHECK:       for.end:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   br label %for.cond<br>
<br>
 for.cond:                                         ; preds = %for.inc, %entry<br>
   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]<br>
   %a.addr.0 = phi i32* [ %a, %entry ], [ %incdec.ptr, %for.inc ]<br>
-; ATTRIBUTOR: call void @deref_phi_user(i32* nonnull dereferenceable(4000) %a.addr.0)<br>
   call void @deref_phi_user(i32* %a.addr.0)<br>
   %tmp = load i32, i32* %a.addr.0, align 4<br>
   %cmp = icmp slt i32 %i.0, %tmp<br>
@@ -87,13 +136,34 @@ for.end:                                          ; preds = %for.cond.cleanup<br>
 ; TEST 6<br>
 ; loop in which dereferenceabily "shrinks"<br>
 define void @deref_phi_shrinking(i32* dereferenceable(4000) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@deref_phi_shrinking<br>
+; CHECK-SAME: (i32* nonnull dereferenceable(4000) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]<br>
+; CHECK:       for.cond:<br>
+; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ]<br>
+; CHECK-NEXT:    [[A_ADDR_0:%.*]] = phi i32* [ [[A]], [[ENTRY]] ], [ [[INCDEC_PTR:%.*]], [[FOR_INC]] ]<br>
+; CHECK-NEXT:    call void @deref_phi_user(i32* nonnull [[A_ADDR_0]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = load i32, i32* [[A_ADDR_0]], align 4<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_0]], [[TMP]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    br label [[FOR_END:%.*]]<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    br label [[FOR_INC]]<br>
+; CHECK:       for.inc:<br>
+; CHECK-NEXT:    [[INCDEC_PTR]] = getelementptr inbounds i32, i32* [[A_ADDR_0]], i64 1<br>
+; CHECK-NEXT:    [[INC]] = add nuw nsw i32 [[I_0]], 1<br>
+; CHECK-NEXT:    br label [[FOR_COND]]<br>
+; CHECK:       for.end:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   br label %for.cond<br>
<br>
 for.cond:                                         ; preds = %for.inc, %entry<br>
   %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]<br>
   %a.addr.0 = phi i32* [ %a, %entry ], [ %incdec.ptr, %for.inc ]<br>
-; ATTRIBUTOR: call void @deref_phi_user(i32* nonnull %a.addr.0)<br>
   call void @deref_phi_user(i32* %a.addr.0)<br>
   %tmp = load i32, i32* %a.addr.0, align 4<br>
   %cmp = icmp slt i32 %i.0, %tmp<br>
@@ -119,96 +189,108 @@ for.end:                                          ; preds = %for.cond.cleanup<br>
 declare i32* @unkown_ptr() willreturn nounwind<br>
 declare i32 @unkown_f(i32*) willreturn nounwind<br>
 define i32* @f7_0(i32* %ptr) {<br>
-; ATTRIBUTOR: define nonnull dereferenceable(8) i32* @f7_0(i32* nonnull returned dereferenceable(8) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@f7_0<br>
+; CHECK-SAME: (i32* nonnull returned dereferenceable(8) [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[T:%.*]] = tail call i32 @unkown_f(i32* nonnull dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    ret i32* [[PTR]]<br>
+;<br>
   %T = tail call i32 @unkown_f(i32* dereferenceable(8) %ptr)<br>
   ret i32* %ptr<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @f7_1(i32* nonnull align 4 dereferenceable(4) %ptr, i1 %c)<br>
 define void @f7_1(i32* %ptr, i1 %c) {<br>
-<br>
-; ATTRIBUTOR:   %A = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@f7_1<br>
+; CHECK-SAME: (i32* nonnull align 4 dereferenceable(4) [[PTR:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:    [[A:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])<br>
+; CHECK-NEXT:    [[B:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK:       if.true:<br>
+; CHECK-NEXT:    [[C:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    [[D:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    [[E:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       if.false:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %A = tail call i32 @unkown_f(i32* %ptr)<br>
-<br>
   %ptr.0 = load i32, i32* %ptr<br>
   ; deref 4 hold<br>
-<br>
 ; FIXME: this should be %B = tail call i32 @unkown_f(i32* nonnull dereferenceable(4) %ptr)<br>
-; ATTRIBUTOR:   %B = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) %ptr)<br>
   %B = tail call i32 @unkown_f(i32* dereferenceable(1) %ptr)<br>
-<br>
   br i1%c, label %if.true, label %if.false<br>
 if.true:<br>
-; ATTRIBUTOR:   %C = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
   %C = tail call i32 @unkown_f(i32* %ptr)<br>
-<br>
-; ATTRIBUTOR:   %D = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
   %D = tail call i32 @unkown_f(i32* dereferenceable(8) %ptr)<br>
-<br>
-; ATTRIBUTOR:   %E = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
   %E = tail call i32 @unkown_f(i32* %ptr)<br>
-<br>
   ret void<br>
-<br>
 if.false:<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @f7_2(i1 %c)<br>
 define void @f7_2(i1 %c) {<br>
-<br>
+; CHECK-LABEL: define {{[^@]+}}@f7_2<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    [[PTR:%.*]] = tail call nonnull align 4 dereferenceable(4) i32* @unkown_ptr()<br>
+; CHECK-NEXT:    [[A:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])<br>
+; CHECK-NEXT:    [[B:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK:       if.true:<br>
+; CHECK-NEXT:    [[C:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    [[D:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    [[E:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       if.false:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr =  tail call i32* @unkown_ptr()<br>
-<br>
-; ATTRIBUTOR:   %A = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) %ptr)<br>
   %A = tail call i32 @unkown_f(i32* %ptr)<br>
-<br>
   %arg_a.0 = load i32, i32* %ptr<br>
   ; deref 4 hold<br>
-<br>
-; ATTRIBUTOR:   %B = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) %ptr)<br>
   %B = tail call i32 @unkown_f(i32* dereferenceable(1) %ptr)<br>
-<br>
   br i1%c, label %if.true, label %if.false<br>
 if.true:<br>
-<br>
-; ATTRIBUTOR:   %C = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
   %C = tail call i32 @unkown_f(i32* %ptr)<br>
-<br>
-; ATTRIBUTOR:   %D = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
   %D = tail call i32 @unkown_f(i32* dereferenceable(8) %ptr)<br>
-<br>
   %E = tail call i32 @unkown_f(i32* %ptr)<br>
-; ATTRIBUTOR:   %E = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) %ptr)<br>
-<br>
   ret void<br>
-<br>
 if.false:<br>
   ret void<br>
 }<br>
<br>
 define i32* @f7_3() {<br>
-; ATTRIBUTOR: define nonnull align 16 dereferenceable(4) i32* @f7_3()<br>
+; CHECK-LABEL: define {{[^@]+}}@f7_3()<br>
+; CHECK-NEXT:    [[PTR:%.*]] = tail call nonnull align 16 dereferenceable(4) i32* @unkown_ptr()<br>
+; CHECK-NEXT:    store i32 10, i32* [[PTR]], align 16<br>
+; CHECK-NEXT:    ret i32* [[PTR]]<br>
+;<br>
   %ptr = tail call i32* @unkown_ptr()<br>
   store i32 10, i32* %ptr, align 16<br>
   ret i32* %ptr<br>
 }<br>
<br>
-define i32* @test_for_minus_index(i32* %p) {<br>
 ; FIXME: This should have a return dereferenceable(8) but we need to make sure it will work in loops as well.<br>
-; ATTRIBUTOR: define nonnull align 4 i32* @test_for_minus_index(i32* nofree nonnull writeonly align 4 "no-capture-maybe-returned" %p)<br>
+define i32* @test_for_minus_index(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_for_minus_index<br>
+; CHECK-SAME: (i32* nofree nonnull writeonly align 4 "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 -2<br>
+; CHECK-NEXT:    store i32 1, i32* [[Q]], align 4<br>
+; CHECK-NEXT:    ret i32* [[Q]]<br>
+;<br>
   %q = getelementptr inbounds i32, i32* %p, i32 -2<br>
   store i32 1, i32* %q<br>
   ret i32* %q<br>
 }<br>
<br>
 define void @deref_or_null_and_nonnull(i32* dereferenceable_or_null(100) %0) {<br>
-; ATTRIBUTOR: define void @deref_or_null_and_nonnull(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(100) %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@deref_or_null_and_nonnull<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(100) [[TMP0:%.*]])<br>
+; CHECK-NEXT:    store i32 1, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32 1, i32* %0<br>
   ret void<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
-<br>
 ; TEST 8<br>
 ; Use Constant range in deereferenceable<br>
 ; void g(int *p, long long int *range){<br>
@@ -223,24 +305,24 @@ define void @deref_or_null_and_nonnull(i32* dereferenceable_or_null(100) %0) {<br>
 ;   }<br>
 ; }<br>
<br>
+; NOTE: %p should not be dereferenceable<br>
 define internal void @fill_range_not_inbounds(i32* %p, i64 %start){<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@fill_range_not_inbounds<br>
-; ATTRIBUTOR-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]])<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    [[TMP0:%.*]] = add nsw i64 [[START]], 9<br>
-; ATTRIBUTOR-NEXT:    br label [[FOR_BODY:%.*]]<br>
-; ATTRIBUTOR:       for.cond.cleanup:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
-; ATTRIBUTOR:       for.body:<br>
-; ATTRIBUTOR-NEXT:    [[I_06:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]<br>
-; ATTRIBUTOR-NEXT:    [[CONV:%.*]] = trunc i64 [[I_06]] to i32<br>
-; ATTRIBUTOR-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, i32* [[P]], i64 [[I_06]]<br>
-; ATTRIBUTOR-NEXT:    store i32 [[CONV]], i32* [[ARRAYIDX]], align 4<br>
-; ATTRIBUTOR-NEXT:    [[INC]] = add nsw i64 [[I_06]], 1<br>
-; ATTRIBUTOR-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I_06]], [[TMP0]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK-LABEL: define {{[^@]+}}@fill_range_not_inbounds<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = add nsw i64 [[START]], 9<br>
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    [[I_06:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]<br>
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[I_06]] to i32<br>
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr i32, i32* [[P]], i64 [[I_06]]<br>
+; CHECK-NEXT:    store i32 [[CONV]], i32* [[ARRAYIDX]], align 4<br>
+; CHECK-NEXT:    [[INC]] = add nsw i64 [[I_06]], 1<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I_06]], [[TMP0]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]<br>
 ;<br>
-; NOTE: %p should not be dereferenceable<br>
 entry:<br>
   %0 = add nsw i64 %start, 9<br>
   br label %for.body<br>
@@ -257,24 +339,25 @@ for.body:                                         ; preds = %entry, %for.body<br>
   %cmp = icmp slt i64 %i.06, %0<br>
   br i1 %cmp, label %for.body, label %for.cond.cleanup<br>
 }<br>
+<br>
+; FIXME: %p should be dereferenceable(40)<br>
 define internal void @fill_range_inbounds(i32* %p, i64 %start){<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@fill_range_inbounds<br>
-; ATTRIBUTOR-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]])<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    [[TMP0:%.*]] = add nsw i64 [[START]], 9<br>
-; ATTRIBUTOR-NEXT:    br label [[FOR_BODY:%.*]]<br>
-; ATTRIBUTOR:       for.cond.cleanup:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
-; ATTRIBUTOR:       for.body:<br>
-; ATTRIBUTOR-NEXT:    [[I_06:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]<br>
-; ATTRIBUTOR-NEXT:    [[CONV:%.*]] = trunc i64 [[I_06]] to i32<br>
-; ATTRIBUTOR-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 [[I_06]]<br>
-; ATTRIBUTOR-NEXT:    store i32 [[CONV]], i32* [[ARRAYIDX]], align 4<br>
-; ATTRIBUTOR-NEXT:    [[INC]] = add nsw i64 [[I_06]], 1<br>
-; ATTRIBUTOR-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I_06]], [[TMP0]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK-LABEL: define {{[^@]+}}@fill_range_inbounds<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64 [[START:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = add nsw i64 [[START]], 9<br>
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    [[I_06:%.*]] = phi i64 [ [[START]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]<br>
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[I_06]] to i32<br>
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[P]], i64 [[I_06]]<br>
+; CHECK-NEXT:    store i32 [[CONV]], i32* [[ARRAYIDX]], align 4<br>
+; CHECK-NEXT:    [[INC]] = add nsw i64 [[I_06]], 1<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[I_06]], [[TMP0]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_COND_CLEANUP:%.*]]<br>
 ;<br>
-; FIXME: %p should be dereferenceable(40)<br>
 entry:<br>
   %0 = add nsw i64 %start, 9<br>
   br label %for.body<br>
@@ -293,13 +376,13 @@ for.body:                                         ; preds = %entry, %for.body<br>
 }<br>
<br>
 define void @call_fill_range(i32* nocapture %p, i64* nocapture readonly %range) {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@call_fill_range<br>
-; ATTRIBUTOR-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]])<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    [[TMP0:%.*]] = load i64, i64* [[RANGE]], align 8, !range !0<br>
-; ATTRIBUTOR-NEXT:    tail call void @fill_range_inbounds(i32* nocapture nofree writeonly [[P]], i64 [[TMP0]])<br>
-; ATTRIBUTOR-NEXT:    tail call void @fill_range_not_inbounds(i32* nocapture nofree writeonly [[P]], i64 [[TMP0]])<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_fill_range<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly [[P:%.*]], i64* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[RANGE:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i64, i64* [[RANGE]], align 8, !range !0<br>
+; CHECK-NEXT:    tail call void @fill_range_inbounds(i32* nocapture nofree writeonly [[P]], i64 [[TMP0]])<br>
+; CHECK-NEXT:    tail call void @fill_range_not_inbounds(i32* nocapture nofree writeonly [[P]], i64 [[TMP0]])<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %0 = load i64, i64* %range, align 8, !range !0<br>
@@ -312,6 +395,7 @@ declare void @use0() willreturn nounwind<br>
 declare void @use1(i8*) willreturn nounwind<br>
 declare void @use2(i8*, i8*) willreturn nounwind<br>
 declare void @use3(i8*, i8*, i8*) willreturn nounwind<br>
+<br>
 ; simple path test<br>
 ; if(..)<br>
 ;   fun2(dereferenceable(8) %a, dereferenceable(8) %b)<br>
@@ -319,7 +403,17 @@ declare void @use3(i8*, i8*, i8*) willreturn nounwind<br>
 ;   fun2(dereferenceable(4) %a, %b)<br>
 ; We can say that %a is dereferenceable(4) but %b is not.<br>
 define void @simple-path(i8* %a, i8 * %b, i8 %c) {<br>
-; ATTRIBUTOR: define void @simple-path(i8* nonnull dereferenceable(4) %a, i8* %b, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@simple-path<br>
+; CHECK-SAME: (i8* nonnull dereferenceable(4) [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    tail call void @use2(i8* nonnull dereferenceable(8) [[A]], i8* nonnull dereferenceable(8) [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    tail call void @use2(i8* nonnull dereferenceable(4) [[A]], i8* [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp = icmp eq i8 %c, 0<br>
   br i1 %cmp, label %if.then, label %if.else<br>
 if.then:<br>
@@ -329,6 +423,7 @@ if.else:<br>
   tail call void @use2(i8* dereferenceable(4) %a, i8* %b)<br>
   ret void<br>
 }<br>
+<br>
 ; More complex test<br>
 ; {<br>
 ; fun1(dereferenceable(4) %a)<br>
@@ -341,9 +436,22 @@ if.else:<br>
 ; fun1(dereferenceable(8) %a)<br>
 ; }<br>
 ; %a is dereferenceable(12)<br>
-<br>
 define void @complex-path(i8* %a, i8* %b, i8 %c) {<br>
-; ATTRIBUTOR: define void @complex-path(i8* nonnull dereferenceable(12) %a, i8* nocapture nofree readnone %b, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@complex-path<br>
+; CHECK-SAME: (i8* nonnull dereferenceable(12) [[A:%.*]], i8* nocapture nofree readnone [[B:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    tail call void @use1(i8* nonnull dereferenceable(12) [[A]])<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[CONT_THEN:%.*]], label [[CONT_ELSE:%.*]]<br>
+; CHECK:       cont.then:<br>
+; CHECK-NEXT:    tail call void @use1(i8* nonnull dereferenceable(12) [[A]])<br>
+; CHECK-NEXT:    br label [[CONT2:%.*]]<br>
+; CHECK:       cont.else:<br>
+; CHECK-NEXT:    tail call void @use1(i8* nonnull dereferenceable(16) [[A]])<br>
+; CHECK-NEXT:    br label [[CONT2]]<br>
+; CHECK:       cont2:<br>
+; CHECK-NEXT:    tail call void @use1(i8* nonnull dereferenceable(12) [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp = icmp eq i8 %c, 0<br>
   tail call void @use1(i8* dereferenceable(4) %a)<br>
   br i1 %cmp, label %cont.then, label %cont.else<br>
@@ -373,8 +481,33 @@ cont2:<br>
 ;  }<br>
 ;<br>
 ; FIXME: %ptr should be dereferenceable(4)<br>
-; ATTRIBUTOR: define dso_local void @rec-branch-1(i32 %a, i32 %b, i32 %c, i32* nocapture nofree writeonly %ptr)<br>
 define dso_local void @rec-branch-1(i32 %a, i32 %b, i32 %c, i32* %ptr) {<br>
+; CHECK-LABEL: define {{[^@]+}}@rec-branch-1<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32* nocapture nofree writeonly [[PTR:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_ELSE3:%.*]], label [[IF_THEN:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL1]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]<br>
+; CHECK:       if.then2:<br>
+; CHECK-NEXT:    store i32 1, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8:%.*]]<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    store i32 2, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.else3:<br>
+; CHECK-NEXT:    [[TOBOOL4:%.*]] = icmp eq i32 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL4]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]<br>
+; CHECK:       if.then5:<br>
+; CHECK-NEXT:    store i32 3, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.else6:<br>
+; CHECK-NEXT:    store i32 4, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.end8:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %tobool = icmp eq i32 %a, 0<br>
   br i1 %tobool, label %if.else3, label %if.then<br>
@@ -421,8 +554,33 @@ if.end8:                                          ; preds = %if.then5, %if.else6<br>
 ;    }<br>
 ;  }<br>
 ; FIXME: %ptr should be dereferenceable(4)<br>
-; ATTRIBUTOR: define dso_local void @rec-branch-2(i32 %a, i32 %b, i32 %c, i32* nocapture nofree writeonly %ptr)<br>
 define dso_local void @rec-branch-2(i32 %a, i32 %b, i32 %c, i32* %ptr) {<br>
+; CHECK-LABEL: define {{[^@]+}}@rec-branch-2<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[C:%.*]], i32* nocapture nofree writeonly [[PTR:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_ELSE3:%.*]], label [[IF_THEN:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL1]], label [[IF_ELSE:%.*]], label [[IF_THEN2:%.*]]<br>
+; CHECK:       if.then2:<br>
+; CHECK-NEXT:    store i32 1, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8:%.*]]<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    store i32 2, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.else3:<br>
+; CHECK-NEXT:    [[TOBOOL4:%.*]] = icmp eq i32 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL4]], label [[IF_ELSE6:%.*]], label [[IF_THEN5:%.*]]<br>
+; CHECK:       if.then5:<br>
+; CHECK-NEXT:    store i32 3, i32* [[PTR]], align 4<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.else6:<br>
+; CHECK-NEXT:    tail call void @rec-branch-2(i32 1, i32 1, i32 1, i32* nocapture nofree writeonly [[PTR]])<br>
+; CHECK-NEXT:    br label [[IF_END8]]<br>
+; CHECK:       if.end8:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %tobool = icmp eq i32 %a, 0<br>
   br i1 %tobool, label %if.else3, label %if.then<br>
@@ -462,6 +620,24 @@ define void @nonnull_assume_pos(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {<br>
 ; ATTRIBUTOR-NEXT:    call void @llvm.assume(i1 true) #6 [ "nonnull"(i8* undef), "dereferenceable"(i8* undef, i64 1), "dereferenceable"(i8* undef, i64 2), "dereferenceable"(i8* undef, i64 101), "dereferenceable_or_null"(i8* undef, i64 31), "dereferenceable_or_null"(i8* undef, i64 42) ]<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown()<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; IS__TUNIT_OPM-SAME: (i8* nocapture nofree nonnull readnone dereferenceable(101) [[ARG1:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(31) [[ARG2:%.*]], i8* nocapture nofree nonnull readnone [[ARG3:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(42) [[ARG4:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    call void @llvm.assume(i1 true) #6 [ "nonnull"(i8* undef), "dereferenceable"(i8* undef, i64 1), "dereferenceable"(i8* undef, i64 2), "dereferenceable"(i8* undef, i64 101), "dereferenceable_or_null"(i8* undef, i64 31), "dereferenceable_or_null"(i8* undef, i64 42) ]<br>
+; IS__TUNIT_OPM-NEXT:    call void @unknown()<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; IS________NPM-SAME: (i8* nocapture nofree nonnull readnone dereferenceable(101) [[ARG1:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(31) [[ARG2:%.*]], i8* nocapture nofree nonnull readnone [[ARG3:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(42) [[ARG4:%.*]])<br>
+; IS________NPM-NEXT:    call void @llvm.assume(i1 true) #7 [ "nonnull"(i8* undef), "dereferenceable"(i8* undef, i64 1), "dereferenceable"(i8* undef, i64 2), "dereferenceable"(i8* undef, i64 101), "dereferenceable_or_null"(i8* undef, i64 31), "dereferenceable_or_null"(i8* undef, i64 42) ]<br>
+; IS________NPM-NEXT:    call void @unknown()<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; IS__CGSCC_OPM-SAME: (i8* nocapture nofree nonnull readnone dereferenceable(101) [[ARG1:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(31) [[ARG2:%.*]], i8* nocapture nofree nonnull readnone [[ARG3:%.*]], i8* nocapture nofree readnone dereferenceable_or_null(42) [[ARG4:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.assume(i1 true) #8 [ "nonnull"(i8* undef), "dereferenceable"(i8* undef, i64 1), "dereferenceable"(i8* undef, i64 2), "dereferenceable"(i8* undef, i64 101), "dereferenceable_or_null"(i8* undef, i64 31), "dereferenceable_or_null"(i8* undef, i64 42) ]<br>
+; IS__CGSCC_OPM-NEXT:    call void @unknown()<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
 ;<br>
   call void @llvm.assume(i1 true) [ "nonnull"(i8* %arg3), "dereferenceable"(i8* %arg1, i64 1), "dereferenceable"(i8* %arg1, i64 2), "dereferenceable"(i8* %arg1, i64 101), "dereferenceable_or_null"(i8* %arg2, i64 31), "dereferenceable_or_null"(i8* %arg4, i64 42)]<br>
   call void @unknown()<br>
@@ -473,6 +649,12 @@ define void @nonnull_assume_neg(i8* %arg1, i8* %arg2, i8* %arg3) {<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown()<br>
 ; ATTRIBUTOR-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(i8* undef, i64 101), "dereferenceable"(i8* undef, i64 -2), "dereferenceable_or_null"(i8* undef, i64 31) ]<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_neg<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[ARG1:%.*]], i8* nocapture nofree readnone [[ARG2:%.*]], i8* nocapture nofree readnone [[ARG3:%.*]])<br>
+; CHECK-NEXT:    call void @unknown()<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "dereferenceable"(i8* undef, i64 101), "dereferenceable"(i8* undef, i64 -2), "dereferenceable_or_null"(i8* undef, i64 31) ]<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call void @unknown()<br>
   call void @llvm.assume(i1 true) ["dereferenceable"(i8* %arg1, i64 101), "dereferenceable"(i8* %arg2, i64 -2), "dereferenceable_or_null"(i8* %arg3, i64 31)]<br>
@@ -496,6 +678,24 @@ define void @nonnull_assume_call(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown_use32(i32* nonnull dereferenceable(101) [[P]])<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown()<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_call<br>
+; CHECK-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])<br>
+; CHECK-NEXT:    call void @unknown()<br>
+; CHECK-NEXT:    [[P:%.*]] = call nonnull dereferenceable(101) i32* @unkown_ptr()<br>
+; CHECK-NEXT:    call void @unknown_use32(i32* nonnull dereferenceable(101) [[P]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(42) [[ARG4]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull [[ARG3]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(31) [[ARG2]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG3]]), "dereferenceable"(i8* [[ARG1]], i64 1), "dereferenceable"(i8* [[ARG1]], i64 2), "dereferenceable"(i32* [[P]], i64 101), "dereferenceable_or_null"(i8* [[ARG2]], i64 31), "dereferenceable_or_null"(i8* [[ARG4]], i64 42) ]<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(31) [[ARG2]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull [[ARG3]])<br>
+; CHECK-NEXT:    call void @unknown_use8(i8* nonnull dereferenceable(42) [[ARG4]])<br>
+; CHECK-NEXT:    call void @unknown_use32(i32* nonnull dereferenceable(101) [[P]])<br>
+; CHECK-NEXT:    call void @unknown()<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call void @unknown()<br>
   %p = call i32* @unkown_ptr()<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/dereferenceable-2.ll b/llvm/test/Transforms/Attributor/dereferenceable-2.ll<br>
index 7ffc837caadc..3e94364a816b 100644<br>
--- a/llvm/test/Transforms/Attributor/dereferenceable-2.ll<br>
+++ b/llvm/test/Transforms/Attributor/dereferenceable-2.ll<br>
@@ -1,12 +1,29 @@<br>
-; RUN: opt < %s -attributor --attributor-disable=false -S | FileCheck %s --check-prefix=ATTRIBUTOR<br>
-; RUN: opt < %s -passes=attributor --attributor-disable=false -S | FileCheck %s --check-prefix=ATTRIBUTOR_CGSCC_NPM<br>
-; Copied from Transforms/InferFunctionAttrs/dereferenceable.ll<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Determine dereference-ability before unused loads get deleted:<br>
 ; <a href="https://bugs.llvm.org/show_bug.cgi?id=21780" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=21780</a><br>
<br>
 define <4 x double> @PR21780(double* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @PR21780(double* nocapture nofree nonnull readonly align 8 dereferenceable(32) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@PR21780<br>
+; CHECK-SAME: (double* nocapture nofree nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds double, double* [[PTR]], i64 1<br>
+; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds double, double* [[PTR]], i64 2<br>
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds double, double* [[PTR]], i64 3<br>
+; CHECK-NEXT:    [[T0:%.*]] = load double, double* [[PTR]], align 8<br>
+; CHECK-NEXT:    [[T1:%.*]] = load double, double* [[ARRAYIDX1]], align 8<br>
+; CHECK-NEXT:    [[T2:%.*]] = load double, double* [[ARRAYIDX2]], align 8<br>
+; CHECK-NEXT:    [[T3:%.*]] = load double, double* [[ARRAYIDX3]], align 8<br>
+; CHECK-NEXT:    [[VECINIT0:%.*]] = insertelement <4 x double> undef, double [[T0]], i32 0<br>
+; CHECK-NEXT:    [[VECINIT1:%.*]] = insertelement <4 x double> [[VECINIT0]], double [[T1]], i32 1<br>
+; CHECK-NEXT:    [[VECINIT2:%.*]] = insertelement <4 x double> [[VECINIT1]], double [[T2]], i32 2<br>
+; CHECK-NEXT:    [[VECINIT3:%.*]] = insertelement <4 x double> [[VECINIT2]], double [[T3]], i32 3<br>
+; CHECK-NEXT:    [[SHUFFLE:%.*]] = shufflevector <4 x double> [[VECINIT3]], <4 x double> [[VECINIT3]], <4 x i32> <i32 0, i32 0, i32 2, i32 2><br>
+; CHECK-NEXT:    ret <4 x double> [[SHUFFLE]]<br>
+;<br>
<br>
   ; GEP of index 0 is simplified away.<br>
   %arrayidx1 = getelementptr inbounds double, double* %ptr, i64 1<br>
@@ -28,7 +45,12 @@ define <4 x double> @PR21780(double* %ptr) {<br>
<br>
<br>
 define double @PR21780_only_access3_with_inbounds(double* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @PR21780_only_access3_with_inbounds(double* nocapture nofree nonnull readonly align 8 dereferenceable(32) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_with_inbounds<br>
+; CHECK-SAME: (double* nocapture nofree nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds double, double* [[PTR]], i64 3<br>
+; CHECK-NEXT:    [[T3:%.*]] = load double, double* [[ARRAYIDX3]], align 8<br>
+; CHECK-NEXT:    ret double [[T3]]<br>
+;<br>
<br>
   %arrayidx3 = getelementptr inbounds double, double* %ptr, i64 3<br>
   %t3 = load double, double* %arrayidx3, align 8<br>
@@ -36,14 +58,24 @@ define double @PR21780_only_access3_with_inbounds(double* %ptr) {<br>
 }<br>
<br>
 define double @PR21780_only_access3_without_inbounds(double* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @PR21780_only_access3_without_inbounds(double* nocapture nofree readonly align 8 %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@PR21780_only_access3_without_inbounds<br>
+; CHECK-SAME: (double* nocapture nofree readonly align 8 [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr double, double* [[PTR]], i64 3<br>
+; CHECK-NEXT:    [[T3:%.*]] = load double, double* [[ARRAYIDX3]], align 8<br>
+; CHECK-NEXT:    ret double [[T3]]<br>
+;<br>
   %arrayidx3 = getelementptr double, double* %ptr, i64 3<br>
   %t3 = load double, double* %arrayidx3, align 8<br>
   ret double %t3<br>
 }<br>
<br>
 define double @PR21780_without_inbounds(double* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @PR21780_without_inbounds(double* nocapture nofree nonnull readonly align 8 dereferenceable(32) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@PR21780_without_inbounds<br>
+; CHECK-SAME: (double* nocapture nofree nonnull readonly align 8 dereferenceable(32) [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr double, double* [[PTR]], i64 3<br>
+; CHECK-NEXT:    [[T3:%.*]] = load double, double* [[ARRAYIDX3]], align 8<br>
+; CHECK-NEXT:    ret double [[T3]]<br>
+;<br>
<br>
   %arrayidx1 = getelementptr double, double* %ptr, i64 1<br>
   %arrayidx2 = getelementptr double, double* %ptr, i64 2<br>
@@ -60,7 +92,13 @@ define double @PR21780_without_inbounds(double* %ptr) {<br>
 ; Unsimplified, but still valid. Also, throw in some bogus arguments.<br>
<br>
 define void @gep0(i8* %unused, i8* %other, i8* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @gep0(i8* nocapture nofree readnone %unused, i8* nocapture nofree nonnull writeonly dereferenceable(1) %other, i8* nocapture nofree nonnull readonly dereferenceable(3) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@gep0<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[UNUSED:%.*]], i8* nocapture nofree nonnull writeonly dereferenceable(1) [[OTHER:%.*]], i8* nocapture nofree nonnull readonly dereferenceable(3) [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr i8, i8* [[PTR]], i64 2<br>
+; CHECK-NEXT:    [[T2:%.*]] = load i8, i8* [[ARRAYIDX2]]<br>
+; CHECK-NEXT:    store i8 [[T2]], i8* [[OTHER]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx0 = getelementptr i8, i8* %ptr, i64 0<br>
   %arrayidx1 = getelementptr i8, i8* %ptr, i64 1<br>
   %arrayidx2 = getelementptr i8, i8* %ptr, i64 2<br>
@@ -75,7 +113,10 @@ define void @gep0(i8* %unused, i8* %other, i8* %ptr) {<br>
 ; Multiple arguments may be dereferenceable.<br>
<br>
 define void @ordering(i8* %ptr1, i32* %ptr2) {<br>
-; ATTRIBUTOR-LABEL: @ordering(i8* nocapture nofree nonnull readnone dereferenceable(3) %ptr1, i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) %ptr2)<br>
+; CHECK-LABEL: define {{[^@]+}}@ordering<br>
+; CHECK-SAME: (i8* nocapture nofree nonnull readnone dereferenceable(3) [[PTR1:%.*]], i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR2:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %a20 = getelementptr i32, i32* %ptr2, i64 0<br>
   %a12 = getelementptr i8, i8* %ptr1, i64 2<br>
   %t12 = load i8, i8* %a12<br>
@@ -92,7 +133,13 @@ define void @ordering(i8* %ptr1, i32* %ptr2) {<br>
 ; Not in entry block.<br>
<br>
 define void @not_entry_but_guaranteed_to_execute(i8* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @not_entry_but_guaranteed_to_execute(i8* nocapture nofree nonnull readnone dereferenceable(3) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@not_entry_but_guaranteed_to_execute<br>
+; CHECK-SAME: (i8* nocapture nofree nonnull readnone dereferenceable(3) [[PTR:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[EXIT:%.*]]<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   br label %exit<br>
 exit:<br>
@@ -108,7 +155,15 @@ exit:<br>
 ; Not in entry block and not guaranteed to execute.<br>
<br>
 define void @not_entry_not_guaranteed_to_execute(i8* %ptr, i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @not_entry_not_guaranteed_to_execute(i8* nocapture nofree readnone %ptr, i1 %cond)<br>
+; CHECK-LABEL: define {{[^@]+}}@not_entry_not_guaranteed_to_execute<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[PTR:%.*]], i1 [[COND:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[LOADS:%.*]], label [[EXIT:%.*]]<br>
+; CHECK:       loads:<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   br i1 %cond, label %loads, label %exit<br>
 loads:<br>
@@ -126,7 +181,15 @@ exit:<br>
 ; The last load may not execute, so derefenceable bytes only covers the 1st two loads.<br>
<br>
 define void @partial_in_entry(i16* %ptr, i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @partial_in_entry(i16* nocapture nofree nonnull readnone align 2 dereferenceable(4) %ptr, i1 %cond)<br>
+; CHECK-LABEL: define {{[^@]+}}@partial_in_entry<br>
+; CHECK-SAME: (i16* nocapture nofree nonnull readnone align 2 dereferenceable(4) [[PTR:%.*]], i1 [[COND:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[LOADS:%.*]], label [[EXIT:%.*]]<br>
+; CHECK:       loads:<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %arrayidx0 = getelementptr i16, i16* %ptr, i64 0<br>
   %arrayidx1 = getelementptr i16, i16* %ptr, i64 1<br>
@@ -145,7 +208,12 @@ exit:<br>
 ; The 2nd and 3rd loads may never execute.<br>
<br>
 define void @volatile_is_not_dereferenceable(i16* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @volatile_is_not_dereferenceable(i16* nofree align 2 %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@volatile_is_not_dereferenceable<br>
+; CHECK-SAME: (i16* nofree align 2 [[PTR:%.*]])<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr i16, i16* [[PTR]], i64 0<br>
+; CHECK-NEXT:    [[T0:%.*]] = load volatile i16, i16* [[ARRAYIDX0]], align 2<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx0 = getelementptr i16, i16* %ptr, i64 0<br>
   %arrayidx1 = getelementptr i16, i16* %ptr, i64 1<br>
   %arrayidx2 = getelementptr i16, i16* %ptr, i64 2<br>
@@ -158,7 +226,10 @@ define void @volatile_is_not_dereferenceable(i16* %ptr) {<br>
 ; TODO: We should allow inference for atomic (but not volatile) ops.<br>
<br>
 define void @atomic_is_alright(i16* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @atomic_is_alright(i16* nocapture nofree nonnull readnone align 2 dereferenceable(6) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@atomic_is_alright<br>
+; CHECK-SAME: (i16* nocapture nofree nonnull readnone align 2 dereferenceable(6) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx0 = getelementptr i16, i16* %ptr, i64 0<br>
   %arrayidx1 = getelementptr i16, i16* %ptr, i64 1<br>
   %arrayidx2 = getelementptr i16, i16* %ptr, i64 2<br>
@@ -171,7 +242,11 @@ define void @atomic_is_alright(i16* %ptr) {<br>
 declare void @may_not_return()<br>
<br>
 define void @not_guaranteed_to_transfer_execution(i16* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @not_guaranteed_to_transfer_execution(i16* nocapture nofree nonnull readnone align 2 dereferenceable(2) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@not_guaranteed_to_transfer_execution<br>
+; CHECK-SAME: (i16* nocapture nofree nonnull readnone align 2 dereferenceable(2) [[PTR:%.*]])<br>
+; CHECK-NEXT:    call void @may_not_return()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx0 = getelementptr i16, i16* %ptr, i64 0<br>
   %arrayidx1 = getelementptr i16, i16* %ptr, i64 1<br>
   %arrayidx2 = getelementptr i16, i16* %ptr, i64 2<br>
@@ -185,7 +260,10 @@ define void @not_guaranteed_to_transfer_execution(i16* %ptr) {<br>
 ; We must have consecutive accesses.<br>
<br>
 define void @variable_gep_index(i8* %unused, i8* %ptr, i64 %variable_index) {<br>
-; ATTRIBUTOR-LABEL: @variable_gep_index(i8* nocapture nofree readnone %unused, i8* nocapture nofree nonnull readnone dereferenceable(1) %ptr, i64 %variable_index)<br>
+; CHECK-LABEL: define {{[^@]+}}@variable_gep_index<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[UNUSED:%.*]], i8* nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]], i64 [[VARIABLE_INDEX:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx1 = getelementptr i8, i8* %ptr, i64 %variable_index<br>
   %arrayidx2 = getelementptr i8, i8* %ptr, i64 2<br>
   %t0 = load i8, i8* %ptr<br>
@@ -198,7 +276,10 @@ define void @variable_gep_index(i8* %unused, i8* %ptr, i64 %variable_index) {<br>
<br>
 define void @multi_index_gep(<4 x i8>* %ptr) {<br>
 ; FIXME: %ptr should be dereferenceable(4)<br>
-; ATTRIBUTOR-LABEL: @multi_index_gep(<4 x i8>* nocapture nofree nonnull readnone dereferenceable(1) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@multi_index_gep<br>
+; CHECK-SAME: (<4 x i8>* nocapture nofree nonnull readnone dereferenceable(1) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx00 = getelementptr <4 x i8>, <4 x i8>* %ptr, i64 0, i64 0<br>
   %t0 = load i8, i8* %arrayidx00<br>
   ret void<br>
@@ -207,7 +288,10 @@ define void @multi_index_gep(<4 x i8>* %ptr) {<br>
 ; Could round weird bitwidths down?<br>
<br>
 define void @not_byte_multiple(i9* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @not_byte_multiple(i9* nocapture nofree nonnull readnone align 2 dereferenceable(2) %ptr) <br>
+; CHECK-LABEL: define {{[^@]+}}@not_byte_multiple<br>
+; CHECK-SAME: (i9* nocapture nofree nonnull readnone align 2 dereferenceable(2) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx0 = getelementptr i9, i9* %ptr, i64 0<br>
   %t0 = load i9, i9* %arrayidx0<br>
   ret void<br>
@@ -216,7 +300,10 @@ define void @not_byte_multiple(i9* %ptr) {<br>
 ; Missing direct access from the pointer.<br>
<br>
 define void @no_pointer_deref(i16* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @no_pointer_deref(i16* nocapture nofree readnone align 2 %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@no_pointer_deref<br>
+; CHECK-SAME: (i16* nocapture nofree readnone align 2 [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx1 = getelementptr i16, i16* %ptr, i64 1<br>
   %arrayidx2 = getelementptr i16, i16* %ptr, i64 2<br>
   %t1 = load i16, i16* %arrayidx1<br>
@@ -227,7 +314,10 @@ define void @no_pointer_deref(i16* %ptr) {<br>
 ; Out-of-order is ok, but missing access concludes dereferenceable range.<br>
<br>
 define void @non_consecutive(i32* %ptr) {<br>
-; ATTRIBUTOR-LABEL: @non_consecutive(i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@non_consecutive<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx1 = getelementptr i32, i32* %ptr, i64 1<br>
   %arrayidx0 = getelementptr i32, i32* %ptr, i64 0<br>
   %arrayidx3 = getelementptr i32, i32* %ptr, i64 3<br>
@@ -240,7 +330,10 @@ define void @non_consecutive(i32* %ptr) {<br>
 ; Improve on existing dereferenceable attribute.<br>
<br>
 define void @more_bytes(i32* dereferenceable(8) %ptr) {<br>
-; ATTRIBUTOR-LABEL: @more_bytes(i32* nocapture nofree nonnull readnone align 4 dereferenceable(16) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@more_bytes<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx3 = getelementptr i32, i32* %ptr, i64 3<br>
   %arrayidx1 = getelementptr i32, i32* %ptr, i64 1<br>
   %arrayidx0 = getelementptr i32, i32* %ptr, i64 0<br>
@@ -255,7 +348,10 @@ define void @more_bytes(i32* dereferenceable(8) %ptr) {<br>
 ; Improve on existing dereferenceable_or_null attribute.<br>
<br>
 define void @more_bytes_and_not_null(i32* dereferenceable_or_null(8) %ptr) {<br>
-; ATTRIBUTOR-LABEL: @more_bytes_and_not_null(i32* nocapture nofree nonnull readnone align 4 dereferenceable(16) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@more_bytes_and_not_null<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(16) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx3 = getelementptr i32, i32* %ptr, i64 3<br>
   %arrayidx1 = getelementptr i32, i32* %ptr, i64 1<br>
   %arrayidx0 = getelementptr i32, i32* %ptr, i64 0<br>
@@ -270,7 +366,10 @@ define void @more_bytes_and_not_null(i32* dereferenceable_or_null(8) %ptr) {<br>
 ; But don't pessimize existing dereferenceable attribute.<br>
<br>
 define void @better_bytes(i32* dereferenceable(100) %ptr) {<br>
-; ATTRIBUTOR-LABEL: @better_bytes(i32* nocapture nofree nonnull readnone align 4 dereferenceable(100) %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@better_bytes<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(100) [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arrayidx3 = getelementptr i32, i32* %ptr, i64 3<br>
   %arrayidx1 = getelementptr i32, i32* %ptr, i64 1<br>
   %arrayidx0 = getelementptr i32, i32* %ptr, i64 0<br>
@@ -283,7 +382,10 @@ define void @better_bytes(i32* dereferenceable(100) %ptr) {<br>
 }<br>
<br>
 define void @bitcast(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @bitcast(i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@bitcast<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(8) [[ARG:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr = bitcast i32* %arg to float*<br>
   %arrayidx0 = getelementptr float, float* %ptr, i64 0<br>
   %arrayidx1 = getelementptr float, float* %ptr, i64 1<br>
@@ -293,7 +395,10 @@ define void @bitcast(i32* %arg) {<br>
 }<br>
<br>
 define void @bitcast_<br>
diff erent_sizes(double* %arg1, i8* %arg2) {<br>
-; ATTRIBUTOR-LABEL: @bitcast_<br>
diff erent_sizes(double* nocapture nofree nonnull readnone align 4 dereferenceable(12) %arg1, i8* nocapture nofree nonnull readnone align 4 dereferenceable(16) %arg2)<br>
+; CHECK-LABEL: define {{[^@]+}}@bitcast_<br>
diff erent_sizes<br>
+; CHECK-SAME: (double* nocapture nofree nonnull readnone align 4 dereferenceable(12) [[ARG1:%.*]], i8* nocapture nofree nonnull readnone align 4 dereferenceable(16) [[ARG2:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr1 = bitcast double* %arg1 to float*<br>
   %a10 = getelementptr float, float* %ptr1, i64 0<br>
   %a11 = getelementptr float, float* %ptr1, i64 1<br>
@@ -311,7 +416,10 @@ define void @bitcast_<br>
diff erent_sizes(double* %arg1, i8* %arg2) {<br>
 }<br>
<br>
 define void @negative_offset(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @negative_offset(i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@negative_offset<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) [[ARG:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr = bitcast i32* %arg to float*<br>
   %arrayidx0 = getelementptr float, float* %ptr, i64 0<br>
   %arrayidx1 = getelementptr float, float* %ptr, i64 -1<br>
@@ -321,7 +429,15 @@ define void @negative_offset(i32* %arg) {<br>
 }<br>
<br>
 define void @stores(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @stores(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(8) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@stores<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[PTR:%.*]] = bitcast i32* [[ARG]] to float*<br>
+; CHECK-NEXT:    [[ARRAYIDX0:%.*]] = getelementptr float, float* [[PTR]], i64 0<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr float, float* [[PTR]], i64 1<br>
+; CHECK-NEXT:    store float 1.000000e+00, float* [[ARRAYIDX0]], align 4<br>
+; CHECK-NEXT:    store float 2.000000e+00, float* [[ARRAYIDX1]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr = bitcast i32* %arg to float*<br>
   %arrayidx0 = getelementptr float, float* %ptr, i64 0<br>
   %arrayidx1 = getelementptr float, float* %ptr, i64 1<br>
@@ -331,7 +447,13 @@ define void @stores(i32* %arg) {<br>
 }<br>
<br>
 define void @load_store(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @load_store(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(8) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@load_store<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(8) [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[PTR:%.*]] = bitcast i32* [[ARG]] to float*<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr float, float* [[PTR]], i64 1<br>
+; CHECK-NEXT:    store float 2.000000e+00, float* [[ARRAYIDX1]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %ptr = bitcast i32* %arg to float*<br>
   %arrayidx0 = getelementptr float, float* %ptr, i64 0<br>
   %arrayidx1 = getelementptr float, float* %ptr, i64 1<br>
@@ -341,7 +463,13 @@ define void @load_store(i32* %arg) {<br>
 }<br>
<br>
 define void @<br>
diff erent_size1(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @<br>
diff erent_size1(i32* nocapture nofree nonnull writeonly align 8 dereferenceable(8) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@<br>
diff erent_size1<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[ARG_CAST:%.*]] = bitcast i32* [[ARG]] to double*<br>
+; CHECK-NEXT:    store double 0.000000e+00, double* [[ARG_CAST]], align 8<br>
+; CHECK-NEXT:    store i32 0, i32* [[ARG]], align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %arg-cast = bitcast i32* %arg to double*<br>
   store double 0.000000e+00, double* %arg-cast<br>
   store i32 0, i32* %arg<br>
@@ -349,7 +477,13 @@ define void @<br>
diff erent_size1(i32* %arg) {<br>
 }<br>
<br>
 define void @<br>
diff erent_size2(i32* %arg) {<br>
-; ATTRIBUTOR-LABEL: @<br>
diff erent_size2(i32* nocapture nofree nonnull writeonly align 8 dereferenceable(8) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@<br>
diff erent_size2<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[ARG:%.*]])<br>
+; CHECK-NEXT:    store i32 0, i32* [[ARG]], align 8<br>
+; CHECK-NEXT:    [[ARG_CAST:%.*]] = bitcast i32* [[ARG]] to double*<br>
+; CHECK-NEXT:    store double 0.000000e+00, double* [[ARG_CAST]], align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32 0, i32* %arg<br>
   %arg-cast = bitcast i32* %arg to double*<br>
   store double 0.000000e+00, double* %arg-cast<br>
@@ -375,12 +509,63 @@ define void @<br>
diff erent_size2(i32* %arg) {<br>
 ;<br>
 ; ATTRIBUTOR_CGSCC_NPM-LABEL: define i32 @require_cfg_analysis(i32 %c, i32* {{.*}} dereferenceable(4) %p)<br>
 define i32 @require_cfg_analysis(i32 %c, i32* %p) {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@require_cfg_analysis<br>
+; IS________OPM-SAME: (i32 [[C:%.*]], i32* nocapture nofree writeonly [[P:%.*]])<br>
+; IS________OPM-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[C]], 0<br>
+; IS________OPM-NEXT:    br i1 [[TOBOOL1]], label [[L1:%.*]], label [[L2:%.*]]<br>
+; IS________OPM:       l1:<br>
+; IS________OPM-NEXT:    [[TOBOOL2:%.*]] = icmp eq i32 [[C]], 1<br>
+; IS________OPM-NEXT:    br i1 [[TOBOOL2]], label [[L3:%.*]], label [[L4:%.*]]<br>
+; IS________OPM:       l2:<br>
+; IS________OPM-NEXT:    [[TOBOOL3:%.*]] = icmp eq i32 [[C]], 2<br>
+; IS________OPM-NEXT:    br i1 [[TOBOOL3]], label [[L3]], label [[L4]]<br>
+; IS________OPM:       l3:<br>
+; IS________OPM-NEXT:    br label [[L5:%.*]]<br>
+; IS________OPM:       l4:<br>
+; IS________OPM-NEXT:    br label [[L5]]<br>
+; IS________OPM:       l5:<br>
+; IS________OPM-NEXT:    [[TOBOOL4:%.*]] = icmp eq i32 [[C]], 4<br>
+; IS________OPM-NEXT:    br i1 [[TOBOOL4]], label [[L6:%.*]], label [[L7:%.*]]<br>
+; IS________OPM:       l6:<br>
+; IS________OPM-NEXT:    store i32 0, i32* [[P]]<br>
+; IS________OPM-NEXT:    br label [[END:%.*]]<br>
+; IS________OPM:       l7:<br>
+; IS________OPM-NEXT:    store i32 1, i32* [[P]]<br>
+; IS________OPM-NEXT:    br label [[END]]<br>
+; IS________OPM:       end:<br>
+; IS________OPM-NEXT:    ret i32 1<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@require_cfg_analysis<br>
+; IS________NPM-SAME: (i32 [[C:%.*]], i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[C]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TOBOOL1]], label [[L1:%.*]], label [[L2:%.*]]<br>
+; IS________NPM:       l1:<br>
+; IS________NPM-NEXT:    br label [[L4:%.*]]<br>
+; IS________NPM:       l2:<br>
+; IS________NPM-NEXT:    [[TOBOOL3:%.*]] = icmp eq i32 [[C]], 2<br>
+; IS________NPM-NEXT:    br i1 [[TOBOOL3]], label [[L3:%.*]], label [[L4]]<br>
+; IS________NPM:       l3:<br>
+; IS________NPM-NEXT:    br label [[L5:%.*]]<br>
+; IS________NPM:       l4:<br>
+; IS________NPM-NEXT:    br label [[L5]]<br>
+; IS________NPM:       l5:<br>
+; IS________NPM-NEXT:    [[TOBOOL4:%.*]] = icmp eq i32 [[C]], 4<br>
+; IS________NPM-NEXT:    br i1 [[TOBOOL4]], label [[L6:%.*]], label [[L7:%.*]]<br>
+; IS________NPM:       l6:<br>
+; IS________NPM-NEXT:    store i32 0, i32* [[P]], align 4<br>
+; IS________NPM-NEXT:    br label [[END:%.*]]<br>
+; IS________NPM:       l7:<br>
+; IS________NPM-NEXT:    store i32 1, i32* [[P]], align 4<br>
+; IS________NPM-NEXT:    br label [[END]]<br>
+; IS________NPM:       end:<br>
+; IS________NPM-NEXT:    ret i32 1<br>
+;<br>
   %tobool1 = icmp eq i32 %c, 0<br>
   br i1 %tobool1, label %l1, label %l2<br>
-l1:                                       <br>
+l1:<br>
   %tobool2 = icmp eq i32 %c, 1<br>
   br i1 %tobool2, label %l3, label %l4<br>
-l2:  <br>
+l2:<br>
   %tobool3 = icmp eq i32 %c, 2<br>
   br i1 %tobool3, label %l3, label %l4<br>
 l3:<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/heap_to_stack.ll b/llvm/test/Transforms/Attributor/heap_to_stack.ll<br>
index 3adbf3812f17..3049d5154100 100644<br>
--- a/llvm/test/Transforms/Attributor/heap_to_stack.ll<br>
+++ b/llvm/test/Transforms/Attributor/heap_to_stack.ll<br>
@@ -1,4 +1,8 @@<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 declare noalias i8* @malloc(i64)<br>
<br>
@@ -24,8 +28,13 @@ declare void @free(i8* nocapture)<br>
<br>
 declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind<br>
<br>
-; CHECK: @nofree_arg_only(i8* nocapture nofree %p1, i8* nocapture %p2)<br>
 define void @nofree_arg_only(i8* %p1, i8* %p2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nofree_arg_only<br>
+; CHECK-SAME: (i8* nocapture nofree [[P1:%.*]], i8* nocapture [[P2:%.*]])<br>
+; CHECK-NEXT:    tail call void @free(i8* nocapture [[P2]])<br>
+; CHECK-NEXT:    tail call void @nofree_func(i8* nocapture nofree [[P1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @free(i8* %p2)<br>
   tail call void @nofree_func(i8* %p1)<br>
   ret void<br>
@@ -34,9 +43,21 @@ define void @nofree_arg_only(i8* %p1, i8* %p2) {<br>
 ; TEST 1 - negative, pointer freed in another function.<br>
<br>
 define void @test1() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test1()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @nocapture_func_frees_pointer(i8* noalias [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void (...) @func_throws()<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test1()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    tail call void @nocapture_func_frees_pointer(i8* noalias nocapture [[TMP1]])<br>
+; IS________NPM-NEXT:    tail call void (...) @func_throws()<br>
+; IS________NPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: @malloc(i64 4)<br>
-  ; CHECK-NEXT: @nocapture_func_frees_pointer(i8* noalias nocapture %1)<br>
   tail call void @nocapture_func_frees_pointer(i8* %1)<br>
   tail call void (...) @func_throws()<br>
   tail call void @free(i8* %1)<br>
@@ -46,9 +67,13 @@ define void @test1() {<br>
 ; TEST 2 - negative, call to a sync function.<br>
<br>
 define void @test2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    tail call void @sync_func(i8* [[TMP1]])<br>
+; CHECK-NEXT:    tail call void @free(i8* [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: @malloc(i64 4)<br>
-  ; CHECK-NEXT: @sync_func(i8* %1)<br>
   tail call void @sync_func(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
@@ -57,21 +82,46 @@ define void @test2() {<br>
 ; TEST 3 - 1 malloc, 1 free<br>
<br>
 define void @test3() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test3()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test3()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test3a(i8* %p) {<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test3a<br>
+; IS__TUNIT_OPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @nofree_arg_only(i8* nocapture nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test3a<br>
+; IS________NPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @nofree_arg_only(i8* noalias nocapture nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test3a<br>
+; IS__CGSCC_OPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @nofree_arg_only(i8* nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: tail call void @nofree_arg_only<br>
   tail call void @nofree_arg_only(i8* %1, i8* %p)<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
@@ -79,19 +129,41 @@ define void @test3a(i8* %p) {<br>
 declare noalias i8* @aligned_alloc(i64, i64)<br>
<br>
 define void @test3b(i8* %p) {<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test3b<br>
+; IS__TUNIT_OPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @aligned_alloc(i64 32, i64 128)<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @nofree_arg_only(i8* nocapture nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test3b<br>
+; IS________NPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 128, align 32<br>
+; IS________NPM-NEXT:    tail call void @nofree_arg_only(i8* noalias nocapture nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test3b<br>
+; IS__CGSCC_OPM-SAME: (i8* nocapture [[P:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @aligned_alloc(i64 32, i64 128)<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @nofree_arg_only(i8* nofree [[TMP1]], i8* nocapture [[P]])<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @aligned_alloc(i64 32, i64 128)<br>
-  ; CHECK: %1 = alloca i8, i64 128, align 32<br>
-  ; CHECK-NEXT: tail call void @nofree_arg_only<br>
   tail call void @nofree_arg_only(i8* %1, i8* %p)<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 ; leave alone non-constant alignments.<br>
 define void @test3c(i64 %alignment) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test3c<br>
+; CHECK-SAME: (i64 [[ALIGNMENT:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @aligned_alloc(i64 [[ALIGNMENT]], i64 128)<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @aligned_alloc(i64 %alignment, i64 128)<br>
-  ; CHECK: tail call noalias i8* @aligned_alloc<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
@@ -99,22 +171,38 @@ define void @test3c(i64 %alignment) {<br>
 declare noalias i8* @calloc(i64, i64)<br>
<br>
 define void @test0() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test0()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @calloc(i64 2, i64 4)<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test0()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 8<br>
+; IS________NPM-NEXT:    [[CALLOC_BC:%.*]] = bitcast i8* [[TMP1]] to i8*<br>
+; IS________NPM-NEXT:    call void @llvm.memset.p0i8.i64(i8* [[CALLOC_BC]], i8 0, i64 8, i1 false)<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @calloc(i64 2, i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 8<br>
-  ; CHECK-NEXT: %calloc_bc = bitcast i8* %1 to i8*<br>
-  ; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* %calloc_bc, i8 0, i64 8, i1 false)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 ; TEST 4<br>
 define void @test4() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test4()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @nofree_func(i8* noalias nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test4()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @nofree_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: @nofree_func(i8* noalias nocapture nofree %1)<br>
   tail call void @nofree_func(i8* %1)<br>
   ret void<br>
 }<br>
@@ -123,9 +211,51 @@ define void @test4() {<br>
 ; are in nofree functions and are not captured<br>
<br>
 define void @test5(i32, i8* %p) {<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test5<br>
+; IS__TUNIT_OPM-SAME: (i32 [[TMP0:%.*]], i8* nocapture [[P:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS__TUNIT_OPM-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; IS__TUNIT_OPM-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; IS__TUNIT_OPM:       4:<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @nofree_func(i8* noalias nofree [[TMP2]])<br>
+; IS__TUNIT_OPM-NEXT:    br label [[TMP6:%.*]]<br>
+; IS__TUNIT_OPM:       5:<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @nofree_arg_only(i8* nocapture nofree [[TMP2]], i8* nocapture [[P]])<br>
+; IS__TUNIT_OPM-NEXT:    tail call void @free(i8* noalias [[TMP2]])<br>
+; IS__TUNIT_OPM-NEXT:    br label [[TMP6]]<br>
+; IS__TUNIT_OPM:       6:<br>
+; IS__TUNIT_OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test5<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]], i8* nocapture [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; IS________NPM:       4:<br>
+; IS________NPM-NEXT:    tail call void @nofree_func(i8* noalias nocapture nofree [[TMP2]])<br>
+; IS________NPM-NEXT:    br label [[TMP6:%.*]]<br>
+; IS________NPM:       5:<br>
+; IS________NPM-NEXT:    tail call void @nofree_arg_only(i8* noalias nocapture nofree [[TMP2]], i8* nocapture [[P]])<br>
+; IS________NPM-NEXT:    br label [[TMP6]]<br>
+; IS________NPM:       6:<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test5<br>
+; IS__CGSCC_OPM-SAME: (i32 [[TMP0:%.*]], i8* nocapture [[P:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; IS__CGSCC_OPM-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; IS__CGSCC_OPM:       4:<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @nofree_func(i8* noalias nofree [[TMP2]])<br>
+; IS__CGSCC_OPM-NEXT:    br label [[TMP6:%.*]]<br>
+; IS__CGSCC_OPM:       5:<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @nofree_arg_only(i8* nofree [[TMP2]], i8* nocapture [[P]])<br>
+; IS__CGSCC_OPM-NEXT:    tail call void @free(i8* noalias [[TMP2]])<br>
+; IS__CGSCC_OPM-NEXT:    br label [[TMP6]]<br>
+; IS__CGSCC_OPM:       6:<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
   %2 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %2 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: icmp eq i32 %0, 0<br>
   %3 = icmp eq i32 %0, 0<br>
   br i1 %3, label %5, label %4<br>
<br>
@@ -136,7 +266,6 @@ define void @test5(i32, i8* %p) {<br>
 5:                                                ; preds = %1<br>
   tail call void @nofree_arg_only(i8* %2, i8* %p)<br>
   tail call void @free(i8* %2)<br>
-  ; CHECK-NOT: @free(i8* %2)<br>
   br label %6<br>
<br>
 6:                                                ; preds = %5, %4<br>
@@ -146,21 +275,45 @@ define void @test5(i32, i8* %p) {<br>
 ; TEST 6 - all exit paths have a call to free<br>
<br>
 define void @test6(i32) {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test6<br>
+; IS________OPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; IS________OPM-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; IS________OPM:       4:<br>
+; IS________OPM-NEXT:    tail call void @nofree_func(i8* noalias nofree [[TMP2]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias [[TMP2]])<br>
+; IS________OPM-NEXT:    br label [[TMP6:%.*]]<br>
+; IS________OPM:       5:<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias [[TMP2]])<br>
+; IS________OPM-NEXT:    br label [[TMP6]]<br>
+; IS________OPM:       6:<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test6<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; IS________NPM:       4:<br>
+; IS________NPM-NEXT:    tail call void @nofree_func(i8* noalias nocapture nofree [[TMP2]])<br>
+; IS________NPM-NEXT:    br label [[TMP6:%.*]]<br>
+; IS________NPM:       5:<br>
+; IS________NPM-NEXT:    br label [[TMP6]]<br>
+; IS________NPM:       6:<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %2 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %2 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: icmp eq i32 %0, 0<br>
   %3 = icmp eq i32 %0, 0<br>
   br i1 %3, label %5, label %4<br>
<br>
 4:                                                ; preds = %1<br>
   tail call void @nofree_func(i8* %2)<br>
   tail call void @free(i8* %2)<br>
-  ; CHECK-NOT: @free(i8* %2)<br>
   br label %6<br>
<br>
 5:                                                ; preds = %1<br>
   tail call void @free(i8* %2)<br>
-  ; CHECK-NOT: @free(i8* %2)<br>
   br label %6<br>
<br>
 6:                                                ; preds = %5, %4<br>
@@ -170,11 +323,18 @@ define void @test6(i32) {<br>
 ; TEST 7 - free is dead.<br>
<br>
 define void @test7() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test7()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = tail call i32 @no_return_call()<br>
+; IS________OPM-NEXT:    unreachable<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test7()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = tail call i32 @no_return_call()<br>
+; IS________NPM-NEXT:    unreachable<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: alloca i8, i64 4<br>
-  ; CHECK-NEXT: tail call i32 @no_return_call()<br>
   tail call i32 @no_return_call()<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
@@ -182,30 +342,42 @@ define void @test7() {<br>
 ; TEST 8 - Negative: bitcast pointer used in capture function<br>
<br>
 define void @test8() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test8()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    tail call void @foo(i32* align 4 [[TMP2]])<br>
+; CHECK-NEXT:    tail call void @free(i8* nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
   tail call void @foo(i32* %2)<br>
-  ; CHECK: @free(i8* nonnull align 4 dereferenceable(4) %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 ; TEST 9 - FIXME: malloc should be converted.<br>
 define void @test9() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test9()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    tail call void @foo_nounw(i32* nofree align 4 [[TMP2]])<br>
+; CHECK-NEXT:    tail call void @free(i8* nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
   tail call void @foo_nounw(i32* %2)<br>
-  ; CHECK: @free(i8* nonnull align 4 dereferenceable(4) %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
@@ -213,28 +385,58 @@ define void @test9() {<br>
 ; TEST 10 - 1 malloc, 1 free<br>
<br>
 define i32 @test10() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test10()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; IS________OPM-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; IS________OPM-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test10()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; IS________NPM-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret i32 %3<br>
 }<br>
<br>
 define i32 @test_lifetime() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test_lifetime()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; IS________OPM-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; IS________OPM-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test_lifetime()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; IS________NPM-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: %1 = alloca i8, i64 4<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   call void @llvm.lifetime.start.p0i8(i64 4, i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret i32 %3<br>
 }<br>
@@ -242,10 +444,18 @@ define i32 @test_lifetime() {<br>
 ; TEST 11<br>
<br>
 define void @test11() {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test11()<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @sync_will_return(i8* [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test11()<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    tail call void @sync_will_return(i8* [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: test11<br>
-  ; CHECK-NEXT: alloc<br>
-  ; CHECK-NEXT: @sync_will_return(i8* %1)<br>
   tail call void @sync_will_return(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
@@ -253,8 +463,67 @@ define void @test11() {<br>
<br>
 ; TEST 12<br>
 define i32 @irreducible_cfg(i32 %0) {<br>
-  ; CHECK: alloca i8, i64 4<br>
-  ; CHECK-NEXT: %3 = bitcast<br>
+; IS________OPM-LABEL: define {{[^@]+}}@irreducible_cfg<br>
+; IS________OPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32*<br>
+; IS________OPM-NEXT:    store i32 10, i32* [[TMP3]], align 4<br>
+; IS________OPM-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[TMP0]], 1<br>
+; IS________OPM-NEXT:    br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP7:%.*]]<br>
+; IS________OPM:       5:<br>
+; IS________OPM-NEXT:    [[TMP6:%.*]] = add nsw i32 [[TMP0]], 5<br>
+; IS________OPM-NEXT:    br label [[TMP13:%.*]]<br>
+; IS________OPM:       7:<br>
+; IS________OPM-NEXT:    br label [[TMP8:%.*]]<br>
+; IS________OPM:       8:<br>
+; IS________OPM-NEXT:    [[DOT0:%.*]] = phi i32 [ [[TMP14:%.*]], [[TMP13]] ], [ 1, [[TMP7]] ]<br>
+; IS________OPM-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP3]], align 4<br>
+; IS________OPM-NEXT:    [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1<br>
+; IS________OPM-NEXT:    store i32 [[TMP10]], i32* [[TMP3]], align 4<br>
+; IS________OPM-NEXT:    [[TMP11:%.*]] = icmp ne i32 [[TMP9]], 0<br>
+; IS________OPM-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP15:%.*]]<br>
+; IS________OPM:       12:<br>
+; IS________OPM-NEXT:    br label [[TMP13]]<br>
+; IS________OPM:       13:<br>
+; IS________OPM-NEXT:    [[DOT1:%.*]] = phi i32 [ [[TMP6]], [[TMP5]] ], [ [[DOT0]], [[TMP12]] ]<br>
+; IS________OPM-NEXT:    [[TMP14]] = add nsw i32 [[DOT1]], 1<br>
+; IS________OPM-NEXT:    br label [[TMP8]]<br>
+; IS________OPM:       15:<br>
+; IS________OPM-NEXT:    [[TMP16:%.*]] = bitcast i32* [[TMP3]] to i8*<br>
+; IS________OPM-NEXT:    call void @free(i8* [[TMP16]])<br>
+; IS________OPM-NEXT:    [[TMP17:%.*]] = load i32, i32* [[TMP3]], align 4<br>
+; IS________OPM-NEXT:    ret i32 [[TMP17]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@irreducible_cfg<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = bitcast i8* [[TMP2]] to i32*<br>
+; IS________NPM-NEXT:    store i32 10, i32* [[TMP3]], align 4<br>
+; IS________NPM-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[TMP0]], 1<br>
+; IS________NPM-NEXT:    br i1 [[TMP4]], label [[TMP5:%.*]], label [[TMP7:%.*]]<br>
+; IS________NPM:       5:<br>
+; IS________NPM-NEXT:    [[TMP6:%.*]] = add nsw i32 [[TMP0]], 5<br>
+; IS________NPM-NEXT:    br label [[TMP13:%.*]]<br>
+; IS________NPM:       7:<br>
+; IS________NPM-NEXT:    br label [[TMP8:%.*]]<br>
+; IS________NPM:       8:<br>
+; IS________NPM-NEXT:    [[DOT0:%.*]] = phi i32 [ [[TMP14:%.*]], [[TMP13]] ], [ 1, [[TMP7]] ]<br>
+; IS________NPM-NEXT:    [[TMP9:%.*]] = load i32, i32* [[TMP3]], align 4<br>
+; IS________NPM-NEXT:    [[TMP10:%.*]] = add nsw i32 [[TMP9]], -1<br>
+; IS________NPM-NEXT:    store i32 [[TMP10]], i32* [[TMP3]], align 4<br>
+; IS________NPM-NEXT:    [[TMP11:%.*]] = icmp ne i32 [[TMP9]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TMP11]], label [[TMP12:%.*]], label [[TMP15:%.*]]<br>
+; IS________NPM:       12:<br>
+; IS________NPM-NEXT:    br label [[TMP13]]<br>
+; IS________NPM:       13:<br>
+; IS________NPM-NEXT:    [[DOT1:%.*]] = phi i32 [ [[TMP6]], [[TMP5]] ], [ [[DOT0]], [[TMP12]] ]<br>
+; IS________NPM-NEXT:    [[TMP14]] = add nsw i32 [[DOT1]], 1<br>
+; IS________NPM-NEXT:    br label [[TMP8]]<br>
+; IS________NPM:       15:<br>
+; IS________NPM-NEXT:    [[TMP16:%.*]] = bitcast i32* [[TMP3]] to i8*<br>
+; IS________NPM-NEXT:    [[TMP17:%.*]] = load i32, i32* [[TMP3]], align 4<br>
+; IS________NPM-NEXT:    ret i32 [[TMP17]]<br>
+;<br>
   %2 = call noalias i8* @malloc(i64 4)<br>
   %3 = bitcast i8* %2 to i32*<br>
   store i32 10, i32* %3, align 4<br>
@@ -294,6 +563,46 @@ define i32 @irreducible_cfg(i32 %0) {<br>
<br>
<br>
 define i32 @malloc_in_loop(i32 %0) {<br>
+; IS________OPM-LABEL: define {{[^@]+}}@malloc_in_loop<br>
+; IS________OPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = alloca i32, align 4<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = alloca i32*, align 8<br>
+; IS________OPM-NEXT:    store i32 [[TMP0]], i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    br label [[TMP4:%.*]]<br>
+; IS________OPM:       4:<br>
+; IS________OPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    [[TMP6:%.*]] = add nsw i32 [[TMP5]], -1<br>
+; IS________OPM-NEXT:    store i32 [[TMP6]], i32* [[TMP2]], align 4<br>
+; IS________OPM-NEXT:    [[TMP7:%.*]] = icmp sgt i32 [[TMP6]], 0<br>
+; IS________OPM-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP11:%.*]]<br>
+; IS________OPM:       8:<br>
+; IS________OPM-NEXT:    [[TMP9:%.*]] = call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[TMP10:%.*]] = bitcast i8* [[TMP9]] to i32*<br>
+; IS________OPM-NEXT:    store i32 1, i32* [[TMP10]], align 8<br>
+; IS________OPM-NEXT:    br label [[TMP4]]<br>
+; IS________OPM:       11:<br>
+; IS________OPM-NEXT:    ret i32 5<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@malloc_in_loop<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP2:%.*]] = alloca i32, align 4<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = alloca i32*, align 8<br>
+; IS________NPM-NEXT:    store i32 [[TMP0]], i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    br label [[TMP4:%.*]]<br>
+; IS________NPM:       4:<br>
+; IS________NPM-NEXT:    [[TMP5:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    [[TMP6:%.*]] = add nsw i32 [[TMP5]], -1<br>
+; IS________NPM-NEXT:    store i32 [[TMP6]], i32* [[TMP2]], align 4<br>
+; IS________NPM-NEXT:    [[TMP7:%.*]] = icmp sgt i32 [[TMP6]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TMP7]], label [[TMP8:%.*]], label [[TMP11:%.*]]<br>
+; IS________NPM:       8:<br>
+; IS________NPM-NEXT:    [[TMP9:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    [[TMP10:%.*]] = bitcast i8* [[TMP9]] to i32*<br>
+; IS________NPM-NEXT:    store i32 1, i32* [[TMP10]], align 8<br>
+; IS________NPM-NEXT:    br label [[TMP4]]<br>
+; IS________NPM:       11:<br>
+; IS________NPM-NEXT:    ret i32 5<br>
+;<br>
   %2 = alloca i32, align 4<br>
   %3 = alloca i32*, align 8<br>
   store i32 %0, i32* %2, align 4<br>
@@ -308,7 +617,6 @@ define i32 @malloc_in_loop(i32 %0) {<br>
<br>
 8:                                                ; preds = %4<br>
   %9 = call noalias i8* @malloc(i64 4)<br>
-  ; CHECK: alloca i8, i64 4<br>
   %10 = bitcast i8* %9 to i32*<br>
   store i32 1, i32* %10, align 8<br>
   br label %4<br>
@@ -319,104 +627,167 @@ define i32 @malloc_in_loop(i32 %0) {<br>
<br>
 ; Malloc/Calloc too large<br>
 define i32 @test13() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test13()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 256)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; CHECK-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 256)<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 256)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
   tail call void @free(i8* %1)<br>
-  ; CHECK: tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) %1)<br>
   ret i32 %3<br>
 }<br>
<br>
 define i32 @test_sle() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_sle()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 -1)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; CHECK-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 -1)<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 -1)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
   tail call void @free(i8* %1)<br>
-  ; CHECK: tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) %1)<br>
   ret i32 %3<br>
 }<br>
<br>
 define i32 @test_overflow() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_overflow()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @calloc(i64 65537, i64 65537)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*<br>
+; CHECK-NEXT:    store i32 10, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) [[TMP1]])<br>
+; CHECK-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %1 = tail call noalias i8* @calloc(i64 65537, i64 65537)<br>
-  ; CHECK: %1 = tail call noalias i8* @calloc(i64 65537, i64 65537)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   %2 = bitcast i8* %1 to i32*<br>
   store i32 10, i32* %2<br>
   %3 = load i32, i32* %2<br>
   tail call void @free(i8* %1)<br>
-  ; CHECK: tail call void @free(i8* noalias nonnull align 4 dereferenceable(4) %1)<br>
   ret i32 %3<br>
 }<br>
<br>
 define void @test14() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test14()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @calloc(i64 64, i64 4)<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @calloc(i64 64, i64 4)<br>
-  ; CHECK: %1 = tail call noalias i8* @calloc(i64 64, i64 4)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
   tail call void @free(i8* %1)<br>
-  ; CHECK: tail call void @free(i8* noalias %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test15(i64 %S) {<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 %S)<br>
+; CHECK-LABEL: define {{[^@]+}}@test15<br>
+; CHECK-SAME: (i64 [[S:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 [[S]])<br>
+; CHECK-NEXT:    tail call void @no_sync_func(i8* noalias nofree [[TMP1]])<br>
+; CHECK-NEXT:    tail call void @free(i8* noalias [[TMP1]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 %S)<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
-  ; CHECK-NEXT: @free(i8* noalias %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test16a(i8 %v, i8** %P) {<br>
-  ; CHECK: %1 = alloca<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test16a<br>
+; IS________OPM-SAME: (i8 [[V:%.*]], i8** nocapture nofree readnone [[P:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    store i8 [[V]], i8* [[TMP1]]<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* noalias nofree nonnull dereferenceable(1) [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* noalias nonnull dereferenceable(1) [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test16a<br>
+; IS________NPM-SAME: (i8 [[V:%.*]], i8** nocapture nofree readnone [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    store i8 [[V]], i8* [[TMP1]]<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* noalias nocapture nofree nonnull dereferenceable(1) [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: store i8 %v, i8* %1<br>
   store i8 %v, i8* %1<br>
-  ; CHECK-NEXT: @no_sync_func(i8* noalias nocapture nofree nonnull dereferenceable(1) %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
-  ; CHECK-NOT: @free(i8* %1)<br>
   tail call void @free(i8* nonnull dereferenceable(1) %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test16b(i8 %v, i8** %P) {<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test16b<br>
+; IS________OPM-SAME: (i8 [[V:%.*]], i8** nocapture writeonly [[P:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    store i8* [[TMP1]], i8** [[P]]<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test16b<br>
+; IS________NPM-SAME: (i8 [[V:%.*]], i8** nocapture writeonly [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    store i8* [[TMP1]], i8** [[P]]<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    tail call void @free(i8* [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: store i8* %1, i8** %P<br>
   store i8* %1, i8** %P<br>
-  ; CHECK-NEXT: @no_sync_func(i8* nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1)<br>
-  ; CHECK-NEXT: @free(i8* %1)<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test16c(i8 %v, i8** %P) {<br>
-  ; CHECK: %1 = alloca<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test16c<br>
+; IS________OPM-SAME: (i8 [[V:%.*]], i8** nocapture writeonly [[P:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    store i8* [[TMP1]], i8** [[P]]<br>
+; IS________OPM-NEXT:    tail call void @no_sync_func(i8* nofree [[TMP1]])<br>
+; IS________OPM-NEXT:    tail call void @free(i8* [[TMP1]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test16c<br>
+; IS________NPM-SAME: (i8 [[V:%.*]], i8** nocapture writeonly [[P:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP1:%.*]] = alloca i8, i64 4<br>
+; IS________NPM-NEXT:    store i8* [[TMP1]], i8** [[P]]<br>
+; IS________NPM-NEXT:    tail call void @no_sync_func(i8* nocapture nofree [[TMP1]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: store i8* %1, i8** %P<br>
   store i8* %1, i8** %P<br>
-  ; CHECK-NEXT: @no_sync_func(i8* nocapture nofree %1)<br>
   tail call void @no_sync_func(i8* %1) nounwind<br>
-  ; CHECK-NOT: @free<br>
   tail call void @free(i8* %1)<br>
   ret void<br>
 }<br>
<br>
 define void @test16d(i8 %v, i8** %P) {<br>
-  ; CHECK: %1 = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-LABEL: define {{[^@]+}}@test16d<br>
+; CHECK-SAME: (i8 [[V:%.*]], i8** nocapture writeonly [[P:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    store i8* [[TMP1]], i8** [[P]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
-  ; CHECK-NEXT: store i8* %1, i8** %P<br>
   store i8* %1, i8** %P<br>
   ret void<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/internal-noalias.ll b/llvm/test/Transforms/Attributor/internal-noalias.ll<br>
index 600da85001bd..2df1c11d9bb9 100644<br>
--- a/llvm/test/Transforms/Attributor/internal-noalias.ll<br>
+++ b/llvm/test/Transforms/Attributor/internal-noalias.ll<br>
@@ -1,6 +1,26 @@<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define dso_local i32 @visible(i32* noalias %A, i32* noalias %B) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@visible<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nofree readonly [[A:%.*]], i32* noalias nocapture nofree readonly [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32 @noalias_args(i32* noalias nocapture nofree readonly align 4 [[A]], i32* noalias nocapture nofree readonly align 4 [[B]])<br>
+; IS__TUNIT____-NEXT:    [[CALL2:%.*]] = call i32 @noalias_args_argmem(i32* noalias nocapture nofree readonly align 4 [[A]], i32* noalias nocapture nofree readonly align 4 [[B]])<br>
+; IS__TUNIT____-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@visible<br>
+; IS__CGSCC____-SAME: (i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i32 @noalias_args(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    [[CALL2:%.*]] = call i32 @noalias_args_argmem(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
 entry:<br>
   %call1 = call i32 @noalias_args(i32* %A, i32* %B)<br>
   %call2 = call i32 @noalias_args_argmem(i32* %A, i32* %B)<br>
@@ -8,9 +28,27 @@ entry:<br>
   ret i32 %add<br>
 }<br>
<br>
-; CHECK: define private i32 @noalias_args(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) %A, i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) %B)<br>
-<br>
 define private i32 @noalias_args(i32* %A, i32* %B) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@noalias_args<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]]<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    [[ADD2:%.*]] = add nsw i32 [[ADD]], [[CALL]]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[ADD2]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@noalias_args<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]]<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    [[ADD2:%.*]] = add nsw i32 [[ADD]], [[CALL]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[ADD2]]<br>
+;<br>
 entry:<br>
   %0 = load i32, i32* %A, align 4<br>
   %1 = load i32, i32* %B, align 4<br>
@@ -21,8 +59,23 @@ entry:<br>
 }<br>
<br>
<br>
-; CHECK: define internal i32 @noalias_args_argmem(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) %A, i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) %B)<br>
 define internal i32 @noalias_args_argmem(i32* %A, i32* %B) #1 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@noalias_args_argmem<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@noalias_args_argmem<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], [[TMP1]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
 entry:<br>
   %0 = load i32, i32* %A, align 4<br>
   %1 = load i32, i32* %B, align 4<br>
@@ -31,6 +84,26 @@ entry:<br>
 }<br>
<br>
 define dso_local i32 @visible_local(i32* %A) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@visible_local<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32 @noalias_args(i32* nocapture nofree readonly align 4 [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    [[CALL2:%.*]] = call i32 @noalias_args_argmem(i32* nocapture nofree readonly align 4 [[A]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@visible_local<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i32 @noalias_args(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    [[CALL2:%.*]] = call i32 @noalias_args_argmem(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A]], i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    [[ADD:%.*]] = add nsw i32 [[CALL1]], [[CALL2]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
 entry:<br>
   %B = alloca i32, align 4<br>
   store i32 5, i32* %B, align 4<br>
@@ -40,8 +113,32 @@ entry:<br>
   ret i32 %add<br>
 }<br>
<br>
-; CHECK: define internal i32 @noalias_args_argmem_ro(i32 %0, i32 %1)<br>
 define internal i32 @noalias_args_argmem_ro(i32* %A, i32* %B) #1 {<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@noalias_args_argmem_ro<br>
+; IS__TUNIT_OPM-SAME: (i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[T0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[T1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[ADD:%.*]] = add nsw i32 [[T0]], [[T1]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[ADD]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@noalias_args_argmem_ro<br>
+; IS__TUNIT_NPM-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[B_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP1]], i32* [[B_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[A_PRIV:%.*]] = alloca i32<br>
+; IS__TUNIT_NPM-NEXT:    store i32 [[TMP0]], i32* [[A_PRIV]]<br>
+; IS__TUNIT_NPM-NEXT:    [[T0:%.*]] = load i32, i32* [[A_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[T1:%.*]] = load i32, i32* [[B_PRIV]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[ADD:%.*]] = add nsw i32 [[T0]], [[T1]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[ADD]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@noalias_args_argmem_ro<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[A:%.*]], i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[T0:%.*]] = load i32, i32* [[A]], align 4<br>
+; IS__CGSCC____-NEXT:    [[T1:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[ADD:%.*]] = add nsw i32 [[T0]], [[T1]]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[ADD]]<br>
+;<br>
   %t0 = load i32, i32* %A, align 4<br>
   %t1 = load i32, i32* %B, align 4<br>
   %add = add nsw i32 %t0, %t1<br>
@@ -49,20 +146,63 @@ define internal i32 @noalias_args_argmem_ro(i32* %A, i32* %B) #1 {<br>
 }<br>
<br>
 define i32 @visible_local_2() {<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@visible_local_2()<br>
+; IS__TUNIT_OPM-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_OPM-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__TUNIT_OPM-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem_ro(i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]], i32* noalias nocapture nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[CALL]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@visible_local_2()<br>
+; IS__TUNIT_NPM-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT_NPM-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP1:%.*]] = load i32, i32* [[B]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[TMP2:%.*]] = load i32, i32* [[B]], align 1<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem_ro(i32 [[TMP1]], i32 [[TMP2]])<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@visible_local_2()<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem_ro(i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[B]], i32* noalias nofree nonnull readonly align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[CALL]]<br>
+;<br>
   %B = alloca i32, align 4<br>
   store i32 5, i32* %B, align 4<br>
   %call = call i32 @noalias_args_argmem_ro(i32* %B, i32* %B)<br>
   ret i32 %call<br>
 }<br>
<br>
-; CHECK: define internal i32 @noalias_args_argmem_rn(i32* noalias nocapture nofree nonnull align 4 dereferenceable(4) %B)<br>
 define internal i32 @noalias_args_argmem_rn(i32* %A, i32* %B) #1 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@noalias_args_argmem_rn<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nofree nonnull align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[T0:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    store i32 0, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    ret i32 [[T0]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@noalias_args_argmem_rn<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull align 4 dereferenceable(4) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[T0:%.*]] = load i32, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    store i32 0, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    ret i32 [[T0]]<br>
+;<br>
   %t0 = load i32, i32* %B, align 4<br>
   store i32 0, i32* %B<br>
   ret i32 %t0<br>
 }<br>
<br>
 define i32 @visible_local_3() {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@visible_local_3()<br>
+; IS__TUNIT____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem_rn(i32* noalias nocapture nofree nonnull align 4 dereferenceable(4) [[B]])<br>
+; IS__TUNIT____-NEXT:    ret i32 [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@visible_local_3()<br>
+; IS__CGSCC____-NEXT:    [[B:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    store i32 5, i32* [[B]], align 4<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @noalias_args_argmem_rn(i32* noalias nofree nonnull align 4 dereferenceable(4) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[CALL]]<br>
+;<br>
   %B = alloca i32, align 4<br>
   store i32 5, i32* %B, align 4<br>
   %call = call i32 @noalias_args_argmem_rn(i32* %B, i32* %B)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/liveness.ll b/llvm/test/Transforms/Attributor/liveness.ll<br>
index 5b5aabb1ddcc..bfacc9a9dac0 100644<br>
--- a/llvm/test/Transforms/Attributor/liveness.ll<br>
+++ b/llvm/test/Transforms/Attributor/liveness.ll<br>
@@ -1,15 +1,11 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,MODULE,MODULE_OLD<br>
-; RUN: opt -attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC,CGSCC_OLD<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,MODULE,MODULE_NEW<br>
-; RUN: opt -passes='attributor-cgscc' --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC,CGSCC_NEW<br>
-; XFAIL: *<br>
-; UTC_ARGS: --disable<br>
-<br>
-; MODULE_OLD: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
-; MODULE_NEW: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
-; CGSCC_OLD: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* blockaddress(@dead_with_blockaddress_users, %lab0), i8* blockaddress(@dead_with_blockaddress_users, %end)]<br>
-; CGSCC_NEW: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
+; NOT_CGSCC_OPM: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* inttoptr (i32 1 to i8*), i8* inttoptr (i32 1 to i8*)]<br>
+; IS__CGSCC_OPM: @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* blockaddress(@dead_with_blockaddress_users, %lab0), i8* blockaddress(@dead_with_blockaddress_users, %end)]<br>
 @dead_with_blockaddress_users.l = constant [2 x i8*] [i8* blockaddress(@dead_with_blockaddress_users, %lab0), i8* blockaddress(@dead_with_blockaddress_users, %end)]<br>
<br>
 declare void @no_return_call() nofree noreturn nounwind nosync<br>
@@ -29,8 +25,19 @@ declare i32 @bar() nosync readnone<br>
 ; This internal function has no live call sites, so all its BBs are considered dead,<br>
 ; and nothing should be deduced for it.<br>
<br>
-; MODULE-NOT: define internal i32 @dead_internal_func(i32 %0)<br>
 define internal i32 @dead_internal_func(i32 %0) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@dead_internal_func()<br>
+; IS__CGSCC____-NEXT:    br label [[TMP2:%.*]]<br>
+; IS__CGSCC____:       1:<br>
+; IS__CGSCC____-NEXT:    ret i32 undef<br>
+; IS__CGSCC____:       2:<br>
+; IS__CGSCC____-NEXT:    [[TMP3:%.*]] = phi i32 [ [[TMP6:%.*]], [[TMP2]] ], [ 1, [[TMP0:%.*]] ]<br>
+; IS__CGSCC____-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP5:%.*]], [[TMP2]] ], [ 1, [[TMP0]] ]<br>
+; IS__CGSCC____-NEXT:    [[TMP5]] = mul nsw i32 [[TMP3]], [[TMP4]]<br>
+; IS__CGSCC____-NEXT:    [[TMP6]] = add nuw nsw i32 [[TMP3]], 1<br>
+; IS__CGSCC____-NEXT:    [[TMP7:%.*]] = icmp eq i32 [[TMP3]], 10<br>
+; IS__CGSCC____-NEXT:    br i1 [[TMP7]], label [[TMP1:%.*]], label [[TMP2]]<br>
+;<br>
   %2 = icmp slt i32 %0, 1<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -49,26 +56,41 @@ define internal i32 @dead_internal_func(i32 %0) {<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree norecurse nounwind uwtable willreturn<br>
 define i32 @volatile_load(i32*) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@volatile_load<br>
+; CHECK-SAME: (i32* nofree align 4 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load volatile i32, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
   %2 = load volatile i32, i32* %0, align 4<br>
   ret i32 %2<br>
 }<br>
<br>
-; MODULE-NOT: internal_load<br>
 define internal i32 @internal_load(i32*) norecurse nounwind uwtable {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@internal_load()<br>
+; IS__CGSCC____-NEXT:    ret i32 undef<br>
+;<br>
   %2 = load i32, i32* %0, align 4<br>
   ret i32 %2<br>
 }<br>
 ; TEST 1: Only first block is live.<br>
<br>
 ; CHECK: Function Attrs: nofree noreturn nosync nounwind<br>
-; MODULE-NEXT: define i32 @first_block_no_return(i32 %a, i32* nocapture nofree nonnull readnone %ptr1, i32* nocapture nofree readnone %ptr2)<br>
-; CGSCC-NEXT:  define i32 @first_block_no_return(i32 %a, i32* nocapture nofree nonnull readnone %ptr1, i32* nocapture nofree readnone %ptr2)<br>
 define i32 @first_block_no_return(i32 %a, i32* nonnull %ptr1, i32* %ptr2) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@first_block_no_return<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32* nocapture nofree nonnull readnone [[PTR1:%.*]], i32* nocapture nofree readnone [[PTR2:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    call void @no_return_call()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   call i32 @internal_load(i32* %ptr1)<br>
   call void @no_return_call()<br>
-  ; CHECK: call void @no_return_call()<br>
-  ; CHECK-NEXT: unreachable<br>
   call i32 @dead_internal_func(i32 10)<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
@@ -96,16 +118,28 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 ; dead block and check if it is deduced.<br>
<br>
 ; CHECK: Function Attrs: nosync<br>
-; CHECK-NEXT: define i32 @dead_block_present(i32 %a, i32* nocapture nofree readnone %ptr1)<br>
 define i32 @dead_block_present(i32 %a, i32* %ptr1) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@dead_block_present<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32* nocapture nofree readnone [[PTR1:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    call void @no_return_call()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    ret i32 [[CALL1]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
<br>
 cond.true:                                        ; preds = %entry<br>
   call void @no_return_call()<br>
-  ; CHECK: call void @no_return_call()<br>
-  ; CHECK-NEXT: unreachable<br>
   %call = call i32 @volatile_load(i32* %ptr1)<br>
   br label %cond.end<br>
<br>
@@ -115,8 +149,6 @@ cond.false:                                       ; preds = %entry<br>
   br label %cond.end<br>
<br>
 cond.end:                                         ; preds = %cond.false, %cond.true<br>
-; CHECK:      cond.end:<br>
-; CHECK-NEXT:   ret i32 %call1<br>
   %cond = phi i32 [ %call, %cond.true ], [ %call1, %cond.false ]<br>
   ret i32 %cond<br>
 }<br>
@@ -124,23 +156,32 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 ; TEST 3: both cond.true and cond.false are dead, therfore cond.end is dead as well.<br>
<br>
 define i32 @all_dead(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@all_dead<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    call void @no_return_call()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @no_return_call()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
<br>
 cond.true:                                        ; preds = %entry<br>
   call void @no_return_call()<br>
-  ; CHECK: call void @no_return_call()<br>
-  ; CHECK-NEXT: unreachable<br>
   call i32 @dead_internal_func(i32 10)<br>
-  ; CHECK-NOT: call<br>
   %call = call i32 @foo()<br>
   br label %cond.end<br>
<br>
 cond.false:                                       ; preds = %entry<br>
   call void @no_return_call()<br>
-  ; CHECK: call void @no_return_call()<br>
-  ; CHECK-NEXT: unreachable<br>
   call i32 @dead_internal_func(i32 10)<br>
   %call1 = call i32 @bar()<br>
   br label %cond.end<br>
@@ -154,8 +195,23 @@ declare i32 @__gxx_personality_v0(...)<br>
<br>
 ; TEST 4: All blocks are live.<br>
<br>
-; CHECK: define i32 @all_live(i32 %a)<br>
 define i32 @all_live(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@all_live<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 @foo_noreturn()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    ret i32 [[CALL1]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
@@ -177,8 +233,29 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
<br>
 ; TEST 5.1 noreturn invoke instruction with a unreachable normal successor block.<br>
<br>
-; CHECK: define i32 @invoke_noreturn(i32 %a)<br>
 define i32 @invoke_noreturn(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
+; CHECK-LABEL: define {{[^@]+}}@invoke_noreturn<br>
+; CHECK-SAME: (i32 [[A:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL:%.*]] = invoke i32 @foo_noreturn()<br>
+; CHECK-NEXT:    to label [[CONTINUE:%.*]] unwind label [[CLEANUP:%.*]]<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    ret i32 [[CALL1]]<br>
+; CHECK:       continue:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cleanup:<br>
+; CHECK-NEXT:    [[RES:%.*]] = landingpad { i8*, i32 }<br>
+; CHECK-NEXT:    catch i8* null<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
@@ -186,9 +263,7 @@ entry:<br>
 cond.true:                                        ; preds = %entry<br>
   call void @normal_call()<br>
   %call = invoke i32 @foo_noreturn() to label %continue<br>
-            unwind label %cleanup<br>
-  ; CHECK:      %call = invoke i32 @foo_noreturn()<br>
-  ; CHECK-NEXT:         to label %continue unwind label %cleanup<br>
+  unwind label %cleanup<br>
<br>
 cond.false:                                       ; preds = %entry<br>
   call void @normal_call()<br>
@@ -200,8 +275,6 @@ cond.end:                                         ; preds = %cond.false, %contin<br>
   ret i32 %cond<br>
<br>
 continue:<br>
-  ; CHECK:      continue:<br>
-  ; CHECK-NEXT: unreachable<br>
   br label %cond.end<br>
<br>
 cleanup:<br>
@@ -213,8 +286,27 @@ cleanup:<br>
 ; TEST 5.2 noreturn invoke instruction replaced by a call and an unreachable instruction<br>
 ; put after it.<br>
<br>
-; CHECK: define i32 @invoke_noreturn_nounwind(i32 %a)<br>
 define i32 @invoke_noreturn_nounwind(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
+; CHECK-LABEL: define {{[^@]+}}@invoke_noreturn_nounwind<br>
+; CHECK-SAME: (i32 [[A:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 @foo_noreturn_nounwind()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    ret i32 [[CALL1]]<br>
+; CHECK:       continue:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cleanup:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
@@ -222,12 +314,8 @@ entry:<br>
 cond.true:                                        ; preds = %entry<br>
   call void @normal_call()<br>
   %call = invoke i32 @foo_noreturn_nounwind() to label %continue<br>
-            unwind label %cleanup<br>
-  ; CHECK:      call void @normal_call()<br>
-  ; CHECK-NEXT: call i32 @foo_noreturn_nounwind()<br>
-  ; CHECK-NEXT: unreachable<br>
+  unwind label %cleanup<br>
<br>
-  ; CHECK-NOT:      @foo_noreturn_nounwind()<br>
<br>
 cond.false:                                       ; preds = %entry<br>
   call void @normal_call()<br>
@@ -250,12 +338,25 @@ cleanup:<br>
 ; TEST 5.3 unounwind invoke instruction replaced by a call and a branch instruction put after it.<br>
 define i32 @invoke_nounwind(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@invoke_nounwind<br>
+; CHECK-SAME: (i32 [[A:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
 ; CHECK:       cond.true:<br>
 ; CHECK-NEXT:    call void @normal_call()<br>
 ; CHECK-NEXT:    [[CALL:%.*]] = call i32 @foo_nounwind()<br>
 ; CHECK-NEXT:    br label [[CONTINUE:%.*]]<br>
-; CHECK:       continue:<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    call void @normal_call()<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @bar()<br>
 ; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[CALL]], [[CONTINUE]] ], [ [[CALL1]], [[COND_FALSE]] ]<br>
+; CHECK-NEXT:    ret i32 [[COND]]<br>
+; CHECK:       continue:<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cleanup:<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
@@ -284,8 +385,6 @@ cleanup:<br>
   ret i32 0<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
-<br>
 ; TEST 5.4 unounwind invoke instruction replaced by a call and a branch instruction put after it.<br>
 define i32 @invoke_nounwind_phi(i32 %a) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@invoke_nounwind_phi<br>
@@ -374,13 +473,18 @@ cleanup:<br>
   ret i32 0<br>
 }<br>
<br>
-; UTC_ARGS: --disable<br>
-<br>
 ; TEST 6: Undefined behvior, taken from LangRef.<br>
 ; FIXME: Should be able to detect undefined behavior.<br>
<br>
-; CHECK: define void @ub(i32* nocapture nofree writeonly %0)<br>
 define void @ub(i32* %0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@ub<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[POISON:%.*]] = sub nuw i32 0, 1<br>
+; CHECK-NEXT:    [[STILL_POISON:%.*]] = and i32 [[POISON]], 0<br>
+; CHECK-NEXT:    [[POISON_YET_AGAIN:%.*]] = getelementptr i32, i32* [[TMP0]], i32 [[STILL_POISON]]<br>
+; CHECK-NEXT:    store i32 0, i32* [[POISON_YET_AGAIN]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %poison = sub nuw i32 0, 1           ; Results in a poison value.<br>
   %still_poison = and i32 %poison, 0   ; 0, but also poison.<br>
   %poison_yet_again = getelementptr i32, i32* %0, i32 %still_poison<br>
@@ -389,6 +493,12 @@ define void @ub(i32* %0) {<br>
 }<br>
<br>
 define void @inf_loop() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@inf_loop()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY]]<br>
+;<br>
 entry:<br>
   br label %while.body<br>
<br>
@@ -400,6 +510,20 @@ while.body:                                       ; preds = %entry, %while.body<br>
 ; FIXME: Detect infloops, and mark affected blocks dead.<br>
<br>
 define i32 @test5(i32, i32) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test5<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[COND_IF:%.*]], label [[COND_ELSEIF:%.*]]<br>
+; CHECK:       cond.if:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.elseif:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.else:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
   %3 = icmp sgt i32 %0, %1<br>
   br i1 %3, label %cond.if, label %cond.elseif<br>
<br>
@@ -422,6 +546,10 @@ cond.end:                                               ; preds = %cond.if, %con<br>
 }<br>
<br>
 define void @rec() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rec()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   call void @rec()<br>
   ret void<br>
@@ -432,6 +560,18 @@ entry:<br>
 ; and unreachable should be put after call to @rec().<br>
<br>
 define i32 @test6(i32, i32) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.if:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.elseif:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.else:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @rec()<br>
   %3 = icmp sgt i32 %0, %1<br>
   br i1 %3, label %cond.if, label %cond.elseif<br>
@@ -457,6 +597,24 @@ cond.end:                                               ; preds = %cond.if, %con<br>
 ; FIXME: contains recursive call to itself in cond.elseif block<br>
<br>
 define i32 @test7(i32, i32) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test7<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[COND_IF:%.*]], label [[COND_ELSEIF:%.*]]<br>
+; CHECK:       cond.if:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @bar()<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.elseif:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @test7(i32 [[TMP0]], i32 [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = icmp slt i32 [[TMP0]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP6]], label [[COND_END]], label [[COND_ELSE:%.*]]<br>
+; CHECK:       cond.else:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = tail call i32 @foo()<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ [[TMP1]], [[COND_ELSEIF]] ], [ 0, [[COND_ELSE]] ], [ 0, [[COND_IF]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP8]]<br>
+;<br>
   %3 = icmp sgt i32 %0, %1<br>
   br i1 %3, label %cond.if, label %cond.elseif<br>
<br>
@@ -498,12 +656,21 @@ cond.end:                                               ; preds = %cond.if, %con<br>
 @a2 = common global i8 0, align 16<br>
<br>
 define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {<br>
-; ATTRIBUTOR: define internal i8* @f1(i8* readnone %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@f1<br>
+; CHECK-SAME: (i8* readnone [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* @f2(i8* nonnull @a1)<br>
+; CHECK-NEXT:    br label [[TMP5]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
<br>
 ; <label>:3:                                      ; preds = %1<br>
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 8 @a1)<br>
   %4 = tail call i8* @f2(i8* nonnull @a1)<br>
   br label %5<br>
<br>
@@ -513,18 +680,29 @@ define internal i8* @f1(i8* readnone %0) local_unnamed_addr #0 {<br>
 }<br>
<br>
 define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {<br>
-; ATTRIBUTOR: define internal i8* @f2(i8* readnone %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@f2<br>
+; CHECK-SAME: (i8* readnone [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* @f1(i8* nonnull [[TMP0]])<br>
+; CHECK-NEXT:    br label [[TMP7:%.*]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = tail call i8* @f3(i8* nonnull @a2)<br>
+; CHECK-NEXT:    br label [[TMP7]]<br>
+; CHECK:       7:<br>
+; CHECK-NEXT:    [[TMP8:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP6]], [[TMP5]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP8]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %5, label %3<br>
<br>
 ; <label>:3:                                      ; preds = %1<br>
<br>
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 8 %0)<br>
   %4 = tail call i8* @f1(i8* nonnull %0)<br>
   br label %7<br>
<br>
 ; <label>:5:                                      ; preds = %1<br>
-; ATTRIBUTOR: %6 = tail call i8* undef(i8* nonnull align 16 @a2)<br>
   %6 = tail call i8* @f3(i8* nonnull @a2)<br>
   br label %7<br>
<br>
@@ -534,12 +712,21 @@ define internal i8* @f2(i8* readnone %0) local_unnamed_addr #0 {<br>
 }<br>
<br>
 define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {<br>
-; ATTRIBUTOR: define internal i8* @f3(i8* readnone %0)<br>
+; CHECK-LABEL: define {{[^@]+}}@f3<br>
+; CHECK-SAME: (i8* readnone [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* @f1(i8* nonnull @a2)<br>
+; CHECK-NEXT:    br label [[TMP5]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ @a1, [[TMP1:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
<br>
 ; <label>:3:                                      ; preds = %1<br>
-; ATTRIBUTOR: %4 = tail call i8* undef(i8* nonnull align 16 @a2)<br>
   %4 = tail call i8* @f1(i8* nonnull @a2)<br>
   br label %5<br>
<br>
@@ -550,17 +737,37 @@ define internal i8* @f3(i8* readnone %0) local_unnamed_addr #0 {<br>
<br>
 declare void @sink() nofree nosync nounwind willreturn<br>
 define void @test_unreachable() {<br>
-; CHECK:       define void @test_unreachable()<br>
+; CHECK-LABEL: define {{[^@]+}}@test_unreachable()<br>
 ; CHECK-NEXT:    call void @sink()<br>
 ; CHECK-NEXT:    call void @test_unreachable()<br>
 ; CHECK-NEXT:    unreachable<br>
-; CHECK-NEXT:  }<br>
+;<br>
   call void @sink()<br>
   call void @test_unreachable()<br>
   unreachable<br>
 }<br>
<br>
 define linkonce_odr void @non_exact1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact1()<br>
+; CHECK-NEXT:    call void @non_dead_a0()<br>
+; CHECK-NEXT:    call void @non_dead_a1()<br>
+; CHECK-NEXT:    call void @non_dead_a2()<br>
+; CHECK-NEXT:    call void @non_dead_a3()<br>
+; CHECK-NEXT:    call void @non_dead_a4()<br>
+; CHECK-NEXT:    call void @non_dead_a5()<br>
+; CHECK-NEXT:    call void @non_dead_a6()<br>
+; CHECK-NEXT:    call void @non_dead_a7()<br>
+; CHECK-NEXT:    call void @non_dead_a8()<br>
+; CHECK-NEXT:    call void @non_dead_a9()<br>
+; CHECK-NEXT:    call void @non_dead_a10()<br>
+; CHECK-NEXT:    call void @non_dead_a11()<br>
+; CHECK-NEXT:    call void @non_dead_a12()<br>
+; CHECK-NEXT:    call void @non_dead_a13()<br>
+; CHECK-NEXT:    call void @non_dead_a14()<br>
+; CHECK-NEXT:    call void @non_dead_a15()<br>
+; CHECK-NEXT:    call void @middle()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @non_dead_a0()<br>
   call void @non_dead_a1()<br>
   call void @non_dead_a2()<br>
@@ -581,6 +788,35 @@ define linkonce_odr void @non_exact1() {<br>
   ret void<br>
 }<br>
 define internal void @middle() {<br>
+; CHECK-LABEL: define {{[^@]+}}@middle()<br>
+; CHECK-NEXT:  bb0:<br>
+; CHECK-NEXT:    call void @non_dead_b0()<br>
+; CHECK-NEXT:    call void @non_dead_b1()<br>
+; CHECK-NEXT:    call void @non_dead_b2()<br>
+; CHECK-NEXT:    call void @non_dead_b3()<br>
+; CHECK-NEXT:    br label [[BB1:%.*]]<br>
+; CHECK:       bb1:<br>
+; CHECK-NEXT:    call void @non_dead_b4()<br>
+; CHECK-NEXT:    call void @non_dead_b5()<br>
+; CHECK-NEXT:    call void @non_dead_b6()<br>
+; CHECK-NEXT:    call void @non_dead_b7()<br>
+; CHECK-NEXT:    br label [[BB2:%.*]]<br>
+; CHECK:       bb2:<br>
+; CHECK-NEXT:    call void @non_dead_b8()<br>
+; CHECK-NEXT:    call void @non_dead_b9()<br>
+; CHECK-NEXT:    call void @non_dead_b10()<br>
+; CHECK-NEXT:    call void @non_dead_b11()<br>
+; CHECK-NEXT:    br label [[BB3:%.*]]<br>
+; CHECK:       bb3:<br>
+; CHECK-NEXT:    call void @non_dead_b12()<br>
+; CHECK-NEXT:    call void @non_dead_b13()<br>
+; CHECK-NEXT:    call void @non_dead_b14()<br>
+; CHECK-NEXT:    call void @non_dead_b15()<br>
+; CHECK-NEXT:    br label [[BB4:%.*]]<br>
+; CHECK:       bb4:<br>
+; CHECK-NEXT:    call void @non_exact2()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 bb0:<br>
   call void @non_dead_b0()<br>
   call void @non_dead_b1()<br>
@@ -610,6 +846,26 @@ bb4:<br>
   ret void<br>
 }<br>
 define linkonce_odr void @non_exact2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact2()<br>
+; CHECK-NEXT:    call void @non_dead_c0()<br>
+; CHECK-NEXT:    call void @non_dead_c1()<br>
+; CHECK-NEXT:    call void @non_dead_c2()<br>
+; CHECK-NEXT:    call void @non_dead_c3()<br>
+; CHECK-NEXT:    call void @non_dead_c4()<br>
+; CHECK-NEXT:    call void @non_dead_c5()<br>
+; CHECK-NEXT:    call void @non_dead_c6()<br>
+; CHECK-NEXT:    call void @non_dead_c7()<br>
+; CHECK-NEXT:    call void @non_dead_c8()<br>
+; CHECK-NEXT:    call void @non_dead_c9()<br>
+; CHECK-NEXT:    call void @non_dead_c10()<br>
+; CHECK-NEXT:    call void @non_dead_c11()<br>
+; CHECK-NEXT:    call void @non_dead_c12()<br>
+; CHECK-NEXT:    call void @non_dead_c13()<br>
+; CHECK-NEXT:    call void @non_dead_c14()<br>
+; CHECK-NEXT:    call void @non_dead_c15()<br>
+; CHECK-NEXT:    call void @non_exact3()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @non_dead_c0()<br>
   call void @non_dead_c1()<br>
   call void @non_dead_c2()<br>
@@ -630,6 +886,26 @@ define linkonce_odr void @non_exact2() {<br>
   ret void<br>
 }<br>
 define linkonce_odr void @non_exact3() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact3()<br>
+; CHECK-NEXT:    call void @non_dead_d0()<br>
+; CHECK-NEXT:    call void @non_dead_d1()<br>
+; CHECK-NEXT:    call void @non_dead_d2()<br>
+; CHECK-NEXT:    call void @non_dead_d3()<br>
+; CHECK-NEXT:    call void @non_dead_d4()<br>
+; CHECK-NEXT:    call void @non_dead_d5()<br>
+; CHECK-NEXT:    call void @non_dead_d6()<br>
+; CHECK-NEXT:    call void @non_dead_d7()<br>
+; CHECK-NEXT:    call void @non_dead_d8()<br>
+; CHECK-NEXT:    call void @non_dead_d9()<br>
+; CHECK-NEXT:    call void @non_dead_d10()<br>
+; CHECK-NEXT:    call void @non_dead_d11()<br>
+; CHECK-NEXT:    call void @non_dead_d12()<br>
+; CHECK-NEXT:    call void @non_dead_d13()<br>
+; CHECK-NEXT:    call void @non_dead_d14()<br>
+; CHECK-NEXT:    call void @non_dead_d15()<br>
+; CHECK-NEXT:    [[NR:%.*]] = call i32 @foo_noreturn()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @non_dead_d0()<br>
   call void @non_dead_d1()<br>
   call void @non_dead_d2()<br>
@@ -650,370 +926,531 @@ define linkonce_odr void @non_exact3() {<br>
   call void @dead_e1()<br>
   ret void<br>
 }<br>
-; CHECK:       define linkonce_odr void @non_exact3() {<br>
-; CHECK-NEXT:   call void @non_dead_d0()<br>
-; CHECK-NEXT:   call void @non_dead_d1()<br>
-; CHECK-NEXT:   call void @non_dead_d2()<br>
-; CHECK-NEXT:   call void @non_dead_d3()<br>
-; CHECK-NEXT:   call void @non_dead_d4()<br>
-; CHECK-NEXT:   call void @non_dead_d5()<br>
-; CHECK-NEXT:   call void @non_dead_d6()<br>
-; CHECK-NEXT:   call void @non_dead_d7()<br>
-; CHECK-NEXT:   call void @non_dead_d8()<br>
-; CHECK-NEXT:   call void @non_dead_d9()<br>
-; CHECK-NEXT:   call void @non_dead_d10()<br>
-; CHECK-NEXT:   call void @non_dead_d11()<br>
-; CHECK-NEXT:   call void @non_dead_d12()<br>
-; CHECK-NEXT:   call void @non_dead_d13()<br>
-; CHECK-NEXT:   call void @non_dead_d14()<br>
-; CHECK-NEXT:   call void @non_dead_d15()<br>
-; CHECK-NEXT:   %nr = call i32 @foo_noreturn()<br>
-; CHECK-NEXT:   unreachable<br>
<br>
 define internal void @non_dead_a0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a0()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a1()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a2()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a3() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a3()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a4() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a4()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a5() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a5()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a6() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a6()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a7() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a7()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a8() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a8()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a9() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a9()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a10() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a10()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a11() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a11()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a12() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a12()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a13() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a13()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a14() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a14()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_a15() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_a15()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b0()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b1()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b2()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b3() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b3()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b4() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b4()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b5() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b5()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b6() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b6()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b7() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b7()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b8() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b8()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b9() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b9()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b10() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b10()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b11() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b11()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b12() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b12()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b13() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b13()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b14() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b14()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_b15() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_b15()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c0()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c1()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c2()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c3() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c3()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c4() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c4()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c5() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c5()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c6() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c6()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c7() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c7()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c8() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c8()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c9() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c9()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c10() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c10()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c11() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c11()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c12() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c12()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c13() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c13()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c14() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c14()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_c15() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_c15()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d0()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d1()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d2()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d3() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d3()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d4() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d4()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d5() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d5()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d6() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d6()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d7() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d7()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d8() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d8()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d9() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d9()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d10() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d10()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d11() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d11()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d12() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d12()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d13() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d13()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d14() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d14()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @non_dead_d15() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_dead_d15()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
 define internal void @dead_e0() { call void @dead_e1() ret void }<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@dead_e0()<br>
+; IS__CGSCC____-NEXT:    call void @dead_e1()<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 define internal void @dead_e1() { call void @dead_e2() ret void }<br>
 define internal void @dead_e2() { ret void }<br>
<br>
-; CHECK: define internal void @non_dead_a0()<br>
-; CHECK: define internal void @non_dead_a1()<br>
-; CHECK: define internal void @non_dead_a2()<br>
-; CHECK: define internal void @non_dead_a3()<br>
-; CHECK: define internal void @non_dead_a4()<br>
-; CHECK: define internal void @non_dead_a5()<br>
-; CHECK: define internal void @non_dead_a6()<br>
-; CHECK: define internal void @non_dead_a7()<br>
-; CHECK: define internal void @non_dead_a8()<br>
-; CHECK: define internal void @non_dead_a9()<br>
-; CHECK: define internal void @non_dead_a10()<br>
-; CHECK: define internal void @non_dead_a11()<br>
-; CHECK: define internal void @non_dead_a12()<br>
-; CHECK: define internal void @non_dead_a13()<br>
-; CHECK: define internal void @non_dead_a14()<br>
-; CHECK: define internal void @non_dead_a15()<br>
-; CHECK: define internal void @non_dead_b0()<br>
-; CHECK: define internal void @non_dead_b1()<br>
-; CHECK: define internal void @non_dead_b2()<br>
-; CHECK: define internal void @non_dead_b3()<br>
-; CHECK: define internal void @non_dead_b4()<br>
-; CHECK: define internal void @non_dead_b5()<br>
-; CHECK: define internal void @non_dead_b6()<br>
-; CHECK: define internal void @non_dead_b7()<br>
-; CHECK: define internal void @non_dead_b8()<br>
-; CHECK: define internal void @non_dead_b9()<br>
-; CHECK: define internal void @non_dead_b10()<br>
-; CHECK: define internal void @non_dead_b11()<br>
-; CHECK: define internal void @non_dead_b12()<br>
-; CHECK: define internal void @non_dead_b13()<br>
-; CHECK: define internal void @non_dead_b14()<br>
-; CHECK: define internal void @non_dead_b15()<br>
-; CHECK: define internal void @non_dead_c0()<br>
-; CHECK: define internal void @non_dead_c1()<br>
-; CHECK: define internal void @non_dead_c2()<br>
-; CHECK: define internal void @non_dead_c3()<br>
-; CHECK: define internal void @non_dead_c4()<br>
-; CHECK: define internal void @non_dead_c5()<br>
-; CHECK: define internal void @non_dead_c6()<br>
-; CHECK: define internal void @non_dead_c7()<br>
-; CHECK: define internal void @non_dead_c8()<br>
-; CHECK: define internal void @non_dead_c9()<br>
-; CHECK: define internal void @non_dead_c10()<br>
-; CHECK: define internal void @non_dead_c11()<br>
-; CHECK: define internal void @non_dead_c12()<br>
-; CHECK: define internal void @non_dead_c13()<br>
-; CHECK: define internal void @non_dead_c14()<br>
-; CHECK: define internal void @non_dead_c15()<br>
-; CHECK: define internal void @non_dead_d0()<br>
-; CHECK: define internal void @non_dead_d1()<br>
-; CHECK: define internal void @non_dead_d2()<br>
-; CHECK: define internal void @non_dead_d3()<br>
-; CHECK: define internal void @non_dead_d4()<br>
-; CHECK: define internal void @non_dead_d5()<br>
-; CHECK: define internal void @non_dead_d6()<br>
-; CHECK: define internal void @non_dead_d7()<br>
-; CHECK: define internal void @non_dead_d8()<br>
-; CHECK: define internal void @non_dead_d9()<br>
-; CHECK: define internal void @non_dead_d10()<br>
-; CHECK: define internal void @non_dead_d11()<br>
-; CHECK: define internal void @non_dead_d12()<br>
-; CHECK: define internal void @non_dead_d13()<br>
-; CHECK: define internal void @non_dead_d14()<br>
 ; Verify we actually deduce information for these functions.<br>
-; MODULE: Function Attrs: nofree nosync nounwind willreturn<br>
-; MODULE-NEXT: define internal void @non_dead_d15()<br>
-; MODULE-NOT: define internal void @dead_e<br>
-; CGSCC: Function Attrs: nofree nosync nounwind willreturn<br>
-; CGSCC-NEXT: define internal void @non_dead_d15()<br>
<br>
 declare void @blowup() noreturn<br>
 define void @live_with_dead_entry() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
-; CHECK:      define void @live_with_dead_entry(<br>
-; CHECK-NEXT: entry:<br>
-; CHECK-NEXT:   invoke void @blowup()<br>
-; CHECK-NEXT:           to label %live_with_dead_entry.dead unwind label %lpad<br>
-; CHECK:      lpad:                                             ; preds = %entry<br>
-; CHECK-NEXT:   %0 = landingpad { i8*, i32 }<br>
-; CHECK-NEXT:           catch i8* null<br>
-; CHECK-NEXT:   br label %live_with_dead_entry<br>
-; CHECK:      live_with_dead_entry.dead:                        ; preds = %entry<br>
-; CHECK-NEXT:   unreachable<br>
-; CHECK:      live_with_dead_entry:                             ; preds = %lpad<br>
-; CHECK-NEXT:   ret void<br>
 entry:<br>
   invoke void @blowup() to label %live_with_dead_entry unwind label %lpad<br>
 lpad:<br>
@@ -1024,25 +1461,26 @@ live_with_dead_entry:<br>
 }<br>
<br>
 define void @live_with_dead_entry_lp() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
-; CHECK:      define void @live_with_dead_entry_lp(<br>
-; CHECK-NEXT: entry:<br>
-; CHECK-NEXT:   invoke void @blowup()<br>
-; CHECK-NEXT:    to label %[[LIVE_WITH_DEAD_ENTRY_DEAD1:.*]] unwind label %[[LP1:.*]]<br>
-; CHECK:      [[LP1]]:                                              ; preds = %entry<br>
-; CHECK-NEXT:   %lp = landingpad { i8*, i32 }<br>
-; CHECK-NEXT:           catch i8* null<br>
-; CHECK-NEXT:   invoke void @blowup()<br>
-; CHECK-NEXT:    to label %[[LIVE_WITH_DEAD_ENTRY_DEAD2:.*]] unwind label %[[LP2:.*]]<br>
-; CHECK:      [[LP2]]:                                              ; preds = %lp1<br>
-; CHECK-NEXT:   %0 = landingpad { i8*, i32 }<br>
-; CHECK-NEXT:           catch i8* null<br>
-; CHECK-NEXT:   br label %live_with_dead_entry<br>
-; CHECK:      [[LIVE_WITH_DEAD_ENTRY_DEAD1]]:<br>
-; CHECK-NEXT:   unreachable<br>
-; CHECK:      [[LIVE_WITH_DEAD_ENTRY_DEAD2]]:<br>
-; CHECK-NEXT:   unreachable<br>
-; CHECK:      live_with_dead_entry:                             ; preds = %lp2<br>
-; CHECK-NEXT:   ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@live_with_dead_entry_lp() #2 personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    invoke void @blowup()<br>
+; CHECK-NEXT:    to label [[LIVE_WITH_DEAD_ENTRY_DEAD:%.*]] unwind label [[LP1:%.*]]<br>
+; CHECK:       lp1:<br>
+; CHECK-NEXT:    [[LP:%.*]] = landingpad { i8*, i32 }<br>
+; CHECK-NEXT:    catch i8* null<br>
+; CHECK-NEXT:    invoke void @blowup()<br>
+; CHECK-NEXT:    to label [[LIVE_WITH_DEAD_ENTRY_DEAD1:%.*]] unwind label [[LP2:%.*]]<br>
+; CHECK:       lp2:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = landingpad { i8*, i32 }<br>
+; CHECK-NEXT:    catch i8* null<br>
+; CHECK-NEXT:    br label [[LIVE_WITH_DEAD_ENTRY:%.*]]<br>
+; CHECK:       live_with_dead_entry.dead:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       live_with_dead_entry.dead1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       live_with_dead_entry:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   invoke void @blowup() to label %live_with_dead_entry unwind label %lp1<br>
 lp1:<br>
@@ -1055,68 +1493,81 @@ live_with_dead_entry:<br>
   ret void<br>
 }<br>
<br>
-; CHECK: define internal void @useless_arg_sink()<br>
 define internal void @useless_arg_sink(i32* %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@useless_arg_sink()<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @sink()<br>
   ret void<br>
 }<br>
<br>
-; CHECK: define internal void @useless_arg_almost_sink()<br>
 define internal void @useless_arg_almost_sink(i32* %a) {<br>
-; CHECK: call void @useless_arg_sink()<br>
+; CHECK-LABEL: define {{[^@]+}}@useless_arg_almost_sink()<br>
+; CHECK-NEXT:    call void @useless_arg_sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @useless_arg_sink(i32* %a)<br>
   ret void<br>
 }<br>
<br>
 ; Check we do not annotate the function interface of this weak function.<br>
-; CHECK: define weak_odr void @useless_arg_ext(i32* %a)<br>
 define weak_odr void @useless_arg_ext(i32* %a) {<br>
-; CHECK: call void @useless_arg_almost_sink()<br>
+; CHECK-LABEL: define {{[^@]+}}@useless_arg_ext<br>
+; CHECK-SAME: (i32* [[A:%.*]])<br>
+; CHECK-NEXT:    call void @useless_arg_almost_sink()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @useless_arg_almost_sink(i32* %a)<br>
   ret void<br>
 }<br>
<br>
-; CHECK: define internal void @useless_arg_ext_int(i32* %a)<br>
 define internal void @useless_arg_ext_int(i32* %a) {<br>
-; CHECK: call void @useless_arg_ext(i32* %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@useless_arg_ext_int<br>
+; CHECK-SAME: (i32* [[A:%.*]])<br>
+; CHECK-NEXT:    call void @useless_arg_ext(i32* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @useless_arg_ext(i32* %a)<br>
   ret void<br>
 }<br>
<br>
 define void @useless_arg_ext_int_ext(i32* %a) {<br>
-; CHECK: call void @useless_arg_ext_int(i32* %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@useless_arg_ext_int_ext<br>
+; CHECK-SAME: (i32* [[A:%.*]])<br>
+; CHECK-NEXT:    call void @useless_arg_ext_int(i32* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @useless_arg_ext_int(i32* %a)<br>
   ret void<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
-<br>
 ; FIXME: We should fold terminators.<br>
<br>
 define internal i32 @switch_default(i64 %i) nounwind {<br>
-; MODULE-LABEL: define {{[^@]+}}@switch_default()<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
-; MODULE-NEXT:    i64 3, label [[RETURN:%.*]]<br>
-; MODULE-NEXT:    i64 10, label [[RETURN]]<br>
-; MODULE-NEXT:    ]<br>
-; MODULE:       sw.default:<br>
-; MODULE-NEXT:    call void @sink()<br>
-; MODULE-NEXT:    ret i32 undef<br>
-; MODULE:       return:<br>
-; MODULE-NEXT:    unreachable<br>
-;<br>
-; CGSCC-LABEL: define {{[^@]+}}@switch_default()<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
-; CGSCC-NEXT:    i64 3, label [[RETURN:%.*]]<br>
-; CGSCC-NEXT:    i64 10, label [[RETURN]]<br>
-; CGSCC-NEXT:    ]<br>
-; CGSCC:       sw.default:<br>
-; CGSCC-NEXT:    call void @sink()<br>
-; CGSCC-NEXT:    ret i32 123<br>
-; CGSCC:       return:<br>
-; CGSCC-NEXT:    unreachable<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@switch_default()<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
+; IS__TUNIT____-NEXT:    i64 3, label [[RETURN:%.*]]<br>
+; IS__TUNIT____-NEXT:    i64 10, label [[RETURN]]<br>
+; IS__TUNIT____-NEXT:    ]<br>
+; IS__TUNIT____:       sw.default:<br>
+; IS__TUNIT____-NEXT:    call void @sink()<br>
+; IS__TUNIT____-NEXT:    ret i32 undef<br>
+; IS__TUNIT____:       return:<br>
+; IS__TUNIT____-NEXT:    unreachable<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@switch_default()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
+; IS__CGSCC____-NEXT:    i64 3, label [[RETURN:%.*]]<br>
+; IS__CGSCC____-NEXT:    i64 10, label [[RETURN]]<br>
+; IS__CGSCC____-NEXT:    ]<br>
+; IS__CGSCC____:       sw.default:<br>
+; IS__CGSCC____-NEXT:    call void @sink()<br>
+; IS__CGSCC____-NEXT:    ret i32 123<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
 ;<br>
 entry:<br>
   switch i64 %i, label %sw.default [<br>
@@ -1142,16 +1593,16 @@ define i32 @switch_default_caller() {<br>
 }<br>
<br>
 define internal i32 @switch_default_dead(i64 %i) nounwind {<br>
-; CGSCC-LABEL: define {{[^@]+}}@switch_default_dead()<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
-; CGSCC-NEXT:    i64 3, label [[RETURN:%.*]]<br>
-; CGSCC-NEXT:    i64 10, label [[RETURN]]<br>
-; CGSCC-NEXT:    ]<br>
-; CGSCC:       sw.default:<br>
-; CGSCC-NEXT:    ret i32 123<br>
-; CGSCC:       return:<br>
-; CGSCC-NEXT:    unreachable<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@switch_default_dead()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    switch i64 0, label [[SW_DEFAULT:%.*]] [<br>
+; IS__CGSCC____-NEXT:    i64 3, label [[RETURN:%.*]]<br>
+; IS__CGSCC____-NEXT:    i64 10, label [[RETURN]]<br>
+; IS__CGSCC____-NEXT:    ]<br>
+; IS__CGSCC____:       sw.default:<br>
+; IS__CGSCC____-NEXT:    ret i32 123<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
 ;<br>
 entry:<br>
   switch i64 %i, label %sw.default [<br>
@@ -1185,79 +1636,45 @@ define void @call_via_pointer_with_dead_args(i32* %a, i32* %b, void (i32*, i32*,<br>
 }<br>
 ; FIXME: We have to prevent the propagation of %fp in the new pm CGSCC pass until the CallGraphUpdater can handle the new call edge.<br>
 define internal void @call_via_pointer_with_dead_args_internal_a(i32* %a, i32* %b, void (i32*, i32*, i32*, i64, i32**)* %fp) {<br>
-; MODULE-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_a<br>
-; MODULE-SAME: (i32* [[A:%.*]], i32* nonnull align 128 dereferenceable(4) [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
-; MODULE-NEXT:    call void @called_via_pointer(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[B]], i32* [[A]], i64 -1, i32** null)<br>
-; MODULE-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_a<br>
+; IS__TUNIT____-SAME: (i32* [[A:%.*]], i32* nonnull align 128 dereferenceable(4) [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @called_via_pointer(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[B]], i32* [[A]], i64 -1, i32** null)<br>
+; IS__TUNIT____-NEXT:    ret void<br>
 ;<br>
-; CGSCC_OLD-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_a<br>
-; CGSCC_OLD-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
-; CGSCC_OLD-NEXT:    call void @called_via_pointer(i32* [[A]], i32* [[B]], i32* [[A]], i64 -1, i32** null)<br>
-; CGSCC_OLD-NEXT:    ret void<br>
-;<br>
-; CGSCC_NEW-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_a<br>
-; CGSCC_NEW-SAME: (i32* [[A:%.*]], i32* [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
-; CGSCC_NEW-NEXT:    call void [[FP]](i32* [[A]], i32* [[B]], i32* [[A]], i64 -1, i32** null)<br>
-; CGSCC_NEW-NEXT:    ret void<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_a<br>
+; IS__CGSCC____-SAME: (i32* [[A:%.*]], i32* [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i32* [[A]], i32* [[B]], i32* [[A]], i64 -1, i32** null)<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   call void %fp(i32* %a, i32* %b, i32* %a, i64 -1, i32** null)<br>
   ret void<br>
 }<br>
 define internal void @call_via_pointer_with_dead_args_internal_b(i32* %a, i32* %b, void (i32*, i32*, i32*, i64, i32**)* %fp) {<br>
-; MODULE-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_b<br>
-; MODULE-SAME: (i32* [[A:%.*]], i32* nonnull align 128 dereferenceable(4) [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
-; MODULE-NEXT:    call void @called_via_pointer_internal_2(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[B]], i32* [[A]], i64 -1, i32** null)<br>
-; MODULE-NEXT:    ret void<br>
-;<br>
-; CGSCC_OLD-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_b<br>
-; CGSCC_OLD-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
-; CGSCC_OLD-NEXT:    call void @called_via_pointer_internal_2(i32* [[A]])<br>
-; CGSCC_OLD-NEXT:    ret void<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_b<br>
+; IS__TUNIT____-SAME: (i32* [[A:%.*]], i32* nonnull align 128 dereferenceable(4) [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @called_via_pointer_internal_2(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[B]], i32* [[A]], i64 -1, i32** null)<br>
+; IS__TUNIT____-NEXT:    ret void<br>
 ;<br>
-; CGSCC_NEW-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_b<br>
-; CGSCC_NEW-SAME: (i32* [[A:%.*]], i32* [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
-; CGSCC_NEW-NEXT:    call void [[FP]](i32* [[A]], i32* [[B]], i32* [[A]], i64 -1, i32** null)<br>
-; CGSCC_NEW-NEXT:    ret void<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_internal_b<br>
+; IS__CGSCC____-SAME: (i32* [[A:%.*]], i32* [[B:%.*]], void (i32*, i32*, i32*, i64, i32**)* nocapture nofree nonnull [[FP:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i32* [[A]], i32* [[B]], i32* [[A]], i64 -1, i32** null)<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   call void %fp(i32* %a, i32* %b, i32* %a, i64 -1, i32** null)<br>
   ret void<br>
 }<br>
 define void @call_via_pointer_with_dead_args_caller(i32* %a, i32* %b) {<br>
-; MODULE-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_caller<br>
-; MODULE-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
-; MODULE-NEXT:    [[PTR1:%.*]] = alloca i32, align 128<br>
-; MODULE-NEXT:    [[PTR2:%.*]] = alloca i32, align 128<br>
-; MODULE-NEXT:    [[PTR3:%.*]] = alloca i32, align 128<br>
-; MODULE-NEXT:    [[PTR4:%.*]] = alloca i32, align 128<br>
-; MODULE-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR1]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
-; MODULE-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR2]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_1)<br>
-; MODULE-NEXT:    call void @call_via_pointer_with_dead_args_internal_a(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR3]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
-; MODULE-NEXT:    call void @call_via_pointer_with_dead_args_internal_b(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR4]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_2)<br>
-; MODULE-NEXT:    ret void<br>
-;<br>
-; CGSCC_OLD-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_caller<br>
-; CGSCC_OLD-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
-; CGSCC_OLD-NEXT:    [[PTR1:%.*]] = alloca i32, align 128<br>
-; CGSCC_OLD-NEXT:    [[PTR2:%.*]] = alloca i32, align 128<br>
-; CGSCC_OLD-NEXT:    [[PTR3:%.*]] = alloca i32, align 128<br>
-; CGSCC_OLD-NEXT:    [[PTR4:%.*]] = alloca i32, align 128<br>
-; CGSCC_OLD-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR1]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
-; CGSCC_OLD-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR2]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_1)<br>
-; CGSCC_OLD-NEXT:    call void @call_via_pointer_with_dead_args_internal_a(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR3]])<br>
-; CGSCC_OLD-NEXT:    call void @call_via_pointer_with_dead_args_internal_b(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR4]])<br>
-; CGSCC_OLD-NEXT:    ret void<br>
-;<br>
-; CGSCC_NEW-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_caller<br>
-; CGSCC_NEW-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
-; CGSCC_NEW-NEXT:    [[PTR1:%.*]] = alloca i32, align 128<br>
-; CGSCC_NEW-NEXT:    [[PTR2:%.*]] = alloca i32, align 128<br>
-; CGSCC_NEW-NEXT:    [[PTR3:%.*]] = alloca i32, align 128<br>
-; CGSCC_NEW-NEXT:    [[PTR4:%.*]] = alloca i32, align 128<br>
-; CGSCC_NEW-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR1]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
-; CGSCC_NEW-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR2]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_1)<br>
-; CGSCC_NEW-NEXT:    call void @call_via_pointer_with_dead_args_internal_a(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR3]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
-; CGSCC_NEW-NEXT:    call void @call_via_pointer_with_dead_args_internal_b(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR4]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_2)<br>
-; CGSCC_NEW-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_via_pointer_with_dead_args_caller<br>
+; CHECK-SAME: (i32* [[A:%.*]], i32* [[B:%.*]])<br>
+; CHECK-NEXT:    [[PTR1:%.*]] = alloca i32, align 128<br>
+; CHECK-NEXT:    [[PTR2:%.*]] = alloca i32, align 128<br>
+; CHECK-NEXT:    [[PTR3:%.*]] = alloca i32, align 128<br>
+; CHECK-NEXT:    [[PTR4:%.*]] = alloca i32, align 128<br>
+; CHECK-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR1]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
+; CHECK-NEXT:    call void @call_via_pointer_with_dead_args(i32* [[A]], i32* nonnull align 128 dereferenceable(4) [[PTR2]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_1)<br>
+; CHECK-NEXT:    call void @call_via_pointer_with_dead_args_internal_a(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR3]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer)<br>
+; CHECK-NEXT:    call void @call_via_pointer_with_dead_args_internal_b(i32* [[B]], i32* nonnull align 128 dereferenceable(4) [[PTR4]], void (i32*, i32*, i32*, i64, i32**)* nofree nonnull @called_via_pointer_internal_2)<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %ptr1 = alloca i32, align 128<br>
   %ptr2 = alloca i32, align 128<br>
@@ -1297,26 +1714,12 @@ entry:<br>
 }<br>
 ; FIXME: Figure out why the MODULE has the unused arguments still<br>
 define internal void @called_via_pointer_internal_2(i32* %a, i32* %b, i32* %c, i64 %d, i32** %e) {<br>
-; MODULE-LABEL: define {{[^@]+}}@called_via_pointer_internal_2<br>
-; MODULE-SAME: (i32* [[A:%.*]], i32* nocapture nofree readnone [[B:%.*]], i32* nocapture nofree readnone [[C:%.*]], i64 [[D:%.*]], i32** nocapture nofree readnone [[E:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; MODULE-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; MODULE-NEXT:    ret void<br>
-;<br>
-; CGSCC_OLD-LABEL: define {{[^@]+}}@called_via_pointer_internal_2<br>
-; CGSCC_OLD-SAME: (i32* [[A:%.*]])<br>
-; CGSCC_OLD-NEXT:  entry:<br>
-; CGSCC_OLD-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; CGSCC_OLD-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; CGSCC_OLD-NEXT:    ret void<br>
-;<br>
-; CGSCC_NEW-LABEL: define {{[^@]+}}@called_via_pointer_internal_2<br>
-; CGSCC_NEW-SAME: (i32* [[A:%.*]], i32* nocapture nofree readnone [[B:%.*]], i32* nocapture nofree readnone [[C:%.*]], i64 [[D:%.*]], i32** nocapture nofree readnone [[E:%.*]])<br>
-; CGSCC_NEW-NEXT:  entry:<br>
-; CGSCC_NEW-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; CGSCC_NEW-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
-; CGSCC_NEW-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@called_via_pointer_internal_2<br>
+; CHECK-SAME: (i32* [[A:%.*]], i32* nocapture nofree readnone [[B:%.*]], i32* nocapture nofree readnone [[C:%.*]], i64 [[D:%.*]], i32** nocapture nofree readnone [[E:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
+; CHECK-NEXT:    tail call void @use_i32p(i32* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   tail call void @use_i32p(i32* %a)<br>
@@ -1325,13 +1728,26 @@ entry:<br>
 }<br>
 declare void @use_i32p(i32*)<br>
<br>
-; UTC_ARGS: --disable<br>
-<br>
 ; Allow blockaddress users<br>
-; MODULE-NOT: @dead_with_blockaddress_users<br>
-; CGSCC_NEW-NOT: @dead_with_blockaddress_users<br>
-; CGSCC_OLD: @dead_with_blockaddress_users<br>
+; NOT_CGSCC_OPM-NOT: @dead_with_blockaddress_users<br>
 define internal void @dead_with_blockaddress_users(i32* nocapture %pc) nounwind readonly {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@dead_with_blockaddress_users<br>
+; IS__CGSCC_OPM-SAME: (i32* nocapture [[PC:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    br label [[INDIRECTGOTO:%.*]]<br>
+; IS__CGSCC_OPM:       lab0:<br>
+; IS__CGSCC_OPM-NEXT:    [[INDVAR_NEXT:%.*]] = add i32 [[INDVAR:%.*]], 1<br>
+; IS__CGSCC_OPM-NEXT:    br label [[INDIRECTGOTO]]<br>
+; IS__CGSCC_OPM:       end:<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+; IS__CGSCC_OPM:       indirectgoto:<br>
+; IS__CGSCC_OPM-NEXT:    [[INDVAR]] = phi i32 [ [[INDVAR_NEXT]], [[LAB0:%.*]] ], [ 0, [[ENTRY:%.*]] ]<br>
+; IS__CGSCC_OPM-NEXT:    [[PC_ADDR_0:%.*]] = getelementptr i32, i32* [[PC]], i32 [[INDVAR]]<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1_PN:%.*]] = load i32, i32* [[PC_ADDR_0]]<br>
+; IS__CGSCC_OPM-NEXT:    [[INDIRECT_GOTO_DEST_IN:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* @dead_with_blockaddress_users.l, i32 0, i32 [[TMP1_PN]]<br>
+; IS__CGSCC_OPM-NEXT:    [[INDIRECT_GOTO_DEST:%.*]] = load i8*, i8** [[INDIRECT_GOTO_DEST_IN]]<br>
+; IS__CGSCC_OPM-NEXT:    indirectbr i8* [[INDIRECT_GOTO_DEST]], [label [[LAB0]], label %end]<br>
+;<br>
 entry:<br>
   br label %indirectgoto<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/liveness_chains.ll b/llvm/test/Transforms/Attributor/liveness_chains.ll<br>
index c9ab99f904f8..3ba97f2a6c78 100644<br>
--- a/llvm/test/Transforms/Attributor/liveness_chains.ll<br>
+++ b/llvm/test/Transforms/Attributor/liveness_chains.ll<br>
@@ -1,8 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s<br>
-; RUN: opt -attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s<br>
-; RUN: opt -passes='attributor-cgscc' --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; Make sure we need a single iteration to determine the chains are dead/alive.<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll b/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll<br>
index 7dbf8d073f65..1511cd3124eb 100644<br>
--- a/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll<br>
+++ b/llvm/test/Transforms/Attributor/lvi-after-jumpthreading.ll<br>
@@ -1,20 +1,38 @@<br>
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
-; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 define i8 @test1(i32 %a, i32 %length) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test1<br>
-; CHECK-SAME: (i32 [[A:%.*]], i32 [[LENGTH:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    br label [[LOOP:%.*]]<br>
-; CHECK:       loop:<br>
-; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    br label [[BACKEDGE]]<br>
-; CHECK:       backedge:<br>
-; CHECK-NEXT:    [[IV_NEXT]] = add nsw i32 [[IV]], 1<br>
-; CHECK-NEXT:    [[CONT:%.*]] = icmp slt i32 [[IV_NEXT]], 400<br>
-; CHECK-NEXT:    br i1 [[CONT]], label [[LOOP]], label [[EXIT:%.*]]<br>
-; CHECK:       exit:<br>
-; CHECK-NEXT:    ret i8 0<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test1<br>
+; IS________OPM-SAME: (i32 [[A:%.*]], i32 [[LENGTH:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    br label [[LOOP:%.*]]<br>
+; IS________OPM:       loop:<br>
+; IS________OPM-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
+; IS________OPM-NEXT:    [[CND:%.*]] = icmp sge i32 [[IV]], 0<br>
+; IS________OPM-NEXT:    br i1 [[CND]], label [[BACKEDGE]], label [[EXIT:%.*]]<br>
+; IS________OPM:       backedge:<br>
+; IS________OPM-NEXT:    [[IV_NEXT]] = add nsw i32 [[IV]], 1<br>
+; IS________OPM-NEXT:    [[CONT:%.*]] = icmp slt i32 [[IV_NEXT]], 400<br>
+; IS________OPM-NEXT:    br i1 [[CONT]], label [[LOOP]], label [[EXIT]]<br>
+; IS________OPM:       exit:<br>
+; IS________OPM-NEXT:    ret i8 0<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test1<br>
+; IS________NPM-SAME: (i32 [[A:%.*]], i32 [[LENGTH:%.*]])<br>
+; IS________NPM-NEXT:  entry:<br>
+; IS________NPM-NEXT:    br label [[LOOP:%.*]]<br>
+; IS________NPM:       loop:<br>
+; IS________NPM-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
+; IS________NPM-NEXT:    br label [[BACKEDGE]]<br>
+; IS________NPM:       backedge:<br>
+; IS________NPM-NEXT:    [[IV_NEXT]] = add nsw i32 [[IV]], 1<br>
+; IS________NPM-NEXT:    [[CONT:%.*]] = icmp slt i32 [[IV_NEXT]], 400<br>
+; IS________NPM-NEXT:    br i1 [[CONT]], label [[LOOP]], label [[EXIT:%.*]]<br>
+; IS________NPM:       exit:<br>
+; IS________NPM-NEXT:    ret i8 0<br>
 ;<br>
 entry:<br>
   br label %loop<br>
@@ -40,7 +58,7 @@ define i8 @test2(i32 %n) {<br>
 ; CHECK-NEXT:    br label [[LOOP:%.*]]<br>
 ; CHECK:       loop:<br>
 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[BACKEDGE:%.*]] ]<br>
-; CHECK-NEXT:    [[IV2:%.*]] = phi i32 [ [[N:%.*]], [[ENTRY]] ], [ [[IV2_NEXT:%.*]], [[BACKEDGE]] ]<br>
+; CHECK-NEXT:    [[IV2:%.*]] = phi i32 [ [[N]], [[ENTRY]] ], [ [[IV2_NEXT:%.*]], [[BACKEDGE]] ]<br>
 ; CHECK-NEXT:    [[CND1:%.*]] = icmp sge i32 [[IV]], 0<br>
 ; CHECK-NEXT:    [[CND2:%.*]] = icmp sgt i32 [[IV2]], 0<br>
 ; CHECK-NEXT:    [[CND:%.*]] = and i1 [[CND1]], [[CND2]]<br>
@@ -81,25 +99,46 @@ exit:<br>
<br>
 ; Merging cont block into do block.<br>
 define i32 @test3(i32 %i, i1 %f, i32 %n) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test3<br>
-; CHECK-SAME: (i32 [[I:%.*]], i1 [[F:%.*]], i32 [[N:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I:%.*]], -2134<br>
-; CHECK-NEXT:    br i1 [[C]], label [[DO:%.*]], label [[EXIT:%.*]]<br>
-; CHECK:       exit:<br>
-; CHECK-NEXT:    [[C1:%.*]] = icmp ne i32 [[I]], -42<br>
-; CHECK-NEXT:    br i1 [[C1]], label [[EXIT2:%.*]], label [[EXIT]]<br>
-; CHECK:       cont:<br>
-; CHECK-NEXT:    [[COND_3:%.*]] = icmp sgt i32 [[I]], [[N:%.*]]<br>
-; CHECK-NEXT:    br i1 [[COND_3]], label [[EXIT2]], label [[EXIT]]<br>
-; CHECK:       do:<br>
-; CHECK-NEXT:    [[COND_0:%.*]] = icmp sgt i32 [[I]], 0<br>
-; CHECK-NEXT:    [[CONSUME:%.*]] = call i32 @consume(i1 [[COND_0]])<br>
-; CHECK-NEXT:    [[COND:%.*]] = icmp eq i32 [[I]], 0<br>
-; CHECK-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND]]) [ "deopt"() ]<br>
-; CHECK-NEXT:    br label [[CONT:%.*]]<br>
-; CHECK:       exit2:<br>
-; CHECK-NEXT:    ret i32 30<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test3<br>
+; IS________OPM-SAME: (i32 [[I:%.*]], i1 [[F:%.*]], i32 [[N:%.*]])<br>
+; IS________OPM-NEXT:  entry:<br>
+; IS________OPM-NEXT:    [[C:%.*]] = icmp ne i32 [[I]], -2134<br>
+; IS________OPM-NEXT:    br i1 [[C]], label [[DO:%.*]], label [[EXIT:%.*]]<br>
+; IS________OPM:       exit:<br>
+; IS________OPM-NEXT:    [[C1:%.*]] = icmp ne i32 [[I]], -42<br>
+; IS________OPM-NEXT:    br i1 [[C1]], label [[EXIT2:%.*]], label [[EXIT]]<br>
+; IS________OPM:       cont:<br>
+; IS________OPM-NEXT:    [[COND_3:%.*]] = icmp sgt i32 [[I]], [[N]]<br>
+; IS________OPM-NEXT:    br i1 [[COND_3]], label [[EXIT2]], label [[EXIT]]<br>
+; IS________OPM:       do:<br>
+; IS________OPM-NEXT:    [[COND_0:%.*]] = icmp sgt i32 [[I]], 0<br>
+; IS________OPM-NEXT:    [[CONSUME:%.*]] = call i32 @consume(i1 [[COND_0]])<br>
+; IS________OPM-NEXT:    [[COND:%.*]] = icmp eq i32 [[I]], 0<br>
+; IS________OPM-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND]]) [ "deopt"() ]<br>
+; IS________OPM-NEXT:    [[COND_2:%.*]] = icmp sgt i32 [[I]], 0<br>
+; IS________OPM-NEXT:    br i1 [[COND_2]], label [[EXIT]], label [[CONT:%.*]]<br>
+; IS________OPM:       exit2:<br>
+; IS________OPM-NEXT:    ret i32 30<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test3<br>
+; IS________NPM-SAME: (i32 [[I:%.*]], i1 [[F:%.*]], i32 [[N:%.*]])<br>
+; IS________NPM-NEXT:  entry:<br>
+; IS________NPM-NEXT:    [[C:%.*]] = icmp ne i32 [[I]], -2134<br>
+; IS________NPM-NEXT:    br i1 [[C]], label [[DO:%.*]], label [[EXIT:%.*]]<br>
+; IS________NPM:       exit:<br>
+; IS________NPM-NEXT:    [[C1:%.*]] = icmp ne i32 [[I]], -42<br>
+; IS________NPM-NEXT:    br i1 [[C1]], label [[EXIT2:%.*]], label [[EXIT]]<br>
+; IS________NPM:       cont:<br>
+; IS________NPM-NEXT:    [[COND_3:%.*]] = icmp sgt i32 [[I]], [[N]]<br>
+; IS________NPM-NEXT:    br i1 [[COND_3]], label [[EXIT2]], label [[EXIT]]<br>
+; IS________NPM:       do:<br>
+; IS________NPM-NEXT:    [[COND_0:%.*]] = icmp sgt i32 [[I]], 0<br>
+; IS________NPM-NEXT:    [[CONSUME:%.*]] = call i32 @consume(i1 [[COND_0]])<br>
+; IS________NPM-NEXT:    [[COND:%.*]] = icmp eq i32 [[I]], 0<br>
+; IS________NPM-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[COND]]) [ "deopt"() ]<br>
+; IS________NPM-NEXT:    br label [[CONT:%.*]]<br>
+; IS________NPM:       exit2:<br>
+; IS________NPM-NEXT:    ret i32 30<br>
 ;<br>
 entry:<br>
   %c = icmp ne i32 %i, -2134<br>
@@ -129,17 +168,18 @@ exit2:<br>
 }<br>
<br>
 ; FIXME: We should be able to merge cont into do.<br>
+; FIXME: COND should be replaced with false. This will be fixed by improving LVI.<br>
 define i32 @test4(i32 %i, i1 %f, i32 %n) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@test4<br>
 ; CHECK-SAME: (i32 [[I:%.*]], i1 [[F:%.*]], i32 [[N:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I:%.*]], -2134<br>
+; CHECK-NEXT:    [[C:%.*]] = icmp ne i32 [[I]], -2134<br>
 ; CHECK-NEXT:    br i1 [[C]], label [[DO:%.*]], label [[EXIT:%.*]]<br>
 ; CHECK:       exit:<br>
 ; CHECK-NEXT:    [[C1:%.*]] = icmp ne i32 [[I]], -42<br>
 ; CHECK-NEXT:    br i1 [[C1]], label [[EXIT2:%.*]], label [[EXIT]]<br>
 ; CHECK:       cont:<br>
-; CHECK-NEXT:    call void @dummy(i1 [[F:%.*]])<br>
+; CHECK-NEXT:    call void @dummy(i1 [[F]])<br>
 ; CHECK-NEXT:    br label [[EXIT2]]<br>
 ; CHECK:       do:<br>
 ; CHECK-NEXT:    call void @dummy(i1 [[F]])<br>
@@ -150,7 +190,6 @@ define i32 @test4(i32 %i, i1 %f, i32 %n) {<br>
 ; CHECK:       exit2:<br>
 ; CHECK-NEXT:    ret i32 30<br>
 ;<br>
-; FIXME: COND should be replaced with false. This will be fixed by improving LVI.<br>
 entry:<br>
   %c = icmp ne i32 %i, -2134<br>
   br i1 %c, label %do, label %exit<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/lvi-for-ashr.ll b/llvm/test/Transforms/Attributor/lvi-for-ashr.ll<br>
index ccc5aba33a45..729ff66f0735 100644<br>
--- a/llvm/test/Transforms/Attributor/lvi-for-ashr.ll<br>
+++ b/llvm/test/Transforms/Attributor/lvi-for-ashr.ll<br>
@@ -1,10 +1,16 @@<br>
-; NOTE: Assertions have been autogenerated by utils/update_test_checks.py<br>
-; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
+; FIXME: DOT should be replaced with 3<br>
+<br>
 define i32 @test-ashr(i32 %c) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@test-ashr<br>
 ; CHECK-SAME: (i32 [[C:%.*]])<br>
 ; CHECK-NEXT:  chk65:<br>
-; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[C:%.*]], 65<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[C]], 65<br>
 ; CHECK-NEXT:    br i1 [[CMP]], label [[RETURN:%.*]], label [[CHK0:%.*]]<br>
 ; CHECK:       chk0:<br>
 ; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[C]], 0<br>
@@ -21,7 +27,6 @@ define i32 @test-ashr(i32 %c) {<br>
 ; CHECK-NEXT:    [[RETVAL:%.*]] = phi i32 [ 0, [[CHK65:%.*]] ], [ 1, [[CHK0]] ], [ [[DOT]], [[BB_THEN]] ], [ 4, [[BB_IF]] ]<br>
 ; CHECK-NEXT:    ret i32 [[RETVAL]]<br>
 ;<br>
-; FIXME: DOT should be replaced with 3<br>
 chk65:<br>
   %cmp = icmp sgt i32 %c, 65<br>
   br i1 %cmp, label %return, label %chk0<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/memory_locations.ll b/llvm/test/Transforms/Attributor/memory_locations.ll<br>
index de997a729131..c3222367360a 100644<br>
--- a/llvm/test/Transforms/Attributor/memory_locations.ll<br>
+++ b/llvm/test/Transforms/Attributor/memory_locations.ll<br>
@@ -1,15 +1,15 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,MODULE,OLD_MODULE<br>
-; RUN: opt -attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC,OLD_CGSCC<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,MODULE,NEW_MODULE<br>
-; RUN: opt -passes='attributor-cgscc' --attributor-disable=false -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC,NEW_CGSCC<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
 declare noalias i8* @malloc(i64) inaccessiblememonly<br>
<br>
-define dso_local i8* @internal_only(i32 %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
+define dso_local i8* @internal_only(i32 %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -23,8 +23,8 @@ entry:<br>
   ret i8* %call<br>
 }<br>
<br>
-define dso_local i8* @internal_only_rec(i32 %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
+define dso_local i8* @internal_only_rec(i32 %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only_rec<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -63,8 +63,8 @@ return:                                           ; preds = %if.end, %if.then<br>
   ret i8* %retval.0<br>
 }<br>
<br>
-define dso_local i8* @internal_only_rec_static_helper(i32 %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
+define dso_local i8* @internal_only_rec_static_helper(i32 %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only_rec_static_helper<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -76,8 +76,8 @@ entry:<br>
   ret i8* %call<br>
 }<br>
<br>
-define internal i8* @internal_only_rec_static(i32 %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
+define internal i8* @internal_only_rec_static(i32 %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only_rec_static<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -118,7 +118,6 @@ return:                                           ; preds = %if.end, %if.then<br>
<br>
 define dso_local i8* @internal_only_rec_static_helper_malloc_noescape(i32 %arg) {<br>
 ; FIXME: This is actually inaccessiblememonly because the malloced memory does not escape<br>
-; CHECK-NOT: inaccessiblememonly<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only_rec_static_helper_malloc_noescape<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -132,7 +131,6 @@ entry:<br>
<br>
 define internal i8* @internal_only_rec_static_malloc_noescape(i32 %arg) {<br>
 ; FIXME: This is actually inaccessiblememonly because the malloced memory does not escape<br>
-; CHECK-NOT: inaccessiblememonly<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_only_rec_static_malloc_noescape<br>
 ; CHECK-SAME: (i32 [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -173,8 +171,8 @@ return:                                           ; preds = %if.end, %if.then<br>
   ret i8* %retval.0<br>
 }<br>
<br>
-define dso_local i8* @internal_argmem_only_read(i32* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
+define dso_local i8* @internal_argmem_only_read(i32* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_argmem_only_read<br>
 ; CHECK-SAME: (i32* nocapture nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -190,8 +188,8 @@ entry:<br>
   ret i8* %call<br>
 }<br>
<br>
-define dso_local i8* @internal_argmem_only_write(i32* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
+define dso_local i8* @internal_argmem_only_write(i32* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_argmem_only_write<br>
 ; CHECK-SAME: (i32* nocapture nonnull writeonly align 4 dereferenceable(4) [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -205,27 +203,27 @@ entry:<br>
   ret i8* %call<br>
 }<br>
<br>
-define dso_local i8* @internal_argmem_only_rec(i32* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
-; MODULE-LABEL: define {{[^@]+}}@internal_argmem_only_rec<br>
-; MODULE-SAME: (i32* nocapture align 4 [[ARG:%.*]])<br>
-; MODULE-NEXT:  entry:<br>
-; MODULE-NEXT:    [[CALL:%.*]] = call noalias i8* @internal_argmem_only_rec_1(i32* nocapture align 4 [[ARG]])<br>
-; MODULE-NEXT:    ret i8* [[CALL]]<br>
+define dso_local i8* @internal_argmem_only_rec(i32* %arg) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@internal_argmem_only_rec<br>
+; IS__TUNIT____-SAME: (i32* nocapture align 4 [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call noalias i8* @internal_argmem_only_rec_1(i32* nocapture align 4 [[ARG]])<br>
+; IS__TUNIT____-NEXT:    ret i8* [[CALL]]<br>
 ;<br>
-; CGSCC-LABEL: define {{[^@]+}}@internal_argmem_only_rec<br>
-; CGSCC-SAME: (i32* nocapture nonnull align 4 dereferenceable(4) [[ARG:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    [[CALL:%.*]] = call noalias i8* @internal_argmem_only_rec_1(i32* nocapture nonnull align 4 dereferenceable(4) [[ARG]])<br>
-; CGSCC-NEXT:    ret i8* [[CALL]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@internal_argmem_only_rec<br>
+; IS__CGSCC____-SAME: (i32* nocapture nonnull align 4 dereferenceable(4) [[ARG:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call noalias i8* @internal_argmem_only_rec_1(i32* nocapture nonnull align 4 dereferenceable(4) [[ARG]])<br>
+; IS__CGSCC____-NEXT:    ret i8* [[CALL]]<br>
 ;<br>
 entry:<br>
   %call = call i8* @internal_argmem_only_rec_1(i32* %arg)<br>
   ret i8* %call<br>
 }<br>
<br>
-define internal i8* @internal_argmem_only_rec_1(i32* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
+define internal i8* @internal_argmem_only_rec_1(i32* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_argmem_only_rec_1<br>
 ; CHECK-SAME: (i32* nocapture nonnull align 4 dereferenceable(4) [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -280,8 +278,8 @@ return:                                           ; preds = %if.end3, %if.then2,<br>
   ret i8* %retval.0<br>
 }<br>
<br>
-define internal i8* @internal_argmem_only_rec_2(i32* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
+define internal i8* @internal_argmem_only_rec_2(i32* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@internal_argmem_only_rec_2<br>
 ; CHECK-SAME: (i32* nocapture nonnull align 4 dereferenceable(4) [[ARG:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
@@ -302,8 +300,8 @@ declare i8* @argmem_only(i8* %arg) argmemonly<br>
 declare i8* @inaccesible_argmem_only_decl(i8* %arg) inaccessiblemem_or_argmemonly<br>
 declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) nounwind argmemonly willreturn<br>
<br>
-define void @callerA1(i8* %arg) {<br>
 ; CHECK: Function Attrs: argmemonly<br>
+define void @callerA1(i8* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerA1<br>
 ; CHECK-SAME: (i8* [[ARG:%.*]])<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @argmem_only(i8* [[ARG]])<br>
@@ -312,8 +310,8 @@ define void @callerA1(i8* %arg) {<br>
   call i8* @argmem_only(i8* %arg)<br>
   ret void<br>
 }<br>
-define void @callerA2(i8* %arg) {<br>
 ; CHECK: Function Attrs: inaccessiblemem_or_argmemonly<br>
+define void @callerA2(i8* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerA2<br>
 ; CHECK-SAME: (i8* [[ARG:%.*]])<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @inaccesible_argmem_only_decl(i8* [[ARG]])<br>
@@ -322,8 +320,8 @@ define void @callerA2(i8* %arg) {<br>
   call i8* @inaccesible_argmem_only_decl(i8* %arg)<br>
   ret void<br>
 }<br>
-define void @callerB1() {<br>
 ; CHECK: Function Attrs: readnone<br>
+define void @callerB1() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerB1()<br>
 ; CHECK-NEXT:    [[STACK:%.*]] = alloca i8<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @argmem_only(i8* nonnull dereferenceable(1) [[STACK]])<br>
@@ -333,8 +331,8 @@ define void @callerB1() {<br>
   call i8* @argmem_only(i8* %stack)<br>
   ret void<br>
 }<br>
-define void @callerB2() {<br>
 ; CHECK: Function Attrs: inaccessiblememonly<br>
+define void @callerB2() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerB2()<br>
 ; CHECK-NEXT:    [[STACK:%.*]] = alloca i8<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @inaccesible_argmem_only_decl(i8* nonnull dereferenceable(1) [[STACK]])<br>
@@ -344,8 +342,8 @@ define void @callerB2() {<br>
   call i8* @inaccesible_argmem_only_decl(i8* %stack)<br>
   ret void<br>
 }<br>
-define void @callerC1() {<br>
 ; CHECK-NOT: Function Attrs<br>
+define void @callerC1() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerC1()<br>
 ; CHECK-NEXT:    [[UNKNOWN:%.*]] = call i8* @unknown_ptr()<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @argmem_only(i8* [[UNKNOWN]])<br>
@@ -355,8 +353,8 @@ define void @callerC1() {<br>
   call i8* @argmem_only(i8* %unknown)<br>
   ret void<br>
 }<br>
-define void @callerC2() {<br>
 ; CHECK-NOT: Function Attrs<br>
+define void @callerC2() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerC2()<br>
 ; CHECK-NEXT:    [[UNKNOWN:%.*]] = call i8* @unknown_ptr()<br>
 ; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @inaccesible_argmem_only_decl(i8* [[UNKNOWN]])<br>
@@ -366,8 +364,8 @@ define void @callerC2() {<br>
   call i8* @inaccesible_argmem_only_decl(i8* %unknown)<br>
   ret void<br>
 }<br>
-define void @callerD1() {<br>
 ; CHECK-NOT: Function Attrs<br>
+define void @callerD1() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerD1()<br>
 ; CHECK-NEXT:    [[UNKNOWN:%.*]] = call i8* @argmem_only(i8* noalias align 536870912 null)<br>
 ; CHECK-NEXT:    store i8 0, i8* [[UNKNOWN]]<br>
@@ -377,8 +375,8 @@ define void @callerD1() {<br>
   store i8 0, i8* %unknown<br>
   ret void<br>
 }<br>
-define void @callerD2() {<br>
 ; CHECK-NOT: Function Attrs<br>
+define void @callerD2() {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerD2()<br>
 ; CHECK-NEXT:    [[UNKNOWN:%.*]] = call i8* @inaccesible_argmem_only_decl(i8* noalias align 536870912 null)<br>
 ; CHECK-NEXT:    store i8 0, i8* [[UNKNOWN]]<br>
@@ -388,8 +386,8 @@ define void @callerD2() {<br>
   store i8 0, i8* %unknown<br>
   ret void<br>
 }<br>
-define void @callerE(i8* %arg) {<br>
 ; CHECK: Function Attrs: argmemonly nounwind willreturn<br>
+define void @callerE(i8* %arg) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@callerE<br>
 ; CHECK-SAME: (i8* nocapture [[ARG:%.*]])<br>
 ; CHECK-NEXT:    call void @llvm.lifetime.start.p0i8(i64 4, i8* nocapture [[ARG]])<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/misc.ll b/llvm/test/Transforms/Attributor/misc.ll<br>
index b660300bcc20..07149471565b 100644<br>
--- a/llvm/test/Transforms/Attributor/misc.ll<br>
+++ b/llvm/test/Transforms/Attributor/misc.ll<br>
@@ -1,35 +1,39 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -S -attributor -attributor-disable=false < %s | FileCheck %s --check-prefixes=ALL,CHECK<br>
-; RUN: opt -S -aa-pipeline='basic-aa' -passes=attributor -attributor-disable=false -attributor-annotate-decl-cs < %s | FileCheck %s --check-prefixes=ALL,DECL_CS<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ; Mostly check we do not crash on these uses<br>
<br>
 define internal void @internal(void (i8*)* %fp) {<br>
-; CHECK-LABEL: define {{[^@]+}}@internal<br>
-; CHECK-SAME: (void (i8*)* nonnull [[FP:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
-; CHECK-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; CHECK-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
-; CHECK-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
-; CHECK-NEXT:    call void @callback2(void (i8*)* bitcast (void (i32*)* @foo to void (i8*)*))<br>
-; CHECK-NEXT:    call void @callback2(void (i8*)* [[FP]])<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
-; CHECK-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
-; CHECK-NEXT:    ret void<br>
 ;<br>
-; DECL_CS-LABEL: define {{[^@]+}}@internal<br>
-; DECL_CS-SAME: (void (i8*)* nonnull [[FP:%.*]])<br>
-; DECL_CS-NEXT:  entry:<br>
-; DECL_CS-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
-; DECL_CS-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; DECL_CS-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
-; DECL_CS-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
-; DECL_CS-NEXT:    call void @callback2(void (i8*)* nonnull bitcast (void (i32*)* @foo to void (i8*)*))<br>
-; DECL_CS-NEXT:    call void @callback2(void (i8*)* nonnull [[FP]])<br>
-; DECL_CS-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
-; DECL_CS-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
-; DECL_CS-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@internal<br>
+; IS__TUNIT____-SAME: (void (i8*)* nonnull [[FP:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__TUNIT____-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
+; IS__TUNIT____-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
+; IS__TUNIT____-NEXT:    call void @callback2(void (i8*)* nonnull bitcast (void (i32*)* @foo to void (i8*)*))<br>
+; IS__TUNIT____-NEXT:    call void @callback2(void (i8*)* nonnull [[FP]])<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
+; IS__TUNIT____-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@internal<br>
+; IS__CGSCC____-SAME: (void (i8*)* nonnull [[FP:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
+; IS__CGSCC____-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
+; IS__CGSCC____-NEXT:    call void @callback2(void (i8*)* bitcast (void (i32*)* @foo to void (i8*)*))<br>
+; IS__CGSCC____-NEXT:    call void @callback2(void (i8*)* nonnull [[FP]])<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %a = alloca i32, align 4<br>
@@ -45,33 +49,35 @@ entry:<br>
 }<br>
<br>
 define void @external(void (i8*)* %fp) {<br>
-; CHECK-LABEL: define {{[^@]+}}@external<br>
-; CHECK-SAME: (void (i8*)* [[FP:%.*]])<br>
-; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
-; CHECK-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; CHECK-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
-; CHECK-NEXT:    call void @callback2(void (i8*)* bitcast (void (i32*)* @foo to void (i8*)*))<br>
-; CHECK-NEXT:    call void @callback2(void (i8*)* [[FP]])<br>
-; CHECK-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
-; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
-; CHECK-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
-; CHECK-NEXT:    call void @internal(void (i8*)* nonnull [[FP]])<br>
-; CHECK-NEXT:    ret void<br>
 ;<br>
-; DECL_CS-LABEL: define {{[^@]+}}@external<br>
-; DECL_CS-SAME: (void (i8*)* [[FP:%.*]])<br>
-; DECL_CS-NEXT:  entry:<br>
-; DECL_CS-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
-; DECL_CS-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
-; DECL_CS-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
-; DECL_CS-NEXT:    call void @callback2(void (i8*)* nonnull bitcast (void (i32*)* @foo to void (i8*)*))<br>
-; DECL_CS-NEXT:    call void @callback2(void (i8*)* [[FP]])<br>
-; DECL_CS-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
-; DECL_CS-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
-; DECL_CS-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
-; DECL_CS-NEXT:    call void @internal(void (i8*)* nonnull [[FP]])<br>
-; DECL_CS-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@external<br>
+; IS__TUNIT____-SAME: (void (i8*)* [[FP:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__TUNIT____-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
+; IS__TUNIT____-NEXT:    call void @callback2(void (i8*)* nonnull bitcast (void (i32*)* @foo to void (i8*)*))<br>
+; IS__TUNIT____-NEXT:    call void @callback2(void (i8*)* [[FP]])<br>
+; IS__TUNIT____-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
+; IS__TUNIT____-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
+; IS__TUNIT____-NEXT:    call void @internal(void (i8*)* nonnull [[FP]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@external<br>
+; IS__CGSCC____-SAME: (void (i8*)* [[FP:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    call void @foo(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A]])<br>
+; IS__CGSCC____-NEXT:    call void @callback1(void (i32*)* nonnull @foo)<br>
+; IS__CGSCC____-NEXT:    call void @callback2(void (i8*)* bitcast (void (i32*)* @foo to void (i8*)*))<br>
+; IS__CGSCC____-NEXT:    call void @callback2(void (i8*)* [[FP]])<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i8* bitcast (void (i32*)* @foo to i8*))<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = bitcast i32* [[A]] to i8*<br>
+; IS__CGSCC____-NEXT:    call void [[FP]](i8* [[TMP1]])<br>
+; IS__CGSCC____-NEXT:    call void @internal(void (i8*)* nonnull [[FP]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   %a = alloca i32, align 4<br>
@@ -88,11 +94,12 @@ entry:<br>
 }<br>
<br>
 define internal void @foo(i32* %a) {<br>
-; ALL-LABEL: define {{[^@]+}}@foo<br>
-; ALL-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A:%.*]])<br>
-; ALL-NEXT:  entry:<br>
-; ALL-NEXT:    store i32 0, i32* [[A]], align 4<br>
-; ALL-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@foo<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    store i32 0, i32* [[A]], align 4<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
 entry:<br>
   store i32 0, i32* %a<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/noalias.ll b/llvm/test/Transforms/Attributor/noalias.ll<br>
index 678d7f7f8ccf..d91705697638 100644<br>
--- a/llvm/test/Transforms/Attributor/noalias.ll<br>
+++ b/llvm/test/Transforms/Attributor/noalias.ll<br>
@@ -1,4 +1,8 @@<br>
-; RUN: opt -S -passes=attributor -aa-pipeline='basic-aa' -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=7 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; TEST 1 - negative.<br>
<br>
@@ -11,8 +15,12 @@<br>
<br>
 @G = external global i8*<br>
<br>
-; CHECK: define i8* @foo()<br>
 define i8* @foo() {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    store i8* [[TMP1]], i8** @G, align 8<br>
+; CHECK-NEXT:    ret i8* [[TMP1]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
   store i8* %1, i8** @G, align 8<br>
   ret i8* %1<br>
@@ -23,25 +31,39 @@ declare noalias i8* @malloc(i64)<br>
 ; TEST 2<br>
 ; call noalias function in return instruction.<br>
<br>
-; CHECK: define noalias i8* @return_noalias()<br>
 define i8* @return_noalias(){<br>
+; CHECK-LABEL: define {{[^@]+}}@return_noalias()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    ret i8* [[TMP1]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
   ret i8* %1<br>
 }<br>
<br>
 define void @nocapture(i8* %a){<br>
+; CHECK-LABEL: define {{[^@]+}}@nocapture<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[A:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   ret void<br>
 }<br>
<br>
-; CHECK: define noalias i8* @return_noalias_looks_like_capture()<br>
 define i8* @return_noalias_looks_like_capture(){<br>
+; CHECK-LABEL: define {{[^@]+}}@return_noalias_looks_like_capture()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    ret i8* [[TMP1]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
   call void @nocapture(i8* %1)<br>
   ret i8* %1<br>
 }<br>
<br>
-; CHECK: define noalias i16* @return_noalias_casted()<br>
 define i16* @return_noalias_casted(){<br>
+; CHECK-LABEL: define {{[^@]+}}@return_noalias_casted()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    [[C:%.*]] = bitcast i8* [[TMP1]] to i16*<br>
+; CHECK-NEXT:    ret i16* [[C]]<br>
+;<br>
   %1 = tail call noalias i8* @malloc(i64 4)<br>
   %c = bitcast i8* %1 to i16*<br>
   ret i16* %c<br>
@@ -50,9 +72,11 @@ define i16* @return_noalias_casted(){<br>
 declare i8* @alias()<br>
<br>
 ; TEST 3<br>
-; CHECK: define i8* @call_alias()<br>
-; CHECK-NOT: noalias<br>
 define i8* @call_alias(){<br>
+; CHECK-LABEL: define {{[^@]+}}@call_alias()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* @alias()<br>
+; CHECK-NEXT:    ret i8* [[TMP1]]<br>
+;<br>
   %1 = tail call i8* @alias()<br>
   ret i8* %1<br>
 }<br>
@@ -72,14 +96,27 @@ define i8* @call_alias(){<br>
 ;   return malloc(4);<br>
 ; }<br>
<br>
-; CHECK: define i8* @bar()<br>
 define i8* @bar() nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@bar()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call i8* (...) @baz()<br>
+; CHECK-NEXT:    ret i8* [[TMP1]]<br>
+;<br>
   %1 = tail call i8* (...) @baz()<br>
   ret i8* %1<br>
 }<br>
<br>
-; CHECK: define noalias i8* @foo1(i32 %0)<br>
 define i8* @foo1(i32 %0) nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo1<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* (...) @baz()<br>
+; CHECK-NEXT:    br label [[TMP5]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
   %2 = icmp eq i32 %0, 0<br>
   br i1 %2, label %5, label %3<br>
<br>
@@ -97,14 +134,18 @@ declare i8* @baz(...) nounwind uwtable<br>
 ; TEST 5<br>
<br>
 ; Returning global pointer. Should not be noalias.<br>
-; CHECK: define nonnull align 8 dereferenceable(8) i8** @getter()<br>
 define i8** @getter() {<br>
+; CHECK-LABEL: define {{[^@]+}}@getter()<br>
+; CHECK-NEXT:    ret i8** @G<br>
+;<br>
   ret i8** @G<br>
 }<br>
<br>
 ; Returning global pointer. Should not be noalias.<br>
-; CHECK: define nonnull align 8 dereferenceable(8) i8** @calle1()<br>
 define i8** @calle1(){<br>
+; CHECK-LABEL: define {{[^@]+}}@calle1()<br>
+; CHECK-NEXT:    ret i8** @G<br>
+;<br>
   %1 = call i8** @getter()<br>
   ret i8** %1<br>
 }<br>
@@ -112,8 +153,16 @@ define i8** @calle1(){<br>
 ; TEST 6<br>
 declare noalias i8* @strdup(i8* nocapture) nounwind<br>
<br>
-; CHECK: define noalias i8* @test6()<br>
 define i8* @test6() nounwind uwtable ssp {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6()<br>
+; CHECK-NEXT:    [[X:%.*]] = alloca [2 x i8], align 1<br>
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [2 x i8], [2 x i8]* [[X]], i64 0, i64 0<br>
+; CHECK-NEXT:    store i8 97, i8* [[ARRAYIDX]], align 1<br>
+; CHECK-NEXT:    [[ARRAYIDX1:%.*]] = getelementptr inbounds [2 x i8], [2 x i8]* [[X]], i64 0, i64 1<br>
+; CHECK-NEXT:    store i8 0, i8* [[ARRAYIDX1]], align 1<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call noalias i8* @strdup(i8* nonnull dereferenceable(2) [[ARRAYIDX]])<br>
+; CHECK-NEXT:    ret i8* [[CALL]]<br>
+;<br>
   %x = alloca [2 x i8], align 1<br>
   %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %x, i64 0, i64 0<br>
   store i8 97, i8* %arrayidx, align 1<br>
@@ -125,8 +174,19 @@ define i8* @test6() nounwind uwtable ssp {<br>
<br>
 ; TEST 7<br>
<br>
-; CHECK: define noalias i8* @test7()<br>
 define i8* @test7() nounwind {<br>
+; CHECK-LABEL: define {{[^@]+}}@test7()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[A:%.*]] = call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i8* [[A]], null<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[RETURN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    store i8 7, i8* [[A]]<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i8* [ [[A]], [[IF_END]] ], [ null, [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %A = call noalias i8* @malloc(i64 4) nounwind<br>
   %tobool = icmp eq i8* %A, null<br>
@@ -143,8 +203,18 @@ return:<br>
<br>
 ; TEST 8<br>
<br>
-; CHECK: define noalias i8* @test8(i32* %0)<br>
 define i8* @test8(i32* %0) nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@test8<br>
+; CHECK-SAME: (i32* [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i32* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    store i8 10, i8* [[TMP2]]<br>
+; CHECK-NEXT:    br label [[TMP5]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    ret i8* [[TMP2]]<br>
+;<br>
   %2 = tail call noalias i8* @malloc(i64 4)<br>
   %3 = icmp ne i32* %0, null<br>
   br i1 %3, label %4, label %5<br>
@@ -161,32 +231,59 @@ define i8* @test8(i32* %0) nounwind uwtable {<br>
 ; Simple Argument Test<br>
 declare void @use_i8(i8* nocapture)<br>
 define internal void @test9a(i8* %a, i8* %b) {<br>
-; CHECK: define internal void @test9a()<br>
+; CHECK-LABEL: define {{[^@]+}}@test9a()<br>
+; CHECK-NEXT:    call void @use_i8(i8* noalias align 536870912 null)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i8(i8* null)<br>
   ret void<br>
 }<br>
 define internal void @test9b(i8* %a, i8* %b) {<br>
 ; FIXME: %b should be noalias<br>
-; CHECK: define internal void @test9b(i8* noalias nocapture %a, i8* nocapture %b)<br>
+; CHECK-LABEL: define {{[^@]+}}@test9b<br>
+; CHECK-SAME: (i8* noalias nocapture [[A:%.*]], i8* nocapture [[B:%.*]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* noalias nocapture [[A]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* nocapture [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i8(i8* %a)<br>
   call void @use_i8(i8* %b)<br>
   ret void<br>
 }<br>
 define internal void @test9c(i8* %a, i8* %b, i8* %c) {<br>
-; CHECK: define internal void @test9c(i8* noalias nocapture %a, i8* nocapture %b, i8* nocapture %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@test9c<br>
+; CHECK-SAME: (i8* noalias nocapture [[A:%.*]], i8* nocapture [[B:%.*]], i8* nocapture [[C:%.*]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* noalias nocapture [[A]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* nocapture [[B]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* nocapture [[C]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i8(i8* %a)<br>
   call void @use_i8(i8* %b)<br>
   call void @use_i8(i8* %c)<br>
   ret void<br>
 }<br>
 define void @test9_helper(i8* %a, i8* %b) {<br>
-; CHECK: define void @test9_helper(i8* nocapture %a, i8* nocapture %b)<br>
-; CHECK:  tail call void @test9a()<br>
-; CHECK:  tail call void @test9a()<br>
-; CHECK:  tail call void @test9b(i8* noalias nocapture %a, i8* nocapture %b)<br>
-; CHECK:  tail call void @test9b(i8* noalias nocapture %b, i8* noalias nocapture %a)<br>
-; CHECK:  tail call void @test9c(i8* noalias nocapture %a, i8* nocapture %b, i8* nocapture %b)<br>
-; CHECK:  tail call void @test9c(i8* noalias nocapture %b, i8* noalias nocapture %a, i8* noalias nocapture %a)<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test9_helper<br>
+; IS__TUNIT____-SAME: (i8* nocapture [[A:%.*]], i8* nocapture [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:    tail call void @test9a()<br>
+; IS__TUNIT____-NEXT:    tail call void @test9a()<br>
+; IS__TUNIT____-NEXT:    tail call void @test9b(i8* noalias nocapture [[A]], i8* nocapture [[B]])<br>
+; IS__TUNIT____-NEXT:    tail call void @test9b(i8* noalias nocapture [[B]], i8* noalias nocapture [[A]])<br>
+; IS__TUNIT____-NEXT:    tail call void @test9c(i8* noalias nocapture [[A]], i8* nocapture [[B]], i8* nocapture [[B]])<br>
+; IS__TUNIT____-NEXT:    tail call void @test9c(i8* noalias nocapture [[B]], i8* noalias nocapture [[A]], i8* noalias nocapture [[A]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test9_helper<br>
+; IS__CGSCC____-SAME: (i8* nocapture [[A:%.*]], i8* nocapture [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    tail call void @test9a()<br>
+; IS__CGSCC____-NEXT:    tail call void @test9a()<br>
+; IS__CGSCC____-NEXT:    tail call void @test9b(i8* noalias [[A]], i8* [[B]])<br>
+; IS__CGSCC____-NEXT:    tail call void @test9b(i8* noalias [[B]], i8* noalias [[A]])<br>
+; IS__CGSCC____-NEXT:    tail call void @test9c(i8* noalias [[A]], i8* [[B]], i8* [[B]])<br>
+; IS__CGSCC____-NEXT:    tail call void @test9c(i8* noalias nocapture [[B]], i8* noalias [[A]], i8* noalias nocapture [[A]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   tail call void @test9a(i8* noalias %a, i8* %b)<br>
   tail call void @test9a(i8* noalias %b, i8* noalias %a)<br>
   tail call void @test9b(i8* noalias %a, i8* %b)<br>
@@ -202,17 +299,24 @@ define void @test9_helper(i8* %a, i8* %b) {<br>
<br>
 declare void @test10_helper_1(i8* %a)<br>
 define void @test10_helper_2(i8* noalias %a) {<br>
-; CHECK:   tail call void @test10_helper_1(i8* %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@test10_helper_2<br>
+; CHECK-SAME: (i8* noalias [[A:%.*]])<br>
+; CHECK-NEXT:    tail call void @test10_helper_1(i8* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @test10_helper_1(i8* %a)<br>
   ret void<br>
 }<br>
 define void @test10(i8* noalias %a) {<br>
-; CHECK: define void @test10(i8* noalias %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@test10<br>
+; CHECK-SAME: (i8* noalias [[A:%.*]])<br>
+; CHECK-NEXT:    tail call void @test10_helper_1(i8* [[A]])<br>
+; CHECK-NEXT:    tail call void @test10_helper_2(i8* noalias [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 ; FIXME: missing noalias<br>
-; CHECK-NEXT:   tail call void @test10_helper_1(i8* %a)<br>
   tail call void @test10_helper_1(i8* %a)<br>
<br>
-; CHECK-NEXT:   tail call void @test10_helper_2(i8* noalias %a)<br>
   tail call void @test10_helper_2(i8* %a)<br>
   ret void<br>
 }<br>
@@ -222,8 +326,11 @@ define void @test10(i8* noalias %a) {<br>
<br>
 declare void @test11_helper(i8* %a, i8 *%b)<br>
 define void @test11(i8* noalias %a) {<br>
-; CHECK: define void @test11(i8* noalias %a)<br>
-; CHECK-NEXT:   tail call void @test11_helper(i8* %a, i8* %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@test11<br>
+; CHECK-SAME: (i8* noalias [[A:%.*]])<br>
+; CHECK-NEXT:    tail call void @test11_helper(i8* [[A]], i8* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @test11_helper(i8* %a, i8* %a)<br>
   ret void<br>
 }<br>
@@ -234,14 +341,23 @@ define void @test11(i8* noalias %a) {<br>
 declare void @use_nocapture(i8* nocapture)<br>
 declare void @use(i8*)<br>
 define void @test12_1() {<br>
-; CHECK-LABEL: @test12_1(<br>
-; CHECK-NEXT:    [[A:%.*]] = alloca i8, align 4<br>
-; CHECK-NEXT:    [[B:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[B]])<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[B]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test12_1()<br>
+; IS________OPM-NEXT:    [[A:%.*]] = alloca i8, align 4<br>
+; IS________OPM-NEXT:    [[B:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias [[B]])<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias [[B]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test12_1()<br>
+; IS________NPM-NEXT:    [[A:%.*]] = alloca i8, align 4<br>
+; IS________NPM-NEXT:    [[B:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nonnull align 4 dereferenceable(1) [[A]])<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[B]])<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[B]])<br>
+; IS________NPM-NEXT:    ret void<br>
 ;<br>
   %A = alloca i8, align 4<br>
   %B = tail call noalias i8* @malloc(i64 4)<br>
@@ -253,14 +369,24 @@ define void @test12_1() {<br>
 }<br>
<br>
 define void @test12_2(){<br>
-; CHECK-LABEL: @test12_2(<br>
-; CHECK-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
-; CHECK-NEXT:    tail call void @use(i8* [[A]])<br>
-; CHECK-NEXT:    tail call void @use_nocapture(i8* nocapture [[A]])<br>
-; CHECK-NEXT:    ret void<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test12_2()<br>
+; IS________OPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
+; IS________OPM-NEXT:    tail call void @use(i8* [[A]])<br>
+; IS________OPM-NEXT:    tail call void @use_nocapture(i8* [[A]])<br>
+; IS________OPM-NEXT:    ret void<br>
 ;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test12_2()<br>
+; IS________NPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* noalias nocapture [[A]])<br>
+; IS________NPM-NEXT:    tail call void @use(i8* [[A]])<br>
+; IS________NPM-NEXT:    tail call void @use_nocapture(i8* nocapture [[A]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
+; FIXME: This should be @use_nocapture(i8* noalias [[A]])<br>
+; FIXME: This should be @use_nocapture(i8* noalias nocapture [[A]])<br>
   %A = tail call noalias i8* @malloc(i64 4)<br>
   tail call void @use_nocapture(i8* %A)<br>
   tail call void @use_nocapture(i8* %A)<br>
@@ -271,58 +397,119 @@ define void @test12_2(){<br>
<br>
 declare void @two_args(i8* nocapture , i8* nocapture)<br>
 define void @test12_3(){<br>
-; CHECK-LABEL: @test12_3(<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test12_3()<br>
+; IS________OPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    tail call void @two_args(i8* [[A]], i8* [[A]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test12_3()<br>
+; IS________NPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    tail call void @two_args(i8* nocapture [[A]], i8* nocapture [[A]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %A = tail call noalias i8* @malloc(i64 4)<br>
-; CHECK: tail call void @two_args(i8* nocapture %A, i8* nocapture %A)<br>
   tail call void @two_args(i8* %A, i8* %A)<br>
   ret void<br>
 }<br>
<br>
 define void @test12_4(){<br>
-; CHECK-LABEL: @test12_4(<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test12_4()<br>
+; IS________OPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[B:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[A_0:%.*]] = getelementptr i8, i8* [[A]], i64 0<br>
+; IS________OPM-NEXT:    [[A_1:%.*]] = getelementptr i8, i8* [[A]], i64 1<br>
+; IS________OPM-NEXT:    [[B_0:%.*]] = getelementptr i8, i8* [[B]], i64 0<br>
+; IS________OPM-NEXT:    tail call void @two_args(i8* [[A]], i8* [[B]])<br>
+; IS________OPM-NEXT:    tail call void @two_args(i8* [[A]], i8* [[A_0]])<br>
+; IS________OPM-NEXT:    tail call void @two_args(i8* [[A]], i8* [[A_1]])<br>
+; IS________OPM-NEXT:    tail call void @two_args(i8* [[A_0]], i8* [[B_0]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test12_4()<br>
+; IS________NPM-NEXT:    [[A:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    [[B:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    [[A_0:%.*]] = getelementptr i8, i8* [[A]], i64 0<br>
+; IS________NPM-NEXT:    [[A_1:%.*]] = getelementptr i8, i8* [[A]], i64 1<br>
+; IS________NPM-NEXT:    [[B_0:%.*]] = getelementptr i8, i8* [[B]], i64 0<br>
+; IS________NPM-NEXT:    tail call void @two_args(i8* noalias nocapture [[A]], i8* noalias nocapture [[B]])<br>
+; IS________NPM-NEXT:    tail call void @two_args(i8* nocapture [[A]], i8* nocapture [[A_0]])<br>
+; IS________NPM-NEXT:    tail call void @two_args(i8* nocapture [[A]], i8* nocapture [[A_1]])<br>
+; IS________NPM-NEXT:    tail call void @two_args(i8* nocapture [[A_0]], i8* nocapture [[B_0]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %A = tail call noalias i8* @malloc(i64 4)<br>
   %B = tail call noalias i8* @malloc(i64 4)<br>
   %A_0 = getelementptr i8, i8* %A, i64 0<br>
   %A_1 = getelementptr i8, i8* %A, i64 1<br>
   %B_0 = getelementptr i8, i8* %B, i64 0<br>
<br>
-; CHECK: tail call void @two_args(i8* noalias nocapture %A, i8* noalias nocapture %B)<br>
   tail call void @two_args(i8* %A, i8* %B)<br>
<br>
-; CHECK: tail call void @two_args(i8* nocapture %A, i8* nocapture %A_0)<br>
   tail call void @two_args(i8* %A, i8* %A_0)<br>
<br>
-; CHECK: tail call void @two_args(i8* nocapture %A, i8* nocapture %A_1)<br>
   tail call void @two_args(i8* %A, i8* %A_1)<br>
<br>
 ; FIXME: This should be @two_args(i8* noalias nocapture %A_0, i8* noalias nocapture %B_0)<br>
-; CHECK: tail call void @two_args(i8* nocapture %A_0, i8* nocapture %B_0)<br>
   tail call void @two_args(i8* %A_0, i8* %B_0)<br>
   ret void<br>
 }<br>
<br>
 ; TEST 13<br>
 define void @use_i8_internal(i8* %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@use_i8_internal<br>
+; CHECK-SAME: (i8* nocapture [[A:%.*]])<br>
+; CHECK-NEXT:    call void @use_i8(i8* nocapture [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i8(i8* %a)<br>
   ret void<br>
 }<br>
<br>
 define void @test13_use_noalias(){<br>
+; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@test13_use_noalias()<br>
+; NOT_CGSCC_OPM-NEXT:    [[M1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; NOT_CGSCC_OPM-NEXT:    [[C1:%.*]] = bitcast i8* [[M1]] to i16*<br>
+; NOT_CGSCC_OPM-NEXT:    [[C2:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; NOT_CGSCC_OPM-NEXT:    call void @use_i8_internal(i8* noalias nocapture [[C2]])<br>
+; NOT_CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test13_use_noalias()<br>
+; IS__CGSCC_OPM-NEXT:    [[M1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS__CGSCC_OPM-NEXT:    [[C1:%.*]] = bitcast i8* [[M1]] to i16*<br>
+; IS__CGSCC_OPM-NEXT:    [[C2:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; IS__CGSCC_OPM-NEXT:    call void @use_i8_internal(i8* noalias [[C2]])<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
   %m1 = tail call noalias i8* @malloc(i64 4)<br>
   %c1 = bitcast i8* %m1 to i16*<br>
   %c2 = bitcast i16* %c1 to i8*<br>
-; CHECK: call void @use_i8_internal(i8* noalias nocapture %c2)<br>
   call void @use_i8_internal(i8* %c2)<br>
   ret void<br>
 }<br>
<br>
 define void @test13_use_alias(){<br>
+; IS________OPM-LABEL: define {{[^@]+}}@test13_use_alias()<br>
+; IS________OPM-NEXT:    [[M1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________OPM-NEXT:    [[C1:%.*]] = bitcast i8* [[M1]] to i16*<br>
+; IS________OPM-NEXT:    [[C2A:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; IS________OPM-NEXT:    [[C2B:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; IS________OPM-NEXT:    call void @use_i8_internal(i8* [[C2A]])<br>
+; IS________OPM-NEXT:    call void @use_i8_internal(i8* [[C2B]])<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@test13_use_alias()<br>
+; IS________NPM-NEXT:    [[M1:%.*]] = tail call noalias i8* @malloc(i64 4)<br>
+; IS________NPM-NEXT:    [[C1:%.*]] = bitcast i8* [[M1]] to i16*<br>
+; IS________NPM-NEXT:    [[C2A:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; IS________NPM-NEXT:    [[C2B:%.*]] = bitcast i16* [[C1]] to i8*<br>
+; IS________NPM-NEXT:    call void @use_i8_internal(i8* nocapture [[C2A]])<br>
+; IS________NPM-NEXT:    call void @use_i8_internal(i8* nocapture [[C2B]])<br>
+; IS________NPM-NEXT:    ret void<br>
+;<br>
   %m1 = tail call noalias i8* @malloc(i64 4)<br>
   %c1 = bitcast i8* %m1 to i16*<br>
   %c2a = bitcast i16* %c1 to i8*<br>
   %c2b = bitcast i16* %c1 to i8*<br>
-; CHECK: call void @use_i8_internal(i8* nocapture %c2a)<br>
-; CHECK: call void @use_i8_internal(i8* nocapture %c2b)<br>
   call void @use_i8_internal(i8* %c2a)<br>
   call void @use_i8_internal(i8* %c2b)<br>
   ret void<br>
@@ -330,11 +517,37 @@ define void @test13_use_alias(){<br>
<br>
 ; TEST 14 i2p casts<br>
 define internal i32 @p2i(i32* %arg) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@p2i<br>
+; IS__TUNIT____-SAME: (i32* noalias nofree readnone [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[P2I:%.*]] = ptrtoint i32* [[ARG]] to i32<br>
+; IS__TUNIT____-NEXT:    ret i32 [[P2I]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@p2i<br>
+; IS__CGSCC____-SAME: (i32* nofree readnone [[ARG:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[P2I:%.*]] = ptrtoint i32* [[ARG]] to i32<br>
+; IS__CGSCC____-NEXT:    ret i32 [[P2I]]<br>
+;<br>
   %p2i = ptrtoint i32* %arg to i32<br>
   ret i32 %p2i<br>
 }<br>
<br>
 define i32 @i2p(i32* %arg) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@i2p<br>
+; IS__TUNIT____-SAME: (i32* nofree readonly [[ARG:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[C:%.*]] = call i32 @p2i(i32* noalias nofree readnone [[ARG]])<br>
+; IS__TUNIT____-NEXT:    [[I2P:%.*]] = inttoptr i32 [[C]] to i8*<br>
+; IS__TUNIT____-NEXT:    [[BC:%.*]] = bitcast i8* [[I2P]] to i32*<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @ret(i32* nofree readonly align 4 [[BC]])<br>
+; IS__TUNIT____-NEXT:    ret i32 [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@i2p<br>
+; IS__CGSCC____-SAME: (i32* nofree readonly [[ARG:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = call i32 @p2i(i32* noalias nofree readnone [[ARG]])<br>
+; IS__CGSCC____-NEXT:    [[I2P:%.*]] = inttoptr i32 [[C]] to i8*<br>
+; IS__CGSCC____-NEXT:    [[BC:%.*]] = bitcast i8* [[I2P]] to i32*<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @ret(i32* nofree nonnull readonly align 4 dereferenceable(4) [[BC]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[CALL]]<br>
+;<br>
   %c = call i32 @p2i(i32* %arg)<br>
   %i2p = inttoptr i32 %c to i8*<br>
   %bc = bitcast i8* %i2p to i32*<br>
@@ -342,6 +555,11 @@ define i32 @i2p(i32* %arg) {<br>
   ret i32 %call<br>
 }<br>
 define internal i32 @ret(i32* %arg) {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[L:%.*]] = load i32, i32* [[ARG]], align 4<br>
+; CHECK-NEXT:    ret i32 [[L]]<br>
+;<br>
   %l = load i32, i32* %arg<br>
   ret i32 %l<br>
 }<br>
@@ -355,8 +573,31 @@ define internal i32 @ret(i32* %arg) {<br>
 %struct.__locale_map = type opaque<br>
<br>
 ; Function Attrs: nounwind optsize<br>
-; CHECK: define internal fastcc double @strtox(i8* noalias %s) unnamed_addr<br>
 define internal fastcc double @strtox(i8* %s, i8** %p, i32 %prec) unnamed_addr {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@strtox<br>
+; IS__TUNIT____-SAME: (i8* noalias [[S:%.*]]) unnamed_addr<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[F:%.*]] = alloca [[STRUCT__IO_FILE:%.*]], align 8<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = bitcast %struct._IO_FILE* [[F]] to i8*<br>
+; IS__TUNIT____-NEXT:    call void @llvm.lifetime.start.p0i8(i64 144, i8* nonnull align 8 dereferenceable(240) [[TMP0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 bitcast (i32 (...)* @sh_fromstring to i32 (%struct._IO_FILE*, i8*)*)(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i8* [[S]])<br>
+; IS__TUNIT____-NEXT:    call void @__shlim(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i64 0)<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call double @__floatscan(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i32 1, i32 1)<br>
+; IS__TUNIT____-NEXT:    call void @llvm.lifetime.end.p0i8(i64 144, i8* nonnull align 8 dereferenceable(240) [[TMP0]])<br>
+; IS__TUNIT____-NEXT:    ret double [[CALL1]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@strtox<br>
+; IS__CGSCC____-SAME: (i8* [[S:%.*]]) unnamed_addr<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[F:%.*]] = alloca [[STRUCT__IO_FILE:%.*]], align 8<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = bitcast %struct._IO_FILE* [[F]] to i8*<br>
+; IS__CGSCC____-NEXT:    call void @llvm.lifetime.start.p0i8(i64 144, i8* nonnull align 8 dereferenceable(240) [[TMP0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 bitcast (i32 (...)* @sh_fromstring to i32 (%struct._IO_FILE*, i8*)*)(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i8* [[S]])<br>
+; IS__CGSCC____-NEXT:    call void @__shlim(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i64 0)<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call double @__floatscan(%struct._IO_FILE* nonnull align 8 dereferenceable(240) [[F]], i32 1, i32 1)<br>
+; IS__CGSCC____-NEXT:    call void @llvm.lifetime.end.p0i8(i64 144, i8* nonnull align 8 dereferenceable(240) [[TMP0]])<br>
+; IS__CGSCC____-NEXT:    ret double [[CALL1]]<br>
+;<br>
 entry:<br>
   %f = alloca %struct._IO_FILE, align 8<br>
   %0 = bitcast %struct._IO_FILE* %f to i8*<br>
@@ -371,8 +612,13 @@ entry:<br>
<br>
 ; Function Attrs: nounwind optsize<br>
 define dso_local double @strtod(i8* noalias %s, i8** noalias %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@strtod<br>
+; CHECK-SAME: (i8* noalias [[S:%.*]], i8** noalias nocapture nofree readnone [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = tail call fastcc double @strtox(i8* noalias [[S]])<br>
+; CHECK-NEXT:    ret double [[CALL]]<br>
+;<br>
 entry:<br>
-; CHECK: %call = tail call fastcc double @strtox(i8* noalias %s)<br>
   %call = tail call fastcc double @strtox(i8* %s, i8** %p, i32 1)<br>
   ret double %call<br>
 }<br>
@@ -393,27 +639,56 @@ declare dso_local double @__floatscan(%struct._IO_FILE*, i32, i32) local_unnamed<br>
 declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)<br>
<br>
 ; Test 15<br>
-; propagate noalias to some callsite arguments that there is no possibly reachable capture before it <br>
+; propagate noalias to some callsite arguments that there is no possibly reachable capture before it<br>
<br>
 @alias_of_p = external global i32*<br>
<br>
 define void @make_alias(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@make_alias<br>
+; CHECK-SAME: (i32* nofree writeonly [[P:%.*]])<br>
+; CHECK-NEXT:    store i32* [[P]], i32** @alias_of_p, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32* %p, i32** @alias_of_p<br>
   ret void<br>
 }<br>
<br>
 define void @only_store(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@only_store<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; CHECK-NEXT:    store i32 0, i32* [[P]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32 0, i32* %p<br>
   ret void<br>
 }<br>
<br>
-; CHECK-LABEL: define void @test15_caller(i32* noalias nofree writeonly %p, i32 %c)<br>
 define void @test15_caller(i32* noalias %p, i32 %c) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test15_caller<br>
+; IS__TUNIT____-SAME: (i32* noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[C]], 0<br>
+; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    tail call void @only_store(i32* noalias nocapture nofree writeonly align 4 [[P]])<br>
+; IS__TUNIT____-NEXT:    br label [[IF_END]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    tail call void @make_alias(i32* nofree writeonly [[P]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test15_caller<br>
+; IS__CGSCC____-SAME: (i32* noalias nofree writeonly [[P:%.*]], i32 [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[C]], 0<br>
+; IS__CGSCC____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    tail call void @only_store(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    br label [[IF_END]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    tail call void @make_alias(i32* nofree writeonly [[P]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   %tobool = icmp eq i32 %c, 0<br>
   br i1 %tobool, label %if.end, label %if.then<br>
<br>
-; CHECK: tail call void @only_store(i32* noalias nocapture nofree writeonly align 4 %p)<br>
-; CHECK: tail call void @make_alias(i32* nofree writeonly %p)<br>
<br>
 if.then:<br>
   tail call void @only_store(i32* %p)<br>
@@ -438,26 +713,58 @@ if.end:<br>
 ; void test16_caller(int * restrict p, int c) {<br>
 ;   test16_sub(p, c, c);<br>
 ; }<br>
+;<br>
+; FIXME: this should be tail @only_store(i32* noalias %p)<br>
+;        when test16_caller is called, c1 always equals to c2. (Note that linkage is internal)<br>
+;        Therefore, only one of the two conditions of if statementes will be fulfilled.<br>
<br>
-; CHECK-LABEL: define internal void @test16_sub(i32* noalias nofree writeonly %p, i32 %c1, i32 %c2)<br>
 define internal void @test16_sub(i32* noalias %p, i32 %c1, i32 %c2) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test16_sub<br>
+; IS__TUNIT____-SAME: (i32* noalias nofree writeonly [[P:%.*]], i32 [[C1:%.*]], i32 [[C2:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[C1]], 0<br>
+; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    tail call void @only_store(i32* noalias nocapture nofree writeonly align 4 [[P]])<br>
+; IS__TUNIT____-NEXT:    tail call void @make_alias(i32* nofree writeonly align 4 [[P]])<br>
+; IS__TUNIT____-NEXT:    br label [[IF_END]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[C2]], 0<br>
+; IS__TUNIT____-NEXT:    br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_END3:%.*]]<br>
+; IS__TUNIT____:       if.then2:<br>
+; IS__TUNIT____-NEXT:    tail call void @only_store(i32* nofree writeonly align 4 [[P]])<br>
+; IS__TUNIT____-NEXT:    br label [[IF_END3]]<br>
+; IS__TUNIT____:       if.end3:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test16_sub<br>
+; IS__CGSCC____-SAME: (i32* noalias nofree writeonly [[P:%.*]], i32 [[C1:%.*]], i32 [[C2:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[C1]], 0<br>
+; IS__CGSCC____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    tail call void @only_store(i32* noalias nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    tail call void @make_alias(i32* nofree nonnull writeonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    br label [[IF_END]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    [[TOBOOL1:%.*]] = icmp eq i32 [[C2]], 0<br>
+; IS__CGSCC____-NEXT:    br i1 [[TOBOOL1]], label [[IF_THEN2:%.*]], label [[IF_END3:%.*]]<br>
+; IS__CGSCC____:       if.then2:<br>
+; IS__CGSCC____-NEXT:    tail call void @only_store(i32* nofree nonnull writeonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    br label [[IF_END3]]<br>
+; IS__CGSCC____:       if.end3:<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   %tobool = icmp eq i32 %c1, 0<br>
   br i1 %tobool, label %if.end, label %if.then<br>
<br>
-; CHECK: tail call void @only_store(i32* noalias nocapture nofree writeonly align 4 %p)<br>
 if.then:<br>
-  tail call void @only_store(i32* %p) <br>
-  tail call void @make_alias(i32* %p) <br>
+  tail call void @only_store(i32* %p)<br>
+  tail call void @make_alias(i32* %p)<br>
   br label %if.end<br>
 if.end:<br>
<br>
   %tobool1 = icmp eq i32 %c2, 0<br>
   br i1 %tobool1, label %if.then2, label %if.end3<br>
<br>
-; FIXME: this should be tail @only_store(i32* noalias %p)<br>
-;        when test16_caller is called, c1 always equals to c2. (Note that linkage is internal)<br>
-;        Therefore, only one of the two conditions of if statementes will be fulfilled.<br>
-; CHECK: tail call void @only_store(i32* nofree writeonly align 4 %p)<br>
 if.then2:<br>
   tail call void @only_store(i32* %p)<br>
   br label %if.end3<br>
@@ -467,6 +774,11 @@ if.end3:<br>
 }<br>
<br>
 define void @test16_caller(i32* %p, i32 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test16_caller<br>
+; CHECK-SAME: (i32* nofree writeonly [[P:%.*]], i32 [[C:%.*]])<br>
+; CHECK-NEXT:    tail call void @test16_sub(i32* noalias nofree writeonly [[P]], i32 [[C]], i32 [[C]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @test16_sub(i32* %p, i32 %c, i32 %c)<br>
   ret void<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nocapture-1.ll b/llvm/test/Transforms/Attributor/nocapture-1.ll<br>
index 98c4228c3099..9a16f5e8ad3d 100644<br>
--- a/llvm/test/Transforms/Attributor/nocapture-1.ll<br>
+++ b/llvm/test/Transforms/Attributor/nocapture-1.ll<br>
@@ -1,166 +1,297 @@<br>
-; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -S -attributor-annotate-decl-cs < %s | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; RUN: opt -passes=attributor -attributor-manifest-internal -attributor-disable=false -S -attributor-annotate-decl-cs < %s | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; Copied from Transforms/FunctoinAttrs/nocapture.ll<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 @g = global i32* null          ; <i32**> [#uses=1]<br>
<br>
-; ATTRIBUTOR: define i32* @c1(i32* nofree readnone returned "no-capture-maybe-returned" %q)<br>
 define i32* @c1(i32* %q) {<br>
-       ret i32* %q<br>
+; CHECK-LABEL: define {{[^@]+}}@c1<br>
+; CHECK-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[Q:%.*]])<br>
+; CHECK-NEXT:    ret i32* [[Q]]<br>
+;<br>
+  ret i32* %q<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @c2(i32* nofree writeonly %q)<br>
 ; It would also be acceptable to mark %q as readnone. Update @c3 too.<br>
 define void @c2(i32* %q) {<br>
-       store i32* %q, i32** @g<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@c2<br>
+; CHECK-SAME: (i32* nofree writeonly [[Q:%.*]])<br>
+; CHECK-NEXT:    store i32* [[Q]], i32** @g, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  store i32* %q, i32** @g<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @c3(i32* nofree writeonly %q)<br>
 define void @c3(i32* %q) {<br>
-       call void @c2(i32* %q)<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@c3<br>
+; CHECK-SAME: (i32* nofree writeonly [[Q:%.*]])<br>
+; CHECK-NEXT:    call void @c2(i32* nofree writeonly [[Q]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  call void @c2(i32* %q)<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @c4(i32* nofree readnone %q, i32 %bitno)<br>
 define i1 @c4(i32* %q, i32 %bitno) {<br>
-       %tmp = ptrtoint i32* %q to i32<br>
-       %tmp2 = lshr i32 %tmp, %bitno<br>
-       %bit = trunc i32 %tmp2 to i1<br>
-       br i1 %bit, label %l1, label %l0<br>
+; CHECK-LABEL: define {{[^@]+}}@c4<br>
+; CHECK-SAME: (i32* nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = ptrtoint i32* [[Q]] to i32<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP]], [[BITNO]]<br>
+; CHECK-NEXT:    [[BIT:%.*]] = trunc i32 [[TMP2]] to i1<br>
+; CHECK-NEXT:    br i1 [[BIT]], label [[L1:%.*]], label [[L0:%.*]]<br>
+; CHECK:       l0:<br>
+; CHECK-NEXT:    ret i1 false<br>
+; CHECK:       l1:<br>
+; CHECK-NEXT:    ret i1 true<br>
+;<br>
+  %tmp = ptrtoint i32* %q to i32<br>
+  %tmp2 = lshr i32 %tmp, %bitno<br>
+  %bit = trunc i32 %tmp2 to i1<br>
+  br i1 %bit, label %l1, label %l0<br>
 l0:<br>
-       ret i1 0 ; escaping value not caught by def-use chaining.<br>
+  ret i1 0 ; escaping value not caught by def-use chaining.<br>
 l1:<br>
-       ret i1 1 ; escaping value not caught by def-use chaining.<br>
+  ret i1 1 ; escaping value not caught by def-use chaining.<br>
 }<br>
<br>
 ; c4b is c4 but without the escaping part<br>
-; ATTRIBUTOR: define i1 @c4b(i32* nocapture nofree readnone %q, i32 %bitno)<br>
 define i1 @c4b(i32* %q, i32 %bitno) {<br>
-       %tmp = ptrtoint i32* %q to i32<br>
-       %tmp2 = lshr i32 %tmp, %bitno<br>
-       %bit = trunc i32 %tmp2 to i1<br>
-       br i1 %bit, label %l1, label %l0<br>
+; CHECK-LABEL: define {{[^@]+}}@c4b<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = ptrtoint i32* [[Q]] to i32<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP]], [[BITNO]]<br>
+; CHECK-NEXT:    [[BIT:%.*]] = trunc i32 [[TMP2]] to i1<br>
+; CHECK-NEXT:    br i1 [[BIT]], label [[L1:%.*]], label [[L0:%.*]]<br>
+; CHECK:       l0:<br>
+; CHECK-NEXT:    ret i1 false<br>
+; CHECK:       l1:<br>
+; CHECK-NEXT:    ret i1 false<br>
+;<br>
+  %tmp = ptrtoint i32* %q to i32<br>
+  %tmp2 = lshr i32 %tmp, %bitno<br>
+  %bit = trunc i32 %tmp2 to i1<br>
+  br i1 %bit, label %l1, label %l0<br>
 l0:<br>
-       ret i1 0 ; not escaping!<br>
+  ret i1 0 ; not escaping!<br>
 l1:<br>
-       ret i1 0 ; not escaping!<br>
+  ret i1 0 ; not escaping!<br>
 }<br>
<br>
 @lookup_table = global [2 x i1] [ i1 0, i1 1 ]<br>
<br>
-; ATTRIBUTOR: define i1 @c5(i32* nofree readonly %q, i32 %bitno)<br>
 define i1 @c5(i32* %q, i32 %bitno) {<br>
-       %tmp = ptrtoint i32* %q to i32<br>
-       %tmp2 = lshr i32 %tmp, %bitno<br>
-       %bit = and i32 %tmp2, 1<br>
-        ; subtle escape mechanism follows<br>
-       %lookup = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 %bit<br>
-       %val = load i1, i1* %lookup<br>
-       ret i1 %val<br>
+; CHECK-LABEL: define {{[^@]+}}@c5<br>
+; CHECK-SAME: (i32* nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = ptrtoint i32* [[Q]] to i32<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP]], [[BITNO]]<br>
+; CHECK-NEXT:    [[BIT:%.*]] = and i32 [[TMP2]], 1<br>
+; CHECK-NEXT:    [[LOOKUP:%.*]] = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 [[BIT]]<br>
+; CHECK-NEXT:    [[VAL:%.*]] = load i1, i1* [[LOOKUP]]<br>
+; CHECK-NEXT:    ret i1 [[VAL]]<br>
+;<br>
+  %tmp = ptrtoint i32* %q to i32<br>
+  %tmp2 = lshr i32 %tmp, %bitno<br>
+  %bit = and i32 %tmp2, 1<br>
+  ; subtle escape mechanism follows<br>
+  %lookup = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 %bit<br>
+  %val = load i1, i1* %lookup<br>
+  ret i1 %val<br>
 }<br>
<br>
 declare void @throw_if_bit_set(i8*, i8) readonly<br>
<br>
-; ATTRIBUTOR: define i1 @c6(i8* readonly %q, i8 %bit)<br>
 define i1 @c6(i8* %q, i8 %bit) personality i32 (...)* @__gxx_personality_v0 {<br>
-       invoke void @throw_if_bit_set(i8* %q, i8 %bit)<br>
-               to label %ret0 unwind label %ret1<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@c6<br>
+; IS__TUNIT____-SAME: (i8* readonly [[Q:%.*]], i8 [[BIT:%.*]]) #5 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__TUNIT____-NEXT:    invoke void @throw_if_bit_set(i8* readonly [[Q]], i8 [[BIT]])<br>
+; IS__TUNIT____-NEXT:    to label [[RET0:%.*]] unwind label [[RET1:%.*]]<br>
+; IS__TUNIT____:       ret0:<br>
+; IS__TUNIT____-NEXT:    ret i1 false<br>
+; IS__TUNIT____:       ret1:<br>
+; IS__TUNIT____-NEXT:    [[EXN:%.*]] = landingpad { i8*, i32 }<br>
+; IS__TUNIT____-NEXT:    cleanup<br>
+; IS__TUNIT____-NEXT:    ret i1 true<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@c6<br>
+; IS__CGSCC____-SAME: (i8* readonly [[Q:%.*]], i8 [[BIT:%.*]]) #4 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__CGSCC____-NEXT:    invoke void @throw_if_bit_set(i8* readonly [[Q]], i8 [[BIT]])<br>
+; IS__CGSCC____-NEXT:    to label [[RET0:%.*]] unwind label [[RET1:%.*]]<br>
+; IS__CGSCC____:       ret0:<br>
+; IS__CGSCC____-NEXT:    ret i1 false<br>
+; IS__CGSCC____:       ret1:<br>
+; IS__CGSCC____-NEXT:    [[EXN:%.*]] = landingpad { i8*, i32 }<br>
+; IS__CGSCC____-NEXT:    cleanup<br>
+; IS__CGSCC____-NEXT:    ret i1 true<br>
+;<br>
+  invoke void @throw_if_bit_set(i8* %q, i8 %bit)<br>
+  to label %ret0 unwind label %ret1<br>
 ret0:<br>
-       ret i1 0<br>
+  ret i1 0<br>
 ret1:<br>
-        %exn = landingpad {i8*, i32}<br>
-                 cleanup<br>
-       ret i1 1<br>
+  %exn = landingpad {i8*, i32}<br>
+  cleanup<br>
+  ret i1 1<br>
 }<br>
<br>
 declare i32 @__gxx_personality_v0(...)<br>
<br>
 define i1* @lookup_bit(i32* %q, i32 %bitno) readnone nounwind {<br>
-       %tmp = ptrtoint i32* %q to i32<br>
-       %tmp2 = lshr i32 %tmp, %bitno<br>
-       %bit = and i32 %tmp2, 1<br>
-       %lookup = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 %bit<br>
-       ret i1* %lookup<br>
+; CHECK-LABEL: define {{[^@]+}}@lookup_bit<br>
+; CHECK-SAME: (i32* nofree readnone [[Q:%.*]], i32 [[BITNO:%.*]])<br>
+; CHECK-NEXT:    [[TMP:%.*]] = ptrtoint i32* [[Q]] to i32<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = lshr i32 [[TMP]], [[BITNO]]<br>
+; CHECK-NEXT:    [[BIT:%.*]] = and i32 [[TMP2]], 1<br>
+; CHECK-NEXT:    [[LOOKUP:%.*]] = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 [[BIT]]<br>
+; CHECK-NEXT:    ret i1* [[LOOKUP]]<br>
+;<br>
+  %tmp = ptrtoint i32* %q to i32<br>
+  %tmp2 = lshr i32 %tmp, %bitno<br>
+  %bit = and i32 %tmp2, 1<br>
+  %lookup = getelementptr [2 x i1], [2 x i1]* @lookup_table, i32 0, i32 %bit<br>
+  ret i1* %lookup<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @c7(i32* nofree readonly %q, i32 %bitno)<br>
 define i1 @c7(i32* %q, i32 %bitno) {<br>
-       %ptr = call i1* @lookup_bit(i32* %q, i32 %bitno)<br>
-       %val = load i1, i1* %ptr<br>
-       ret i1 %val<br>
+; CHECK-LABEL: define {{[^@]+}}@c7<br>
+; CHECK-SAME: (i32* nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]])<br>
+; CHECK-NEXT:    [[PTR:%.*]] = call i1* @lookup_bit(i32* noalias nofree readnone [[Q]], i32 [[BITNO]])<br>
+; CHECK-NEXT:    [[VAL:%.*]] = load i1, i1* [[PTR]]<br>
+; CHECK-NEXT:    ret i1 [[VAL]]<br>
+;<br>
+  %ptr = call i1* @lookup_bit(i32* %q, i32 %bitno)<br>
+  %val = load i1, i1* %ptr<br>
+  ret i1 %val<br>
 }<br>
<br>
<br>
-; ATTRIBUTOR: define i32 @nc1(i32* nofree %q, i32* nocapture nofree %p, i1 %b)<br>
 define i32 @nc1(i32* %q, i32* %p, i1 %b) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nc1<br>
+; CHECK-SAME: (i32* nofree [[Q:%.*]], i32* nocapture nofree [[P:%.*]], i1 [[B:%.*]])<br>
+; CHECK-NEXT:  e:<br>
+; CHECK-NEXT:    br label [[L:%.*]]<br>
+; CHECK:       l:<br>
+; CHECK-NEXT:    [[X:%.*]] = phi i32* [ [[P]], [[E:%.*]] ]<br>
+; CHECK-NEXT:    [[Y:%.*]] = phi i32* [ [[Q]], [[E]] ]<br>
+; CHECK-NEXT:    [[TMP:%.*]] = bitcast i32* [[X]] to i32*<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[B]], i32* [[TMP]], i32* [[Y]]<br>
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    store i32 0, i32* [[TMP]], align 4<br>
+; CHECK-NEXT:    store i32* [[Y]], i32** @g, align 8<br>
+; CHECK-NEXT:    ret i32 [[VAL]]<br>
+;<br>
 e:<br>
-       br label %l<br>
+  br label %l<br>
 l:<br>
-       %x = phi i32* [ %p, %e ]<br>
-       %y = phi i32* [ %q, %e ]<br>
-       %tmp = bitcast i32* %x to i32*          ; <i32*> [#uses=2]<br>
-       %tmp2 = select i1 %b, i32* %tmp, i32* %y<br>
-       %val = load i32, i32* %tmp2             ; <i32> [#uses=1]<br>
-       store i32 0, i32* %tmp<br>
-       store i32* %y, i32** @g<br>
-       ret i32 %val<br>
+  %x = phi i32* [ %p, %e ]<br>
+  %y = phi i32* [ %q, %e ]<br>
+  %tmp = bitcast i32* %x to i32*               ; <i32*> [#uses=2]<br>
+  %tmp2 = select i1 %b, i32* %tmp, i32* %y<br>
+  %val = load i32, i32* %tmp2          ; <i32> [#uses=1]<br>
+  store i32 0, i32* %tmp<br>
+  store i32* %y, i32** @g<br>
+  ret i32 %val<br>
 }<br>
<br>
-; ATTRIBUTOR: define i32 @nc1_addrspace(i32* nofree %q, i32 addrspace(1)* nocapture nofree %p, i1 %b)<br>
 define i32 @nc1_addrspace(i32* %q, i32 addrspace(1)* %p, i1 %b) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nc1_addrspace<br>
+; CHECK-SAME: (i32* nofree [[Q:%.*]], i32 addrspace(1)* nocapture nofree [[P:%.*]], i1 [[B:%.*]])<br>
+; CHECK-NEXT:  e:<br>
+; CHECK-NEXT:    br label [[L:%.*]]<br>
+; CHECK:       l:<br>
+; CHECK-NEXT:    [[X:%.*]] = phi i32 addrspace(1)* [ [[P]], [[E:%.*]] ]<br>
+; CHECK-NEXT:    [[Y:%.*]] = phi i32* [ [[Q]], [[E]] ]<br>
+; CHECK-NEXT:    [[TMP:%.*]] = addrspacecast i32 addrspace(1)* [[X]] to i32*<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[B]], i32* [[TMP]], i32* [[Y]]<br>
+; CHECK-NEXT:    [[VAL:%.*]] = load i32, i32* [[TMP2]], align 4<br>
+; CHECK-NEXT:    store i32 0, i32* [[TMP]], align 4<br>
+; CHECK-NEXT:    store i32* [[Y]], i32** @g, align 8<br>
+; CHECK-NEXT:    ret i32 [[VAL]]<br>
+;<br>
 e:<br>
-       br label %l<br>
+  br label %l<br>
 l:<br>
-       %x = phi i32 addrspace(1)* [ %p, %e ]<br>
-       %y = phi i32* [ %q, %e ]<br>
-       %tmp = addrspacecast i32 addrspace(1)* %x to i32*               ; <i32*> [#uses=2]<br>
-       %tmp2 = select i1 %b, i32* %tmp, i32* %y<br>
-       %val = load i32, i32* %tmp2             ; <i32> [#uses=1]<br>
-       store i32 0, i32* %tmp<br>
-       store i32* %y, i32** @g<br>
-       ret i32 %val<br>
+  %x = phi i32 addrspace(1)* [ %p, %e ]<br>
+  %y = phi i32* [ %q, %e ]<br>
+  %tmp = addrspacecast i32 addrspace(1)* %x to i32*            ; <i32*> [#uses=2]<br>
+  %tmp2 = select i1 %b, i32* %tmp, i32* %y<br>
+  %val = load i32, i32* %tmp2          ; <i32> [#uses=1]<br>
+  store i32 0, i32* %tmp<br>
+  store i32* %y, i32** @g<br>
+  ret i32 %val<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @nc2(i32* nocapture nofree %p, i32* nofree %q)<br>
 define void @nc2(i32* %p, i32* %q) {<br>
-       %1 = call i32 @nc1(i32* %q, i32* %p, i1 0)              ; <i32> [#uses=0]<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@nc2<br>
+; CHECK-SAME: (i32* nocapture nofree [[P:%.*]], i32* nofree [[Q:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 @nc1(i32* nofree [[Q]], i32* nocapture nofree [[P]], i1 false)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  %1 = call i32 @nc1(i32* %q, i32* %p, i1 0)           ; <i32> [#uses=0]<br>
+  ret void<br>
 }<br>
<br>
<br>
-; ATTRIBUTOR: define void @nc3(void ()* nocapture nofree nonnull %p)<br>
 define void @nc3(void ()* %p) {<br>
-       call void %p()<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@nc3<br>
+; CHECK-SAME: (void ()* nocapture nofree nonnull [[P:%.*]])<br>
+; CHECK-NEXT:    call void [[P]]()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  call void %p()<br>
+  ret void<br>
 }<br>
<br>
 ; The following test is tricky because improvements to AAIsDead can cause the call to be removed.<br>
 ; FIXME: readonly and nocapture missing on the pointer.<br>
 declare void @external(i8* readonly) nounwind argmemonly<br>
-; ATTRIBUTOR: define void @nc4(i8* %p)<br>
 define void @nc4(i8* %p) {<br>
-       call void @external(i8* %p)<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@nc4<br>
+; CHECK-SAME: (i8* [[P:%.*]])<br>
+; CHECK-NEXT:    call void @external(i8* readonly [[P]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  call void @external(i8* %p)<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @nc5(void (i8*)* nocapture nofree nonnull %f, i8* nocapture %p)<br>
 define void @nc5(void (i8*)* %f, i8* %p) {<br>
-       call void %f(i8* %p) readonly nounwind<br>
-       call void %f(i8* nocapture %p)<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@nc5<br>
+; CHECK-SAME: (void (i8*)* nocapture nofree nonnull [[F:%.*]], i8* nocapture [[P:%.*]])<br>
+; CHECK-NEXT:    call void [[F]](i8* nocapture [[P]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  call void %f(i8* %p) readonly nounwind<br>
+  call void %f(i8* nocapture %p)<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test1_1(i8* nocapture nofree readnone %x1_1, i8* nocapture nofree readnone %y1_1, i1 %c)<br>
 ; It would be acceptable to add readnone to %y1_1 and %y1_2.<br>
 define void @test1_1(i8* %x1_1, i8* %y1_1, i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test1_1<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X1_1:%.*]], i8* nocapture nofree readnone [[Y1_1:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @test1_2(i8* noalias nofree readnone undef, i8* noalias nofree readnone "no-capture-maybe-returned" [[Y1_1]], i1 [[C]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call i8* @test1_2(i8* %x1_1, i8* %y1_1, i1 %c)<br>
   store i32* null, i32** @g<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i8* @test1_2(i8* nocapture nofree readnone %x1_2, i8* nofree readnone returned "no-capture-maybe-returned" %y1_2, i1 %c)<br>
 define i8* @test1_2(i8* %x1_2, i8* %y1_2, i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test1_2<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X1_2:%.*]], i8* nofree readnone returned "no-capture-maybe-returned" [[Y1_2:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    call void @test1_1(i8* noalias nofree readnone undef, i8* noalias nocapture nofree readnone [[Y1_2]], i1 [[C]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    br label [[F]]<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    ret i8* [[Y1_2]]<br>
+;<br>
   br i1 %c, label %t, label %f<br>
 t:<br>
   call void @test1_1(i8* %x1_2, i8* %y1_2, i1 %c)<br>
@@ -170,29 +301,49 @@ f:<br>
   ret i8* %y1_2<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test2(i8* nocapture nofree readnone %x2)<br>
 define void @test2(i8* %x2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X2:%.*]])<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @test2(i8* %x2)<br>
   store i32* null, i32** @g<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test3(i8* nocapture nofree readnone %x3, i8* nocapture nofree readnone %y3, i8* nocapture nofree readnone %z3)<br>
 define void @test3(i8* %x3, i8* %y3, i8* %z3) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test3<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X3:%.*]], i8* nocapture nofree readnone [[Y3:%.*]], i8* nocapture nofree readnone [[Z3:%.*]])<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @test3(i8* %z3, i8* %y3, i8* %x3)<br>
   store i32* null, i32** @g<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test4_1(i8* nocapture nofree readnone %x4_1, i1 %c)<br>
 define void @test4_1(i8* %x4_1, i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test4_1<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X4_1:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @test4_2(i8* noalias nofree readnone undef, i8* noalias nofree readnone "no-capture-maybe-returned" [[X4_1]], i8* noalias nofree readnone undef, i1 [[C]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call i8* @test4_2(i8* %x4_1, i8* %x4_1, i8* %x4_1, i1 %c)<br>
   store i32* null, i32** @g<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i8* @test4_2(i8* nocapture nofree readnone %x4_2, i8* nofree readnone returned "no-capture-maybe-returned" %y4_2, i8* nocapture nofree readnone %z4_2, i1 %c)<br>
 define i8* @test4_2(i8* %x4_2, i8* %y4_2, i8* %z4_2, i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test4_2<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[X4_2:%.*]], i8* nofree readnone returned "no-capture-maybe-returned" [[Y4_2:%.*]], i8* nocapture nofree readnone [[Z4_2:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    call void @test4_1(i8* noalias nofree readnone align 536870912 null, i1 [[C]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    br label [[F]]<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    ret i8* [[Y4_2]]<br>
+;<br>
   br i1 %c, label %t, label %f<br>
 t:<br>
   call void @test4_1(i8* null, i1 %c)<br>
@@ -204,8 +355,13 @@ f:<br>
<br>
 declare i8* @test5_1(i8* %x5_1)<br>
<br>
-; ATTRIBUTOR: define void @test5_2(i8* %x5_2)<br>
 define void @test5_2(i8* %x5_2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test5_2<br>
+; CHECK-SAME: (i8* [[X5_2:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @test5_1(i8* [[X5_2]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call i8* @test5_1(i8* %x5_2)<br>
   store i32* null, i32** @g<br>
   ret void<br>
@@ -213,41 +369,70 @@ define void @test5_2(i8* %x5_2) {<br>
<br>
 declare void @test6_1(i8* %x6_1, i8* nocapture %y6_1, ...)<br>
<br>
-; ATTRIBUTOR: define void @test6_2(i8* %x6_2, i8* nocapture %y6_2, i8* %z6_2)<br>
 define void @test6_2(i8* %x6_2, i8* %y6_2, i8* %z6_2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6_2<br>
+; CHECK-SAME: (i8* [[X6_2:%.*]], i8* nocapture [[Y6_2:%.*]], i8* [[Z6_2:%.*]])<br>
+; CHECK-NEXT:    call void (i8*, i8*, ...) @test6_1(i8* [[X6_2]], i8* nocapture [[Y6_2]], i8* [[Z6_2]])<br>
+; CHECK-NEXT:    store i32* null, i32** @g, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void (i8*, i8*, ...) @test6_1(i8* %x6_2, i8* %y6_2, i8* %z6_2)<br>
   store i32* null, i32** @g<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test_cmpxchg(i32* nocapture nofree nonnull dereferenceable(4) %p)<br>
 define void @test_cmpxchg(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_cmpxchg<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull dereferenceable(4) [[P:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = cmpxchg i32* [[P]], i32 0, i32 1 acquire monotonic<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   cmpxchg i32* %p, i32 0, i32 1 acquire monotonic<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test_cmpxchg_ptr(i32** nocapture nofree nonnull dereferenceable(8) %p, i32* nofree %q)<br>
 define void @test_cmpxchg_ptr(i32** %p, i32* %q) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_cmpxchg_ptr<br>
+; CHECK-SAME: (i32** nocapture nofree nonnull dereferenceable(8) [[P:%.*]], i32* nofree [[Q:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = cmpxchg i32** [[P]], i32* null, i32* [[Q]] acquire monotonic<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   cmpxchg i32** %p, i32* null, i32* %q acquire monotonic<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test_atomicrmw(i32* nocapture nofree nonnull dereferenceable(4) %p)<br>
 define void @test_atomicrmw(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_atomicrmw<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull dereferenceable(4) [[P:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = atomicrmw add i32* [[P]], i32 1 seq_cst<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   atomicrmw add i32* %p, i32 1 seq_cst<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test_volatile(i32* nofree align 4 %x)<br>
 define void @test_volatile(i32* %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_volatile<br>
+; CHECK-SAME: (i32* nofree align 4 [[X:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, i32* [[X]], i64 1<br>
+; CHECK-NEXT:    store volatile i32 0, i32* [[GEP]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %gep = getelementptr i32, i32* %x, i64 1<br>
   store volatile i32 0, i32* %gep, align 4<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: nocaptureLaunder(i8* nocapture %p)<br>
 define void @nocaptureLaunder(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nocaptureLaunder<br>
+; CHECK-SAME: (i8* nocapture [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[B:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[P]])<br>
+; CHECK-NEXT:    store i8 42, i8* [[B]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %b = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)<br>
   store i8 42, i8* %b<br>
@@ -255,15 +440,26 @@ entry:<br>
 }<br>
<br>
 @g2 = global i8* null<br>
-; ATTRIBUTOR: define void @captureLaunder(i8* %p)<br>
 define void @captureLaunder(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@captureLaunder<br>
+; CHECK-SAME: (i8* [[P:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = call i8* @llvm.launder.invariant.group.p0i8(i8* [[P]])<br>
+; CHECK-NEXT:    store i8* [[B]], i8** @g2, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %b = call i8* @llvm.launder.invariant.group.p0i8(i8* %p)<br>
   store i8* %b, i8** @g2<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: @nocaptureStrip(i8* nocapture writeonly %p)<br>
 define void @nocaptureStrip(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nocaptureStrip<br>
+; CHECK-SAME: (i8* nocapture writeonly [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[B:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* noalias readnone [[P]])<br>
+; CHECK-NEXT:    store i8 42, i8* [[B]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %b = call i8* @llvm.strip.invariant.group.p0i8(i8* %p)<br>
   store i8 42, i8* %b<br>
@@ -271,74 +467,123 @@ entry:<br>
 }<br>
<br>
 @g3 = global i8* null<br>
-; ATTRIBUTOR: define void @captureStrip(i8* writeonly %p)<br>
 define void @captureStrip(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@captureStrip<br>
+; CHECK-SAME: (i8* writeonly [[P:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = call i8* @llvm.strip.invariant.group.p0i8(i8* noalias readnone [[P]])<br>
+; CHECK-NEXT:    store i8* [[B]], i8** @g3, align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %b = call i8* @llvm.strip.invariant.group.p0i8(i8* %p)<br>
   store i8* %b, i8** @g3<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @captureICmp(i32* nofree readnone %x)<br>
 define i1 @captureICmp(i32* %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@captureICmp<br>
+; CHECK-SAME: (i32* nofree readnone [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32* [[X]], null<br>
+; CHECK-NEXT:    ret i1 [[TMP1]]<br>
+;<br>
   %1 = icmp eq i32* %x, null<br>
   ret i1 %1<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @captureICmpRev(i32* nofree readnone %x)<br>
 define i1 @captureICmpRev(i32* %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@captureICmpRev<br>
+; CHECK-SAME: (i32* nofree readnone [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32* null, [[X]]<br>
+; CHECK-NEXT:    ret i1 [[TMP1]]<br>
+;<br>
   %1 = icmp eq i32* null, %x<br>
   ret i1 %1<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @nocaptureInboundsGEPICmp(i32* nocapture nofree readnone %x)<br>
 define i1 @nocaptureInboundsGEPICmp(i32* %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nocaptureInboundsGEPICmp<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, i32* [[X]], i32 5<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP1]] to i8*<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8* [[TMP2]], null<br>
+; CHECK-NEXT:    ret i1 [[TMP3]]<br>
+;<br>
   %1 = getelementptr inbounds i32, i32* %x, i32 5<br>
   %2 = bitcast i32* %1 to i8*<br>
   %3 = icmp eq i8* %2, null<br>
   ret i1 %3<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @nocaptureInboundsGEPICmpRev(i32* nocapture nofree readnone %x)<br>
 define i1 @nocaptureInboundsGEPICmpRev(i32* %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nocaptureInboundsGEPICmpRev<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i32, i32* [[X]], i32 5<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32* [[TMP1]] to i8*<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i8* null, [[TMP2]]<br>
+; CHECK-NEXT:    ret i1 [[TMP3]]<br>
+;<br>
   %1 = getelementptr inbounds i32, i32* %x, i32 5<br>
   %2 = bitcast i32* %1 to i8*<br>
   %3 = icmp eq i8* null, %2<br>
   ret i1 %3<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @nocaptureDereferenceableOrNullICmp(i32* nocapture nofree readnone dereferenceable_or_null(4) %x)<br>
 define i1 @nocaptureDereferenceableOrNullICmp(i32* dereferenceable_or_null(4) %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nocaptureDereferenceableOrNullICmp<br>
+; CHECK-SAME: (i32* nocapture nofree readnone dereferenceable_or_null(4) [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[X]] to i8*<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP1]], null<br>
+; CHECK-NEXT:    ret i1 [[TMP2]]<br>
+;<br>
   %1 = bitcast i32* %x to i8*<br>
   %2 = icmp eq i8* %1, null<br>
   ret i1 %2<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @captureDereferenceableOrNullICmp(i32* nofree readnone dereferenceable_or_null(4) %x)<br>
 define i1 @captureDereferenceableOrNullICmp(i32* dereferenceable_or_null(4) %x) "null-pointer-is-valid"="true" {<br>
+; CHECK-LABEL: define {{[^@]+}}@captureDereferenceableOrNullICmp<br>
+; CHECK-SAME: (i32* nofree readnone dereferenceable_or_null(4) [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i32* [[X]] to i8*<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP1]], null<br>
+; CHECK-NEXT:    ret i1 [[TMP2]]<br>
+;<br>
   %1 = bitcast i32* %x to i8*<br>
   %2 = icmp eq i8* %1, null<br>
   ret i1 %2<br>
 }<br>
<br>
 declare void @unknown(i8*)<br>
+; We know that 'null' in AS 0 does not alias anything and cannot be captured. Though the latter is not qurried -> derived atm.<br>
 define void @test_callsite() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_callsite()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    call void @unknown(i8* noalias align 536870912 null)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
-; We know that 'null' in AS 0 does not alias anything and cannot be captured. Though the latter is not qurried -> derived atm.<br>
-; ATTRIBUTOR: call void @unknown(i8* noalias align 536870912 null)<br>
   call void @unknown(i8* null)<br>
   ret void<br>
 }<br>
<br>
 declare i8* @unknownpi8pi8(i8*,i8* returned)<br>
 define i8* @test_returned1(i8* %A, i8* returned %B) nounwind readonly {<br>
-; ATTRIBUTOR: define i8* @test_returned1(i8* nocapture readonly %A, i8* readonly returned %B)<br>
+; CHECK-LABEL: define {{[^@]+}}@test_returned1<br>
+; CHECK-SAME: (i8* nocapture readonly [[A:%.*]], i8* readonly returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[P:%.*]] = call i8* @unknownpi8pi8(i8* [[A]], i8* [[B]])<br>
+; CHECK-NEXT:    ret i8* [[P]]<br>
+;<br>
 entry:<br>
   %p = call i8* @unknownpi8pi8(i8* %A, i8* %B)<br>
   ret i8* %p<br>
 }<br>
<br>
 define i8* @test_returned2(i8* %A, i8* %B) {<br>
-; ATTRIBUTOR: define i8* @test_returned2(i8* nocapture readonly %A, i8* readonly returned %B)<br>
+; CHECK-LABEL: define {{[^@]+}}@test_returned2<br>
+; CHECK-SAME: (i8* nocapture readonly [[A:%.*]], i8* readonly returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[P:%.*]] = call i8* @unknownpi8pi8(i8* readonly [[A]], i8* readonly [[B]])<br>
+; CHECK-NEXT:    ret i8* [[P]]<br>
+;<br>
 entry:<br>
   %p = call i8* @unknownpi8pi8(i8* %A, i8* %B) nounwind readonly<br>
   ret i8* %p<br>
@@ -350,7 +595,11 @@ declare void @val_use(i8 %ptr) readonly nounwind<br>
<br>
 ; FIXME: Both pointers should be nocapture<br>
 define void @ptr_uses(i8* %ptr, i8* %wptr) {<br>
-; CHECK: define void @ptr_uses(i8* %ptr, i8* nocapture nonnull writeonly dereferenceable(1) %wptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@ptr_uses<br>
+; CHECK-SAME: (i8* [[PTR:%.*]], i8* nocapture nonnull writeonly dereferenceable(1) [[WPTR:%.*]])<br>
+; CHECK-NEXT:    store i8 0, i8* [[WPTR]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %call_ptr = call i8* @maybe_returned_ptr(i8* %ptr)<br>
   %call_val = call i8 @maybe_returned_val(i8* %call_ptr)<br>
   call void @val_use(i8 %call_val)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nocapture-2.ll b/llvm/test/Transforms/Attributor/nocapture-2.ll<br>
index d0f03b852f16..c43df44d770f 100644<br>
--- a/llvm/test/Transforms/Attributor/nocapture-2.ll<br>
+++ b/llvm/test/Transforms/Attributor/nocapture-2.ll<br>
@@ -1,9 +1,14 @@<br>
-; RUN: opt -functionattrs -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ; Test cases specifically designed for the "no-capture" argument attribute.<br>
 ; We use FIXME's to indicate problems and missing attributes.<br>
 ;<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+declare i32* @unknown()<br>
<br>
 ; TEST comparison against NULL<br>
 ;<br>
@@ -11,9 +16,15 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 ;   return p == 0;<br>
 ; }<br>
 ;<br>
-; FIXME: no-capture missing for %p<br>
-; CHECK: define i32 @is_null_return(i32* nofree readnone %p)<br>
+; no-capture is missing on %p because it is not dereferenceable<br>
 define i32 @is_null_return(i32* %p) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@is_null_return<br>
+; CHECK-SAME: (i32* nofree readnone [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[P]], null<br>
+; CHECK-NEXT:    [[CONV:%.*]] = zext i1 [[CMP]] to i32<br>
+; CHECK-NEXT:    ret i32 [[CONV]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %p, null<br>
   %conv = zext i1 %cmp to i32<br>
@@ -30,9 +41,30 @@ entry:<br>
 ;   return 0;<br>
 ; }<br>
 ;<br>
-; FIXME: no-capture missing for %p<br>
-; CHECK: define i32 @is_null_control(i32* nofree readnone %p)<br>
+; no-capture is missing on %p because it is not dereferenceable<br>
 define i32 @is_null_control(i32* %p) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@is_null_control<br>
+; CHECK-SAME: (i32* nofree [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[RETVAL:%.*]] = alloca i32, align 4<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[P]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    store i32 1, i32* [[RETVAL]], align 4<br>
+; CHECK-NEXT:    br label [[RETURN:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i32* null, [[P]]<br>
+; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END3:%.*]]<br>
+; CHECK:       if.then2:<br>
+; CHECK-NEXT:    store i32 1, i32* [[RETVAL]], align 4<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       if.end3:<br>
+; CHECK-NEXT:    store i32 0, i32* [[RETVAL]], align 4<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[RETVAL]], align 4<br>
+; CHECK-NEXT:    ret i32 [[TMP0]]<br>
+;<br>
 entry:<br>
   %retval = alloca i32, align 4<br>
   %cmp = icmp eq i32* %p, null<br>
@@ -66,8 +98,12 @@ return:                                           ; preds = %if.end3, %if.then2,<br>
 ;   return 0;<br>
 ; }<br>
 ;<br>
-; CHECK: define noalias nonnull align 536870912 dereferenceable(4294967295) double* @srec0(double* nocapture nofree readnone %a)<br>
 define double* @srec0(double* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@srec0<br>
+; CHECK-SAME: (double* nocapture nofree readnone [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %call = call double* @srec0(double* %a)<br>
   ret double* null<br>
@@ -86,12 +122,14 @@ entry:<br>
 ;<br>
 ; Other arguments are possible here due to the no-return behavior.<br>
 ;<br>
-; CHECK: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @srec16(i32* nocapture nofree readnone %a)<br>
 define i32* @srec16(i32* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@srec16<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %call = call i32* @srec16(i32* %a)<br>
-; CHECK-NOT:      %call<br>
-; CHECK: unreachable<br>
   %call1 = call i32* @srec16(i32* %call)<br>
   %call2 = call i32* @srec16(i32* %call1)<br>
   %call3 = call i32* @srec16(i32* %call2)<br>
@@ -112,12 +150,6 @@ entry:<br>
<br>
 ; TEST SCC with various calls, casts, and comparisons agains NULL<br>
 ;<br>
-; CHECK: define dereferenceable_or_null(4) float* @scc_A(i32* nofree readnone returned dereferenceable_or_null(4) "no-capture-maybe-returned" %a)<br>
-;<br>
-; CHECK: define dereferenceable_or_null(8) i64* @scc_B(double* nofree readnone returned dereferenceable_or_null(8) "no-capture-maybe-returned" %a)<br>
-;<br>
-; CHECK: define dereferenceable_or_null(4) i8* @scc_C(i16* nofree readnone returned dereferenceable_or_null(4) "no-capture-maybe-returned" %a)<br>
-;<br>
 ; float *scc_A(int *a) {<br>
 ;   return (float*)(a ? (int*)scc_A((int*)scc_B((double*)scc_C((short*)a))) : a);<br>
 ; }<br>
@@ -130,6 +162,27 @@ entry:<br>
 ;   return scc_A((int*)(scc_A(a) ? scc_B((double*)a) : scc_C(a)));<br>
 ; }<br>
 define float* @scc_A(i32* dereferenceable_or_null(4) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_A<br>
+; CHECK-SAME: (i32* nofree readnone returned dereferenceable_or_null(4) "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32* [[A]], null<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i32* [[A]] to i16*<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call dereferenceable_or_null(4) i8* @scc_C(i16* noalias nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[TMP0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[CALL]] to double*<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call dereferenceable_or_null(8) i64* @scc_B(double* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i64* [[CALL1]] to i32*<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call float* @scc_A(i32* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP2]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[CALL2]] to i32*<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[COND:%.*]] = phi i32* [ [[TMP3]], [[COND_TRUE]] ], [ [[A]], [[COND_FALSE]] ]<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i32* [[COND]] to float*<br>
+; CHECK-NEXT:    ret float* [[TMP4]]<br>
+;<br>
 entry:<br>
   %tobool = icmp ne i32* %a, null<br>
   br i1 %tobool, label %cond.true, label %cond.false<br>
@@ -154,6 +207,27 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 }<br>
<br>
 define i64* @scc_B(double* dereferenceable_or_null(8) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_B<br>
+; CHECK-SAME: (double* nofree readnone returned dereferenceable_or_null(8) "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne double* [[A]], null<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = bitcast double* [[A]] to i32*<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call dereferenceable_or_null(4) float* @scc_A(i32* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast float* [[CALL]] to double*<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call dereferenceable_or_null(8) i64* @scc_B(double* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP1]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i64* [[CALL1]] to i16*<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call i8* @scc_C(i16* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP2]])<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast double* [[A]] to i8*<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[COND:%.*]] = phi i8* [ [[CALL2]], [[COND_TRUE]] ], [ [[TMP3]], [[COND_FALSE]] ]<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i8* [[COND]] to i64*<br>
+; CHECK-NEXT:    ret i64* [[TMP4]]<br>
+;<br>
 entry:<br>
   %tobool = icmp ne double* %a, null<br>
   br i1 %tobool, label %cond.true, label %cond.false<br>
@@ -178,6 +252,29 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 }<br>
<br>
 define i8* @scc_C(i16* dereferenceable_or_null(2) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_C<br>
+; CHECK-SAME: (i16* nofree readnone returned dereferenceable_or_null(4) "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC:%.*]] = bitcast i16* [[A]] to i32*<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call dereferenceable_or_null(4) float* @scc_A(i32* noalias nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[BC]])<br>
+; CHECK-NEXT:    [[BC2:%.*]] = bitcast float* [[CALL]] to i8*<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i8* [[BC2]], null<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = bitcast i16* [[A]] to double*<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call dereferenceable_or_null(8) i64* @scc_B(double* noalias nofree nonnull readnone dereferenceable(8) "no-capture-maybe-returned" [[TMP0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i64* [[CALL1]] to i8*<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call dereferenceable_or_null(4) i8* @scc_C(i16* noalias nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[A]])<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[COND:%.*]] = phi i8* [ [[TMP1]], [[COND_TRUE]] ], [ [[CALL2]], [[COND_FALSE]] ]<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[COND]] to i32*<br>
+; CHECK-NEXT:    [[CALL3:%.*]] = call float* @scc_A(i32* noalias nofree nonnull readnone dereferenceable(4) "no-capture-maybe-returned" [[TMP2]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = bitcast float* [[CALL3]] to i8*<br>
+; CHECK-NEXT:    ret i8* [[TMP3]]<br>
+;<br>
 entry:<br>
   %bc = bitcast i16* %a to i32*<br>
   %call = call float* @scc_A(i32* %bc)<br>
@@ -211,10 +308,15 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 ;   external_no_capture(p);<br>
 ; }<br>
 ;<br>
-; CHECK: define void @test_external_no_capture(i32* nocapture %p)<br>
 declare void @external_no_capture(i32* nocapture)<br>
<br>
 define void @test_external_no_capture(i32* %p) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_external_no_capture<br>
+; CHECK-SAME: (i32* nocapture [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    call void @external_no_capture(i32* nocapture [[P]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   call void @external_no_capture(i32* %p)<br>
   ret void<br>
@@ -226,8 +328,13 @@ entry:<br>
 ;   printf(p, a);<br>
 ; }<br>
 ;<br>
-; CHECK: define void @test_var_arg_call(i8* nocapture %p, i32 %a)<br>
 define void @test_var_arg_call(i8* %p, i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@test_var_arg_call<br>
+; CHECK-SAME: (i8* nocapture [[P:%.*]], i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 (i8*, ...) @printf(i8* nocapture [[P]], i32 [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i32 (i8*, ...) @printf(i8* %p, i32 %a)<br>
   ret void<br>
@@ -244,9 +351,13 @@ declare i32 @printf(i8* nocapture, ...)<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define nonnull align 8 dereferenceable(8) i64* @not_captured_but_returned_0(i64* nofree nonnull returned writeonly align 8 dereferenceable(8) "no-capture-maybe-returned" %a)<br>
-<br>
 define i64* @not_captured_but_returned_0(i64* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_but_returned_0<br>
+; CHECK-SAME: (i64* nofree nonnull returned writeonly align 8 dereferenceable(8) "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    store i64 0, i64* [[A]], align 8<br>
+; CHECK-NEXT:    ret i64* [[A]]<br>
+;<br>
 entry:<br>
   store i64 0, i64* %a, align 8<br>
   ret i64* %a<br>
@@ -260,8 +371,14 @@ entry:<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define nonnull align 8 dereferenceable(8) i64* @not_captured_but_returned_1(i64* nofree nonnull writeonly align 8 dereferenceable(16) "no-capture-maybe-returned" %a)<br>
 define i64* @not_captured_but_returned_1(i64* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_but_returned_1<br>
+; CHECK-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(16) "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i64, i64* [[A]], i64 1<br>
+; CHECK-NEXT:    store i64 1, i64* [[ADD_PTR]], align 8<br>
+; CHECK-NEXT:    ret i64* [[ADD_PTR]]<br>
+;<br>
 entry:<br>
   %add.ptr = getelementptr inbounds i64, i64* %a, i64 1<br>
   store i64 1, i64* %add.ptr, align 8<br>
@@ -275,8 +392,21 @@ entry:<br>
 ;   not_captured_but_returned_1(a);<br>
 ; }<br>
 ;<br>
-; CHECK: define void @test_not_captured_but_returned_calls(i64* nocapture nofree writeonly align 8 %a)<br>
 define void @test_not_captured_but_returned_calls(i64* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test_not_captured_but_returned_calls<br>
+; IS__TUNIT____-SAME: (i64* nocapture nofree writeonly align 8 [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i64* @not_captured_but_returned_1(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_not_captured_but_returned_calls<br>
+; IS__CGSCC____-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i64* @not_captured_but_returned_1(i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i64* @not_captured_but_returned_0(i64* %a)<br>
   %call1 = call i64* @not_captured_but_returned_1(i64* %a)<br>
@@ -290,8 +420,19 @@ entry:<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define align 8 i64* @negative_test_not_captured_but_returned_call_0a(i64* nofree returned writeonly align 8 "no-capture-maybe-returned" %a)<br>
 define i64* @negative_test_not_captured_but_returned_call_0a(i64* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0a<br>
+; IS__TUNIT____-SAME: (i64* nofree returned writeonly align 8 "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    ret i64* [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0a<br>
+; IS__CGSCC____-SAME: (i64* nofree nonnull returned writeonly align 8 dereferenceable(8) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree nonnull writeonly align 8 dereferenceable(8) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret i64* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i64* @not_captured_but_returned_0(i64* %a)<br>
   ret i64* %call<br>
@@ -304,8 +445,23 @@ entry:<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define void @negative_test_not_captured_but_returned_call_0b(i64* nofree writeonly align 8 %a)<br>
 define void @negative_test_not_captured_but_returned_call_0b(i64* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0b<br>
+; IS__TUNIT____-SAME: (i64* nofree writeonly align 8 [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = ptrtoint i64* [[CALL]] to i64<br>
+; IS__TUNIT____-NEXT:    store i64 [[TMP0]], i64* [[A]], align 8<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_0b<br>
+; IS__CGSCC____-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(8) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i64* @not_captured_but_returned_0(i64* nofree nonnull writeonly align 8 dereferenceable(8) [[A]])<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = ptrtoint i64* [[CALL]] to i64<br>
+; IS__CGSCC____-NEXT:    store i64 [[TMP0]], i64* [[A]], align 8<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i64* @not_captured_but_returned_0(i64* %a)<br>
   %0 = ptrtoint i64* %call to i64<br>
@@ -320,8 +476,19 @@ entry:<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define nonnull align 8 dereferenceable(8) i64* @negative_test_not_captured_but_returned_call_1a(i64* nofree writeonly align 8 "no-capture-maybe-returned" %a)<br>
 define i64* @negative_test_not_captured_but_returned_call_1a(i64* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1a<br>
+; IS__TUNIT____-SAME: (i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call nonnull align 8 dereferenceable(8) i64* @not_captured_but_returned_1(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    ret i64* [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1a<br>
+; IS__CGSCC____-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call nonnull align 8 dereferenceable(8) i64* @not_captured_but_returned_1(i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret i64* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i64* @not_captured_but_returned_1(i64* %a)<br>
   ret i64* %call<br>
@@ -334,8 +501,23 @@ entry:<br>
 ; }<br>
 ;<br>
 ; There should *not* be a no-capture attribute on %a<br>
-; CHECK: define void @negative_test_not_captured_but_returned_call_1b(i64* nofree writeonly align 8 %a)<br>
 define void @negative_test_not_captured_but_returned_call_1b(i64* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1b<br>
+; IS__TUNIT____-SAME: (i64* nofree writeonly align 8 [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call align 8 i64* @not_captured_but_returned_1(i64* nofree writeonly align 8 "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    [[TMP0:%.*]] = ptrtoint i64* [[CALL]] to i64<br>
+; IS__TUNIT____-NEXT:    store i64 [[TMP0]], i64* [[CALL]], align 8<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@negative_test_not_captured_but_returned_call_1b<br>
+; IS__CGSCC____-SAME: (i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call align 8 i64* @not_captured_but_returned_1(i64* nofree nonnull writeonly align 8 dereferenceable(16) [[A]])<br>
+; IS__CGSCC____-NEXT:    [[TMP0:%.*]] = ptrtoint i64* [[CALL]] to i64<br>
+; IS__CGSCC____-NEXT:    store i64 [[TMP0]], i64* [[CALL]], align 8<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i64* @not_captured_but_returned_1(i64* %a)<br>
   %0 = ptrtoint i64* %call to i64<br>
@@ -353,12 +535,19 @@ entry:<br>
 ;<br>
 ; Verify we do *not* assume b is returned or not captured.<br>
 ;<br>
-; CHECK:     define i32* @ret_arg_or_unknown(i32* readnone %b)<br>
-; CHECK:     define i32* @ret_arg_or_unknown_through_phi(i32* readnone %b)<br>
-<br>
-declare i32* @unknown()<br>
<br>
 define i32* @ret_arg_or_unknown(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_arg_or_unknown<br>
+; CHECK-SAME: (i32* [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[B]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG:%.*]], label [[RET_UNKNOWN:%.*]]<br>
+; CHECK:       ret_arg:<br>
+; CHECK-NEXT:    ret i32* [[B]]<br>
+; CHECK:       ret_unknown:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown()<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %b, null<br>
   br i1 %cmp, label %ret_arg, label %ret_unknown<br>
@@ -372,6 +561,20 @@ ret_unknown:<br>
 }<br>
<br>
 define i32* @ret_arg_or_unknown_through_phi(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_arg_or_unknown_through_phi<br>
+; CHECK-SAME: (i32* [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[B]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG:%.*]], label [[RET_UNKNOWN:%.*]]<br>
+; CHECK:       ret_arg:<br>
+; CHECK-NEXT:    br label [[R:%.*]]<br>
+; CHECK:       ret_unknown:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown()<br>
+; CHECK-NEXT:    br label [[R]]<br>
+; CHECK:       r:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi i32* [ [[B]], [[RET_ARG]] ], [ [[CALL]], [[RET_UNKNOWN]] ]<br>
+; CHECK-NEXT:    ret i32* [[PHI]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %b, null<br>
   br i1 %cmp, label %ret_arg, label %ret_unknown<br>
@@ -391,10 +594,15 @@ r:<br>
<br>
 ; TEST not captured by readonly external function<br>
 ;<br>
-; CHECK: define void @not_captured_by_readonly_call(i32* nocapture readonly %b)<br>
 declare i32* @readonly_unknown(i32*, i32*) readonly<br>
<br>
 define void @not_captured_by_readonly_call(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_by_readonly_call<br>
+; CHECK-SAME: (i32* nocapture readonly [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_unknown(i32* readonly [[B]], i32* readonly [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i32* @readonly_unknown(i32* %b, i32* %b)<br>
   ret void<br>
@@ -405,13 +613,13 @@ entry:<br>
 ;<br>
 ; Make sure the returned flag on %r is strong enough to justify nocapture on %b but **not** on %r.<br>
 ;<br>
-; CHECK: define i32* @not_captured_by_readonly_call_not_returned_either1(i32* nocapture readonly %b, i32* readonly returned %r)<br>
-;<br>
-; CHECK: define i32* @not_captured_by_readonly_call_not_returned_either2(i32* nocapture readonly %b, i32* readonly returned %r)<br>
-; CHECK: define i32* @not_captured_by_readonly_call_not_returned_either3(i32* nocapture readonly %b, i32* readonly returned %r)<br>
-;<br>
-; CHECK: define i32* @not_captured_by_readonly_call_not_returned_either4(i32* nocapture readonly %b, i32* readonly returned %r)<br>
 define i32* @not_captured_by_readonly_call_not_returned_either1(i32* %b, i32* returned %r) {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_by_readonly_call_not_returned_either1<br>
+; CHECK-SAME: (i32* nocapture readonly [[B:%.*]], i32* readonly returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_unknown(i32* readonly [[B]], i32* readonly [[R]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @readonly_unknown(i32* %b, i32* %r) nounwind<br>
   ret i32* %call<br>
@@ -419,6 +627,12 @@ entry:<br>
<br>
 declare i32* @readonly_unknown_r1a(i32*, i32* returned) readonly<br>
 define i32* @not_captured_by_readonly_call_not_returned_either2(i32* %b, i32* %r) {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_by_readonly_call_not_returned_either2<br>
+; CHECK-SAME: (i32* nocapture readonly [[B:%.*]], i32* readonly returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_unknown_r1a(i32* readonly [[B]], i32* readonly [[R]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @readonly_unknown_r1a(i32* %b, i32* %r) nounwind<br>
   ret i32* %call<br>
@@ -426,12 +640,24 @@ entry:<br>
<br>
 declare i32* @readonly_unknown_r1b(i32*, i32* returned) readonly nounwind<br>
 define i32* @not_captured_by_readonly_call_not_returned_either3(i32* %b, i32* %r) {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_by_readonly_call_not_returned_either3<br>
+; CHECK-SAME: (i32* nocapture readonly [[B:%.*]], i32* readonly returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_unknown_r1b(i32* nocapture readonly [[B]], i32* readonly [[R]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @readonly_unknown_r1b(i32* %b, i32* %r)<br>
   ret i32* %call<br>
 }<br>
<br>
 define i32* @not_captured_by_readonly_call_not_returned_either4(i32* %b, i32* %r) nounwind {<br>
+; CHECK-LABEL: define {{[^@]+}}@not_captured_by_readonly_call_not_returned_either4<br>
+; CHECK-SAME: (i32* nocapture readonly [[B:%.*]], i32* readonly returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_unknown_r1a(i32* readonly [[B]], i32* readonly [[R]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @readonly_unknown_r1a(i32* %b, i32* %r)<br>
   ret i32* %call<br>
@@ -443,7 +669,7 @@ define void @nocapture_is_not_subsumed_1(i32* nocapture %b) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@nocapture_is_not_subsumed_1<br>
 ; CHECK-SAME: (i32* nocapture [[B:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown_i32p(i32* [[B:%.*]])<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown_i32p(i32* [[B]])<br>
 ; CHECK-NEXT:    store i32 0, i32* [[CALL]]<br>
 ; CHECK-NEXT:    ret void<br>
 ;<br>
@@ -456,9 +682,9 @@ entry:<br>
 declare i32* @readonly_i32p(i32*) readonly<br>
 define void @nocapture_is_not_subsumed_2(i32* nocapture %b) {<br>
 ; CHECK-LABEL: define {{[^@]+}}@nocapture_is_not_subsumed_2<br>
-; CHECK-SAME: (i32* nocapture nofree [[B:%.*]])<br>
+; CHECK-SAME: (i32* nocapture [[B:%.*]])<br>
 ; CHECK-NEXT:  entry:<br>
-; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_i32p(i32* readonly [[B:%.*]])<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @readonly_i32p(i32* readonly [[B]])<br>
 ; CHECK-NEXT:    store i32 0, i32* [[CALL]]<br>
 ; CHECK-NEXT:    ret void<br>
 ;<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nofree.ll b/llvm/test/Transforms/Attributor/nofree.ll<br>
index b72bfb6d3c75..538fee5fb875 100644<br>
--- a/llvm/test/Transforms/Attributor/nofree.ll<br>
+++ b/llvm/test/Transforms/Attributor/nofree.ll<br>
@@ -1,8 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR<br>
-; Copied from Transforms/FunctoinAttrs/nofree-attributor.ll<br>
-<br>
-; UTC_ARGS: --disable<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
@@ -16,10 +16,13 @@ declare void @_ZdaPv(i8*) local_unnamed_addr #2<br>
<br>
<br>
 ; TEST 1 (positive case)<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @only_return()<br>
+; IS__TUNIT____: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
 define void @only_return() #0 {<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@only_return()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  ret void<br>
 }<br>
<br>
<br>
@@ -29,12 +32,16 @@ define void @only_return() #0 {<br>
 ;    free(p);<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define void @only_free(i8* nocapture %0) local_unnamed_addr #1<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define void @only_free(i8* nocapture %0) local_unnamed_addr #0 {<br>
-    tail call void @free(i8* %0) #1<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@only_free<br>
+; CHECK-SAME: (i8* nocapture [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    tail call void @free(i8* nocapture [[TMP0]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @free(i8* %0) #1<br>
+  ret void<br>
 }<br>
<br>
<br>
@@ -49,19 +56,33 @@ define void @only_free(i8* nocapture %0) local_unnamed_addr #0 {<br>
 ; }<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define void @free_in_scc1(i8* nocapture %0) local_unnamed_addr<br>
 define void @free_in_scc1(i8* nocapture %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@free_in_scc1<br>
+; CHECK-SAME: (i8* nocapture [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    tail call void @free_in_scc2(i8* nocapture [[TMP0]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @free_in_scc2(i8* %0) #1<br>
   ret void<br>
 }<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR: define void @free_in_scc2(i8* nocapture %0) local_unnamed_addr<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define void @free_in_scc2(i8* nocapture %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@free_in_scc2<br>
+; CHECK-SAME: (i8* nocapture [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[REC:%.*]], label [[CALL:%.*]]<br>
+; CHECK:       call:<br>
+; CHECK-NEXT:    tail call void @free(i8* nocapture [[TMP0]])<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       rec:<br>
+; CHECK-NEXT:    tail call void @free_in_scc1(i8* nocapture [[TMP0]])<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp = icmp eq i8* %0, null<br>
   br i1 %cmp, label %rec, label %call<br>
 call:<br>
@@ -85,16 +106,22 @@ end:<br>
 ; }<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @mutual_recursion1()<br>
+; NOT_CGSCC_NPM: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_NPM: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define void @mutual_recursion1() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@mutual_recursion1()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @mutual_recursion2()<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @mutual_recursion2()<br>
+; NOT_CGSCC_NPM: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_NPM: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define void @mutual_recursion2() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@mutual_recursion2()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   call void @mutual_recursion1()<br>
   ret void<br>
 }<br>
@@ -106,10 +133,19 @@ define void @mutual_recursion2() #0 {<br>
 ;     delete [] p;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define void @_Z9delete_opPc(i8* %0) local_unnamed_addr #1<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define void @_Z9delete_opPc(i8* %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@_Z9delete_opPc<br>
+; CHECK-SAME: (i8* [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    tail call void @_ZdaPv(i8* nonnull [[TMP0]])<br>
+; CHECK-NEXT:    br label [[TMP4]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %4, label %3<br>
<br>
@@ -124,12 +160,16 @@ define void @_Z9delete_opPc(i8* %0) local_unnamed_addr #0 {<br>
<br>
 ; TEST 6 (negative case)<br>
 ; Call realloc<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define noalias i8* @call_realloc(i8* nocapture %0, i64 %1) local_unnamed_addr<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define noalias i8* @call_realloc(i8* nocapture %0, i64 %1) local_unnamed_addr #0 {<br>
-    %ret = tail call i8* @realloc(i8* %0, i64 %1) #2<br>
-    ret i8* %ret<br>
+; CHECK-LABEL: define {{[^@]+}}@call_realloc<br>
+; CHECK-SAME: (i8* nocapture [[TMP0:%.*]], i64 [[TMP1:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[RET:%.*]] = tail call i8* @realloc(i8* nocapture [[TMP0]], i64 [[TMP1]])<br>
+; CHECK-NEXT:    ret i8* [[RET]]<br>
+;<br>
+  %ret = tail call i8* @realloc(i8* %0, i64 %1) #2<br>
+  ret i8* %ret<br>
 }<br>
<br>
<br>
@@ -137,114 +177,152 @@ define noalias i8* @call_realloc(i8* nocapture %0, i64 %1) local_unnamed_addr #0<br>
 ; Call function declaration with "nofree"<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs:  nofree noinline nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: declare void @nofree_function()<br>
+; CHECK: Function Attrs:  nofree noinline nounwind readnone uwtable<br>
+; CHECK-NEXT: declare void @nofree_function()<br>
 declare void @nofree_function() nofree readnone #0<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @call_nofree_function()<br>
+; IS__TUNIT____: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
 define void @call_nofree_function() #0 {<br>
-    tail call void @nofree_function()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_nofree_function()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @nofree_function()<br>
+  ret void<br>
 }<br>
<br>
 ; TEST 8 (negative case)<br>
 ; Call function declaration without "nofree"<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NEXT: declare void @maybe_free()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NEXT: declare void @maybe_free()<br>
 declare void @maybe_free() #0<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define void @call_maybe_free()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define void @call_maybe_free() #0 {<br>
-    tail call void @maybe_free()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_maybe_free()<br>
+; CHECK-NEXT:    tail call void @maybe_free()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @maybe_free()<br>
+  ret void<br>
 }<br>
<br>
<br>
 ; TEST 9 (negative case)<br>
 ; Call both of above functions<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nofree<br>
-; ATTRIBUTOR-NEXT: define void @call_both()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nofree<br>
 define void @call_both() #0 {<br>
-    tail call void @maybe_free()<br>
-    tail call void @nofree_function()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_both()<br>
+; CHECK-NEXT:    tail call void @maybe_free()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @maybe_free()<br>
+  tail call void @nofree_function()<br>
+  ret void<br>
 }<br>
<br>
<br>
 ; TEST 10 (positive case)<br>
 ; Call intrinsic function<br>
-; ATTRIBUTOR: Function Attrs: nounwind readnone speculatable<br>
-; ATTRIBUTOR-NEXT: declare float @llvm.floor.f32(float)<br>
+; CHECK: Function Attrs: nounwind readnone speculatable<br>
+; CHECK-NEXT: declare float @llvm.floor.f32(float)<br>
 declare float @llvm.floor.f32(float)<br>
<br>
-; FIXME: missing nofree<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define void @call_floor(float %a)<br>
-<br>
+; IS__TUNIT____: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
 define void @call_floor(float %a) #0 {<br>
-    tail call float @llvm.floor.f32(float %a)<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_floor<br>
+; CHECK-SAME: (float [[A:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call float @llvm.floor.f32(float %a)<br>
+  ret void<br>
 }<br>
<br>
 ; FIXME: missing nofree<br>
-; ATTRIBUTOR: Function Attrs: noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define float @call_floor2(float %a)<br>
+; CHECK: Function Attrs: noinline nosync nounwind readnone uwtable<br>
 define float @call_floor2(float %a) #0 {<br>
-    %c = tail call float @llvm.floor.f32(float %a)<br>
-    ret float %c<br>
+; CHECK-LABEL: define {{[^@]+}}@call_floor2<br>
+; CHECK-SAME: (float [[A:%.*]])<br>
+; CHECK-NEXT:    [[C:%.*]] = tail call float @llvm.floor.f32(float [[A]])<br>
+; CHECK-NEXT:    ret float [[C]]<br>
+;<br>
+  %c = tail call float @llvm.floor.f32(float %a)<br>
+  ret float %c<br>
 }<br>
<br>
 ; TEST 11 (positive case)<br>
 ; Check propagation.<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @f1()<br>
+; IS__TUNIT____: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
 define void @f1() #0 {<br>
-    tail call void @nofree_function()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@f1()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @nofree_function()<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @f2()<br>
+; IS__TUNIT____: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
 define void @f2() #0 {<br>
-    tail call void @f1()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@f2()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @f1()<br>
+  ret void<br>
 }<br>
<br>
 ; TEST 12 NoFree argument - positive.<br>
-; ATTRIBUTOR: define double @test12(double* nocapture nofree nonnull readonly align 8 dereferenceable(8) %a)<br>
 define double @test12(double* nocapture readonly %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12<br>
+; CHECK-SAME: (double* nocapture nofree nonnull readonly align 8 dereferenceable(8) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load double, double* [[A]], align 8<br>
+; CHECK-NEXT:    [[CALL:%.*]] = tail call double @cos(double [[TMP0]])<br>
+; CHECK-NEXT:    ret double [[CALL]]<br>
+;<br>
 entry:<br>
-       %0 = load double, double* %a, align 8<br>
-       %call = tail call double @cos(double %0) #2<br>
-       ret double %call<br>
+  %0 = load double, double* %a, align 8<br>
+  %call = tail call double @cos(double %0) #2<br>
+  ret double %call<br>
 }<br>
<br>
 declare double @cos(double) nobuiltin nounwind nofree<br>
<br>
 ; FIXME: %a should be nofree.<br>
 ; TEST 13 NoFree argument - positive.<br>
-; ATTRIBUTOR: define noalias i32* @test13(i64* nocapture nonnull readonly align 8 dereferenceable(8) %a)<br>
 define noalias i32* @test13(i64* nocapture readonly %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test13<br>
+; CHECK-SAME: (i64* nocapture nonnull readonly align 8 dereferenceable(8) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i64, i64* [[A]], align 8<br>
+; CHECK-NEXT:    [[CALL:%.*]] = tail call noalias i8* @malloc(i64 [[TMP0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = bitcast i8* [[CALL]] to i32*<br>
+; CHECK-NEXT:    ret i32* [[TMP1]]<br>
+;<br>
 entry:<br>
-       %0 = load i64, i64* %a, align 8<br>
-       %call = tail call noalias i8* @malloc(i64 %0) #2<br>
-       %1 = bitcast i8* %call to i32*<br>
-       ret i32* %1<br>
+  %0 = load i64, i64* %a, align 8<br>
+  %call = tail call noalias i8* @malloc(i64 %0) #2<br>
+  %1 = bitcast i8* %call to i32*<br>
+  ret i32* %1<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test14(i8* nocapture %0, i8* nocapture nofree readnone %1)<br>
 define void @test14(i8* nocapture %0, i8* nocapture %1) {<br>
-       tail call void @free(i8* %0) #1<br>
-       ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@test14<br>
+; CHECK-SAME: (i8* nocapture [[TMP0:%.*]], i8* nocapture nofree readnone [[TMP1:%.*]])<br>
+; CHECK-NEXT:    tail call void @free(i8* nocapture [[TMP0]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @free(i8* %0) #1<br>
+  ret void<br>
 }<br>
<br>
 ; UTC_ARGS: --enable<br>
@@ -255,6 +333,12 @@ define void @nonnull_assume_pos(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {<br>
 ; ATTRIBUTOR-NEXT:    call void @llvm.assume(i1 true) #11 [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG3]]) ]<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown(i8* nofree [[ARG1]], i8* [[ARG2]], i8* nofree [[ARG3]], i8* [[ARG4]])<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; CHECK-SAME: (i8* nofree [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* nofree [[ARG3:%.*]], i8* [[ARG4:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) #11 [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG3]]) ]<br>
+; CHECK-NEXT:    call void @unknown(i8* nofree [[ARG1]], i8* [[ARG2]], i8* nofree [[ARG3]], i8* [[ARG4]])<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call void @llvm.assume(i1 true) ["nofree"(i8* %arg1), "nofree"(i8* %arg3)]<br>
   call void @unknown(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4)<br>
@@ -266,6 +350,12 @@ define void @nonnull_assume_neg(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {<br>
 ; ATTRIBUTOR-NEXT:    call void @unknown(i8* [[ARG1]], i8* [[ARG2]], i8* [[ARG3]], i8* [[ARG4]])<br>
 ; ATTRIBUTOR-NEXT:    call void @llvm.assume(i1 true) [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG3]]) ]<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_neg<br>
+; CHECK-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])<br>
+; CHECK-NEXT:    call void @unknown(i8* [[ARG1]], i8* [[ARG2]], i8* [[ARG3]], i8* [[ARG4]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG3]]) ]<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call void @unknown(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4)<br>
   call void @llvm.assume(i1 true) ["nofree"(i8* %arg1), "nofree"(i8* %arg3)]<br>
@@ -286,6 +376,21 @@ define void @nonnull_assume_call(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {<br>
 ; ATTRIBUTOR-NEXT:    call void @use_i8_ptr_ret(i8* noalias nofree readnone [[ARG3]])<br>
 ; ATTRIBUTOR-NEXT:    call void @use_i8_ptr_ret(i8* noalias nofree readnone [[ARG4]])<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_call<br>
+; CHECK-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])<br>
+; CHECK-NEXT:    call void @unknown(i8* [[ARG1]], i8* [[ARG2]], i8* [[ARG3]], i8* [[ARG4]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias readnone [[ARG1]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias readnone [[ARG2]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG3]]) ]<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias nofree readnone [[ARG3]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias readnone [[ARG4]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias nofree readnone [[ARG1]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias readnone [[ARG2]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nofree"(i8* [[ARG1]]), "nofree"(i8* [[ARG4]]) ]<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias nofree readnone [[ARG3]])<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias nofree readnone [[ARG4]])<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call void @unknown(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4)<br>
   call void @use_i8_ptr(i8* %arg1)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nonnull.ll b/llvm/test/Transforms/Attributor/nonnull.ll<br>
index 06ec6c2c585f..e0bdd5155ab1 100644<br>
--- a/llvm/test/Transforms/Attributor/nonnull.ll<br>
+++ b/llvm/test/Transforms/Attributor/nonnull.ll<br>
@@ -1,9 +1,9 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_OPM<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_NPM<br>
-; Copied from Transforms/FunctoinAttrs/nonnull.ll<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
-; UTC_ARGS: --disable<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
@@ -11,21 +11,35 @@ declare nonnull i8* @ret_nonnull()<br>
<br>
 ; Return a pointer trivially nonnull (call return attribute)<br>
 define i8* @test1() {<br>
-; ATTRIBUTOR: define nonnull i8* @test1<br>
+; CHECK-LABEL: define {{[^@]+}}@test1()<br>
+; CHECK-NEXT:    [[RET:%.*]] = call nonnull i8* @ret_nonnull()<br>
+; CHECK-NEXT:    ret i8* [[RET]]<br>
+;<br>
   %ret = call i8* @ret_nonnull()<br>
   ret i8* %ret<br>
 }<br>
<br>
 ; Return a pointer trivially nonnull (argument attribute)<br>
 define i8* @test2(i8* nonnull %p) {<br>
-; ATTRIBUTOR: define nonnull i8* @test2<br>
+; CHECK-LABEL: define {{[^@]+}}@test2<br>
+; CHECK-SAME: (i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    ret i8* [[P]]<br>
+;<br>
   ret i8* %p<br>
 }<br>
<br>
 ; Given an SCC where one of the functions can not be marked nonnull,<br>
 ; can we still mark the other one which is trivially nonnull<br>
 define i8* @scc_binder(i1 %c) {<br>
-; ATTRIBUTOR: define noalias align 536870912 i8* @scc_binder<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_binder<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]<br>
+; CHECK:       rec:<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @test3(i1 [[C]])<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    ret i8* null<br>
+;<br>
   br i1 %c, label %rec, label %end<br>
 rec:<br>
   call i8* @test3(i1 %c)<br>
@@ -35,7 +49,12 @@ end:<br>
 }<br>
<br>
 define i8* @test3(i1 %c) {<br>
-; ATTRIBUTOR: define nonnull i8* @test3<br>
+; CHECK-LABEL: define {{[^@]+}}@test3<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @scc_binder(i1 [[C]])<br>
+; CHECK-NEXT:    [[RET:%.*]] = call nonnull i8* @ret_nonnull()<br>
+; CHECK-NEXT:    ret i8* [[RET]]<br>
+;<br>
   call i8* @scc_binder(i1 %c)<br>
   %ret = call i8* @ret_nonnull()<br>
   ret i8* %ret<br>
@@ -45,13 +64,17 @@ define i8* @test3(i1 %c) {<br>
 ; nonnull if neither can ever return null.  (In this case, they<br>
 ; just never return period.)<br>
 define i8* @test4_helper() {<br>
-; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test4_helper<br>
+; CHECK-LABEL: define {{[^@]+}}@test4_helper()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %ret = call i8* @test4()<br>
   ret i8* %ret<br>
 }<br>
<br>
 define i8* @test4() {<br>
-; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test4<br>
+; CHECK-LABEL: define {{[^@]+}}@test4()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %ret = call i8* @test4_helper()<br>
   ret i8* %ret<br>
 }<br>
@@ -59,7 +82,14 @@ define i8* @test4() {<br>
 ; Given a mutual recursive set of functions which *can* return null<br>
 ; make sure we haven't marked them as nonnull.<br>
 define i8* @test5_helper(i1 %c) {<br>
-; ATTRIBUTOR: define noalias align 536870912 i8* @test5_helper<br>
+; CHECK-LABEL: define {{[^@]+}}@test5_helper<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]<br>
+; CHECK:       rec:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    ret i8* null<br>
+;<br>
   br i1 %c, label %rec, label %end<br>
 rec:<br>
   %ret = call i8* @test5(i1 %c)<br>
@@ -69,15 +99,26 @@ end:<br>
 }<br>
<br>
 define i8* @test5(i1 %c) {<br>
-; ATTRIBUTOR: define noalias align 536870912 i8* @test5<br>
+; CHECK-LABEL: define {{[^@]+}}@test5<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    ret i8* null<br>
+;<br>
   %ret = call i8* @test5_helper(i1 %c)<br>
   ret i8* %ret<br>
 }<br>
<br>
 ; Local analysis, but going through a self recursive phi<br>
-; ATTRIBUTOR: Function Attrs: noreturn<br>
-; ATTRIBUTOR: define noalias nonnull align 536870912 dereferenceable(4294967295) i8* @test6a()<br>
+; CHECK: Function Attrs: noreturn<br>
 define i8* @test6a() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6a()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[RET:%.*]] = call i8* @ret_nonnull()<br>
+; CHECK-NEXT:    br label [[LOOP:%.*]]<br>
+; CHECK:       loop:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %ret = call i8* @ret_nonnull()<br>
   br label %loop<br>
@@ -88,8 +129,18 @@ exit:<br>
   ret i8* %phi<br>
 }<br>
<br>
-; ATTRIBUTOR: define nonnull i8* @test6b(i1 %c)<br>
 define i8* @test6b(i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6b<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[RET:%.*]] = call nonnull i8* @ret_nonnull()<br>
+; CHECK-NEXT:    br label [[LOOP:%.*]]<br>
+; CHECK:       loop:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi i8* [ [[RET]], [[ENTRY:%.*]] ], [ [[PHI]], [[LOOP]] ]<br>
+; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    ret i8* [[PHI]]<br>
+;<br>
 entry:<br>
   %ret = call i8* @ret_nonnull()<br>
   br label %loop<br>
@@ -100,28 +151,44 @@ exit:<br>
   ret i8* %phi<br>
 }<br>
<br>
-; ATTRIBUTOR: define i8* @test7<br>
 define i8* @test7(i8* %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test7<br>
+; CHECK-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 0<br>
+; CHECK-NEXT:    ret i8* [[B]]<br>
+;<br>
   %b = getelementptr inbounds i8, i8* %a, i64 0<br>
   ret i8* %b<br>
 }<br>
<br>
-; ATTRIBUTOR: define nonnull i8* @test8<br>
 define i8* @test8(i8* %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test8<br>
+; CHECK-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 1<br>
+; CHECK-NEXT:    ret i8* [[B]]<br>
+;<br>
   %b = getelementptr inbounds i8, i8* %a, i64 1<br>
   ret i8* %b<br>
 }<br>
<br>
-; ATTRIBUTOR: define i8* @test9<br>
 define i8* @test9(i8* %a, i64 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test9<br>
+; CHECK-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]<br>
+; CHECK-NEXT:    ret i8* [[B]]<br>
+;<br>
   %b = getelementptr inbounds i8, i8* %a, i64 %n<br>
   ret i8* %b<br>
 }<br>
<br>
 declare void @llvm.assume(i1)<br>
-; ATTRIBUTOR_OPM: define i8* @test10<br>
-; ATTRIBUTOR_NPM: define nonnull i8* @test10<br>
 define i8* @test10(i8* %a, i64 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test10<br>
+; CHECK-SAME: (i8* nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 undef)<br>
+; CHECK-NEXT:    [[B:%.*]] = getelementptr inbounds i8, i8* [[A]], i64 [[N]]<br>
+; CHECK-NEXT:    ret i8* [[B]]<br>
+;<br>
   %cmp = icmp ne i64 %n, 0<br>
   call void @llvm.assume(i1 %cmp)<br>
   %b = getelementptr inbounds i8, i8* %a, i64 %n<br>
@@ -133,8 +200,18 @@ define i8* @test10(i8* %a, i64 %n) {<br>
 ;   return p? p: nonnull();<br>
 ; }<br>
 ; FIXME: missing nonnull<br>
-; ATTRIBUTOR: define i8* @test11<br>
 define i8* @test11(i8*) local_unnamed_addr {<br>
+; CHECK-LABEL: define {{[^@]+}}@test11<br>
+; CHECK-SAME: (i8* [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i8* [[TMP0]], null<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = tail call i8* @ret_nonnull()<br>
+; CHECK-NEXT:    br label [[TMP5]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = phi i8* [ [[TMP4]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; CHECK-NEXT:    ret i8* [[TMP6]]<br>
+;<br>
   %2 = icmp eq i8* %0, null<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -151,8 +228,11 @@ define i8* @test11(i8*) local_unnamed_addr {<br>
 ; Simple CallSite Test<br>
 declare void @test12_helper(i8*)<br>
 define void @test12(i8* nonnull %a) {<br>
-; ATTRIBUTOR: define void @test12(i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT: tail call void @test12_helper(i8* nonnull %a)<br>
+; CHECK-LABEL: define {{[^@]+}}@test12<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]])<br>
+; CHECK-NEXT:    tail call void @test12_helper(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @test12_helper(i8* %a)<br>
   ret void<br>
 }<br>
@@ -161,6 +241,13 @@ define void @test12(i8* nonnull %a) {<br>
 ; Simple Argument Tests<br>
 declare i8* @unknown()<br>
 define void @test13_helper() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test13_helper()<br>
+; CHECK-NEXT:    [[NONNULLPTR:%.*]] = tail call nonnull i8* @ret_nonnull()<br>
+; CHECK-NEXT:    [[MAYBENULLPTR:%.*]] = tail call i8* @unknown()<br>
+; CHECK-NEXT:    tail call void @test13(i8* noalias nofree nonnull readnone [[NONNULLPTR]], i8* noalias nofree nonnull readnone [[NONNULLPTR]], i8* noalias nofree readnone [[MAYBENULLPTR]])<br>
+; CHECK-NEXT:    tail call void @test13(i8* noalias nofree nonnull readnone [[NONNULLPTR]], i8* noalias nofree readnone [[MAYBENULLPTR]], i8* noalias nofree nonnull readnone [[NONNULLPTR]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %nonnullptr = tail call i8* @ret_nonnull()<br>
   %maybenullptr = tail call i8* @unknown()<br>
   tail call void @test13(i8* %nonnullptr, i8* %nonnullptr, i8* %maybenullptr)<br>
@@ -168,7 +255,20 @@ define void @test13_helper() {<br>
   ret void<br>
 }<br>
 define internal void @test13(i8* %a, i8* %b, i8* %c) {<br>
-; ATTRIBUTOR: define internal void @test13(i8* noalias nocapture nofree nonnull readnone %a, i8* noalias nocapture nofree readnone %b, i8* noalias nocapture nofree readnone %c)<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test13<br>
+; IS__TUNIT____-SAME: (i8* noalias nocapture nofree nonnull readnone [[A:%.*]], i8* noalias nocapture nofree readnone [[B:%.*]], i8* noalias nocapture nofree readnone [[C:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[A]])<br>
+; IS__TUNIT____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[B]])<br>
+; IS__TUNIT____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[C]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test13<br>
+; IS__CGSCC____-SAME: (i8* nocapture nofree readnone [[A:%.*]], i8* nocapture nofree readnone [[B:%.*]], i8* nocapture nofree readnone [[C:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[A]])<br>
+; IS__CGSCC____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[B]])<br>
+; IS__CGSCC____-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[C]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   call void @use_i8_ptr(i8* %a)<br>
   call void @use_i8_ptr(i8* %b)<br>
   call void @use_i8_ptr(i8* %c)<br>
@@ -191,7 +291,27 @@ declare nonnull i8* @nonnull()<br>
<br>
 define internal i32* @f1(i32* %arg) {<br>
 ; FIXME: missing nonnull It should be nonnull @f1(i32* nonnull readonly %arg)<br>
-; ATTRIBUTOR: define internal nonnull i32* @f1(i32* nofree readonly %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@f1<br>
+; CHECK-SAME: (i32* nofree readonly [[ARG:%.*]])<br>
+; CHECK-NEXT:  bb:<br>
+; CHECK-NEXT:    [[TMP:%.*]] = icmp eq i32* [[ARG]], null<br>
+; CHECK-NEXT:    br i1 [[TMP]], label [[BB9:%.*]], label [[BB1:%.*]]<br>
+; CHECK:       bb1:<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[ARG]], align 4<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP2]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]]<br>
+; CHECK:       bb4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = getelementptr inbounds i32, i32* [[ARG]], i64 1<br>
+; CHECK-NEXT:    [[TMP5B:%.*]] = tail call nonnull i32* @f3(i32* nofree nonnull readonly [[TMP5]])<br>
+; CHECK-NEXT:    [[TMP5C:%.*]] = getelementptr inbounds i32, i32* [[TMP5B]], i64 -1<br>
+; CHECK-NEXT:    br label [[BB9]]<br>
+; CHECK:       bb6:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = tail call nonnull i32* @f2(i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG]])<br>
+; CHECK-NEXT:    ret i32* [[TMP7]]<br>
+; CHECK:       bb9:<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = phi i32* [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to i32*), [[BB:%.*]] ]<br>
+; CHECK-NEXT:    ret i32* [[TMP10]]<br>
+;<br>
<br>
 bb:<br>
   %tmp = icmp eq i32* %arg, null<br>
@@ -204,13 +324,11 @@ bb1:                                              ; preds = %bb<br>
<br>
 bb4:                                              ; preds = %bb1<br>
   %tmp5 = getelementptr inbounds i32, i32* %arg, i64 1<br>
-; ATTRIBUTOR: %tmp5b = tail call nonnull i32* @f3(i32* nofree nonnull readonly %tmp5)<br>
   %tmp5b = tail call i32* @f3(i32* %tmp5)<br>
   %tmp5c = getelementptr inbounds i32, i32* %tmp5b, i64 -1<br>
   br label %bb9<br>
<br>
 bb6:                                              ; preds = %bb1<br>
-; ATTRIBUTOR: %tmp7 = tail call nonnull i32* @f2(i32* nofree nonnull readonly align 4 dereferenceable(4) %arg)<br>
   %tmp7 = tail call i32* @f2(i32* %arg)<br>
   ret i32* %tmp7<br>
<br>
@@ -220,26 +338,38 @@ bb9:                                              ; preds = %bb4, %bb<br>
 }<br>
<br>
 define internal i32* @f2(i32* %arg) {<br>
-; ATTRIBUTOR: define internal nonnull i32* @f2(i32* nofree nonnull readonly align 4 dereferenceable(4) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@f2<br>
+; CHECK-SAME: (i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]])<br>
+; CHECK-NEXT:  bb:<br>
+; CHECK-NEXT:    [[TMP:%.*]] = tail call nonnull i32* @f1(i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG]])<br>
+; CHECK-NEXT:    ret i32* [[TMP]]<br>
+;<br>
 bb:<br>
-; ATTRIBUTOR:   %tmp = tail call nonnull i32* @f1(i32* nofree nonnull readonly align 4 dereferenceable(4) %arg)<br>
   %tmp = tail call i32* @f1(i32* %arg)<br>
   ret i32* %tmp<br>
 }<br>
<br>
 define dso_local noalias i32* @f3(i32* %arg) {<br>
 ; FIXME: missing nonnull. It should be nonnull @f3(i32* nonnull readonly %arg)<br>
-; ATTRIBUTOR: define dso_local noalias nonnull i32* @f3(i32* nofree readonly %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@f3<br>
+; CHECK-SAME: (i32* nofree readonly [[ARG:%.*]])<br>
+; CHECK-NEXT:  bb:<br>
+; CHECK-NEXT:    [[TMP:%.*]] = call nonnull i32* @f1(i32* nofree readonly [[ARG]])<br>
+; CHECK-NEXT:    ret i32* [[TMP]]<br>
+;<br>
 bb:<br>
 ; FIXME: missing nonnull. It should be @f1(i32* nonnull readonly %arg)<br>
-; ATTRIBUTOR:   %tmp = call nonnull i32* @f1(i32* nofree readonly %arg)<br>
   %tmp = call i32* @f1(i32* %arg)<br>
   ret i32* %tmp<br>
 }<br>
<br>
 ; TEST 15<br>
 define void @f15(i8* %arg) {<br>
-; ATTRIBUTOR:   tail call void @use1(i8* nonnull dereferenceable(4) %arg)<br>
+; CHECK-LABEL: define {{[^@]+}}@f15<br>
+; CHECK-SAME: (i8* nonnull dereferenceable(4) [[ARG:%.*]])<br>
+; CHECK-NEXT:    tail call void @use1(i8* nonnull dereferenceable(4) [[ARG]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
<br>
   tail call void @use1(i8* dereferenceable(4) %arg)<br>
   ret void<br>
@@ -256,7 +386,17 @@ declare void @fun3(i8*, i8*, i8*) #1<br>
 ;   fun2(nonnull %a, %b)<br>
 ; We can say that %a is nonnull but %b is not.<br>
 define void @f16(i8* %a, i8 * %b, i8 %c) {<br>
-; ATTRIBUTOR: define void @f16(i8* nonnull %a, i8* %b, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@f16<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    tail call void @fun2(i8* nonnull [[A]], i8* nonnull [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    tail call void @fun2(i8* nonnull [[A]], i8* [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp = icmp eq i8 %c, 0<br>
   br i1 %cmp, label %if.then, label %if.else<br>
 if.then:<br>
@@ -274,7 +414,20 @@ if.else:<br>
 ; fun1(nonnull %a)<br>
 ; We can say that %a is nonnull<br>
 define void @f17(i8* %a, i8 %c) {<br>
-; ATTRIBUTOR: define void @f17(i8* nonnull %a, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@f17<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    tail call void @fun0()<br>
+; CHECK-NEXT:    br label [[CONT:%.*]]<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    tail call void @fun0()<br>
+; CHECK-NEXT:    br label [[CONT]]<br>
+; CHECK:       cont:<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp = icmp eq i8 %c, 0<br>
   br i1 %cmp, label %if.then, label %if.else<br>
 if.then:<br>
@@ -299,7 +452,29 @@ cont:<br>
 ; fun1(nonnull %a)<br>
<br>
 define void @f18(i8* %a, i8* %b, i8 %c) {<br>
-; ATTRIBUTOR: define void @f18(i8* nonnull %a, i8* %b, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@f18<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    tail call void @fun0()<br>
+; CHECK-NEXT:    br label [[CONT:%.*]]<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    tail call void @fun0()<br>
+; CHECK-NEXT:    br label [[CONT]]<br>
+; CHECK:       cont:<br>
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[C]], 1<br>
+; CHECK-NEXT:    br i1 [[CMP2]], label [[CONT_THEN:%.*]], label [[CONT_ELSE:%.*]]<br>
+; CHECK:       cont.then:<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[B]])<br>
+; CHECK-NEXT:    br label [[CONT2:%.*]]<br>
+; CHECK:       cont.else:<br>
+; CHECK-NEXT:    tail call void @fun0()<br>
+; CHECK-NEXT:    br label [[CONT2]]<br>
+; CHECK:       cont2:<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %cmp1 = icmp eq i8 %c, 0<br>
   br i1 %cmp1, label %if.then, label %if.else<br>
 if.then:<br>
@@ -325,7 +500,20 @@ cont2:<br>
 ; TEST 19: Loop<br>
<br>
 define void @f19(i8* %a, i8* %b, i8 %c) {<br>
-; ATTRIBUTOR: define void @f19(i8* %a, i8* nonnull %b, i8 %c)<br>
+; CHECK-LABEL: define {{[^@]+}}@f19<br>
+; CHECK-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8 [[C:%.*]])<br>
+; CHECK-NEXT:    br label [[LOOP_HEADER:%.*]]<br>
+; CHECK:       loop.header:<br>
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i8 [[C]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP_BODY:%.*]], label [[LOOP_EXIT:%.*]]<br>
+; CHECK:       loop.body:<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[B]])<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    br label [[LOOP_HEADER]]<br>
+; CHECK:       loop.exit:<br>
+; CHECK-NEXT:    tail call void @fun1(i8* nonnull [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   br label %loop.header<br>
 loop.header:<br>
   %cmp2 = icmp eq i8 %c, 0<br>
@@ -354,10 +542,12 @@ declare i8 @use1safecall(i8* %x) readonly nounwind ; readonly+nounwind guarantee<br>
 ; Can't extend non-null to parent for any argument because the 2nd call is not guaranteed to execute.<br>
<br>
 define void @parent1(i8* %a, i8* %b, i8* %c) {<br>
-; ATTRIBUTOR-LABEL: @parent1(i8* %a, i8* %b, i8* %c)<br>
-; ATTRIBUTOR-NEXT:    call void @use3(i8* %c, i8* %a, i8* %b)<br>
-; ATTRIBUTOR-NEXT:    call void @use3nonnull(i8* nonnull %b, i8* nonnull %c, i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@parent1<br>
+; CHECK-SAME: (i8* [[A:%.*]], i8* [[B:%.*]], i8* [[C:%.*]])<br>
+; CHECK-NEXT:    call void @use3(i8* [[C]], i8* [[A]], i8* [[B]])<br>
+; CHECK-NEXT:    call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use3(i8* %c, i8* %a, i8* %b)<br>
   call void @use3nonnull(i8* %b, i8* %c, i8* %a)<br>
   ret void<br>
@@ -366,12 +556,13 @@ define void @parent1(i8* %a, i8* %b, i8* %c) {<br>
 ; Extend non-null to parent for all arguments.<br>
<br>
 define void @parent2(i8* %a, i8* %b, i8* %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@parent2<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]])<br>
+; CHECK-NEXT:    call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])<br>
+; CHECK-NEXT:    call void @use3(i8* nonnull [[C]], i8* nonnull [[A]], i8* nonnull [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
<br>
-; ATTRIBUTOR-LABEL: @parent2(i8* nonnull %a, i8* nonnull %b, i8* nonnull %c)<br>
-; ATTRIBUTOR-NEXT:    call void @use3nonnull(i8* nonnull %b, i8* nonnull %c, i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    call void @use3(i8* nonnull %c, i8* nonnull %a, i8* nonnull %b)<br>
-<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
   call void @use3nonnull(i8* %b, i8* %c, i8* %a)<br>
   call void @use3(i8* %c, i8* %a, i8* %b)<br>
   ret void<br>
@@ -380,12 +571,13 @@ define void @parent2(i8* %a, i8* %b, i8* %c) {<br>
 ; Extend non-null to parent for 1st argument.<br>
<br>
 define void @parent3(i8* %a, i8* %b, i8* %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@parent3<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8* [[C:%.*]])<br>
+; CHECK-NEXT:    call void @use1nonnull(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    call void @use3(i8* [[C]], i8* [[B]], i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
<br>
-; ATTRIBUTOR-LABEL: @parent3(i8* nonnull %a, i8* %b, i8* %c)<br>
-; ATTRIBUTOR-NEXT:    call void @use1nonnull(i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    call void @use3(i8* %c, i8* %b, i8* nonnull %a)<br>
-<br>
-; ATTRIBUTOR-NEXT:  ret void<br>
<br>
   call void @use1nonnull(i8* %a)<br>
   call void @use3(i8* %c, i8* %b, i8* %a)<br>
@@ -395,17 +587,15 @@ define void @parent3(i8* %a, i8* %b, i8* %c) {<br>
 ; Extend non-null to parent for last 2 arguments.<br>
<br>
 define void @parent4(i8* %a, i8* %b, i8* %c) {<br>
-; CHECK-LABEL: @parent4(i8* %a, i8* nonnull %b, i8* nonnull %c)<br>
-; CHECK-NEXT:    call void @use2nonnull(i8* %c, i8* %b)<br>
-; CHECK-NEXT:    call void @use2(i8* %a, i8* %c)<br>
-; CHECK-NEXT:    call void @use1(i8* %b)<br>
+; CHECK-LABEL: define {{[^@]+}}@parent4<br>
+; CHECK-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]])<br>
+; CHECK-NEXT:    call void @use2nonnull(i8* nonnull [[C]], i8* nonnull [[B]])<br>
+; CHECK-NEXT:    call void @use2(i8* [[A]], i8* nonnull [[C]])<br>
+; CHECK-NEXT:    call void @use1(i8* nonnull [[B]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
<br>
-; ATTRIBUTOR-LABEL: @parent4(i8* %a, i8* nonnull %b, i8* nonnull %c)<br>
-; ATTRIBUTOR-NEXT:    call void @use2nonnull(i8* nonnull %c, i8* nonnull %b)<br>
-; ATTRIBUTOR-NEXT:    call void @use2(i8* %a, i8* nonnull %c)<br>
-; ATTRIBUTOR-NEXT:    call void @use1(i8* nonnull %b)<br>
<br>
-; ATTRIBUTOR: ret void<br>
<br>
   call void @use2nonnull(i8* %c, i8* %b)<br>
   call void @use2(i8* %a, i8* %c)<br>
@@ -418,13 +608,15 @@ define void @parent4(i8* %a, i8* %b, i8* %c) {<br>
 ; because it would incorrectly propagate the wrong information to its callers.<br>
<br>
 define void @parent5(i8* %a, i1 %a_is_notnull) {<br>
-; ATTRIBUTOR: @parent5(i8* %a, i1 %a_is_notnull)<br>
-; ATTRIBUTOR-NEXT:    br i1 %a_is_notnull, label %t, label %f<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    call void @use1nonnull(i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
-; ATTRIBUTOR:       f:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@parent5<br>
+; CHECK-SAME: (i8* [[A:%.*]], i1 [[A_IS_NOTNULL:%.*]])<br>
+; CHECK-NEXT:    br i1 [[A_IS_NOTNULL]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    call void @use1nonnull(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
<br>
   br i1 %a_is_notnull, label %t, label %f<br>
 t:<br>
@@ -438,10 +630,12 @@ f:<br>
 ; The volatile load can't trap, so we can guarantee that we'll get to the call.<br>
<br>
 define i8 @parent6(i8* %a, i8* %b) {<br>
-; ATTRIBUTOR-LABEL: @parent6(i8* nonnull %a, i8* %b)<br>
-; ATTRIBUTOR-NEXT:    [[C:%.*]] = load volatile i8, i8* %b<br>
-; ATTRIBUTOR-NEXT:    call void @use1nonnull(i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    ret i8 [[C]]<br>
+; CHECK-LABEL: define {{[^@]+}}@parent6<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]])<br>
+; CHECK-NEXT:    [[C:%.*]] = load volatile i8, i8* [[B]]<br>
+; CHECK-NEXT:    call void @use1nonnull(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i8 [[C]]<br>
+;<br>
<br>
   %c = load volatile i8, i8* %b<br>
   call void @use1nonnull(i8* %a)<br>
@@ -451,14 +645,14 @@ define i8 @parent6(i8* %a, i8* %b) {<br>
 ; The nonnull callsite is guaranteed to execute, so the argument must be nonnull throughout the parent.<br>
<br>
 define i8 @parent7(i8* %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@parent7<br>
+; CHECK-SAME: (i8* nonnull [[A:%.*]])<br>
+; CHECK-NEXT:    [[RET:%.*]] = call i8 @use1safecall(i8* nonnull readonly [[A]])<br>
+; CHECK-NEXT:    call void @use1nonnull(i8* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i8 [[RET]]<br>
+;<br>
<br>
<br>
-; ATTRIBUTOR-LABEL: @parent7(i8* nonnull %a)<br>
-; ATTRIBUTOR-NEXT:    [[RET:%.*]] = call i8 @use1safecall(i8* nonnull readonly %a)<br>
-; ATTRIBUTOR-NEXT:    call void @use1nonnull(i8* nonnull %a)<br>
-<br>
-; ATTRIBUTOR-NEXT: ret i8 [[RET]]<br>
-<br>
   %ret = call i8 @use1safecall(i8* %a)<br>
   call void @use1nonnull(i8* %a)<br>
   ret i8 %ret<br>
@@ -469,17 +663,32 @@ define i8 @parent7(i8* %a) {<br>
 declare i32 @esfp(...)<br>
<br>
 define i1 @parent8(i8* %a, i8* %bogus1, i8* %b) personality i8* bitcast (i32 (...)* @esfp to i8*){<br>
-; ATTRIBUTOR-LABEL: @parent8(i8* nonnull %a, i8* nocapture nofree readnone %bogus1, i8* nonnull %b)<br>
-; ATTRIBUTOR-NEXT:  entry:<br>
-; ATTRIBUTOR-NEXT:    invoke void @use2nonnull(i8* nonnull %a, i8* nonnull %b)<br>
-; ATTRIBUTOR-NEXT:    to label %cont unwind label %exc<br>
-; ATTRIBUTOR:       cont:<br>
-; ATTRIBUTOR-NEXT:    [[NULL_CHECK:%.*]] = icmp eq i8* %b, null<br>
-; ATTRIBUTOR-NEXT:    ret i1 [[NULL_CHECK]]<br>
-; ATTRIBUTOR:       exc:<br>
-; ATTRIBUTOR-NEXT:    [[LP:%.*]] = landingpad { i8*, i32 }<br>
-; ATTRIBUTOR-NEXT:    filter [0 x i8*] zeroinitializer<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@parent8<br>
+; NOT_CGSCC_OPM-SAME: (i8* nonnull [[A:%.*]], i8* nocapture nofree readnone [[BOGUS1:%.*]], i8* nonnull [[B:%.*]]) #4 personality i8* bitcast (i32 (...)* @esfp to i8*)<br>
+; NOT_CGSCC_OPM-NEXT:  entry:<br>
+; NOT_CGSCC_OPM-NEXT:    invoke void @use2nonnull(i8* nonnull [[A]], i8* nonnull [[B]])<br>
+; NOT_CGSCC_OPM-NEXT:    to label [[CONT:%.*]] unwind label [[EXC:%.*]]<br>
+; NOT_CGSCC_OPM:       cont:<br>
+; NOT_CGSCC_OPM-NEXT:    [[NULL_CHECK:%.*]] = icmp eq i8* [[B]], null<br>
+; NOT_CGSCC_OPM-NEXT:    ret i1 [[NULL_CHECK]]<br>
+; NOT_CGSCC_OPM:       exc:<br>
+; NOT_CGSCC_OPM-NEXT:    [[LP:%.*]] = landingpad { i8*, i32 }<br>
+; NOT_CGSCC_OPM-NEXT:    filter [0 x i8*] zeroinitializer<br>
+; NOT_CGSCC_OPM-NEXT:    unreachable<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@parent8<br>
+; IS__CGSCC_OPM-SAME: (i8* nonnull [[A:%.*]], i8* nocapture nofree readnone [[BOGUS1:%.*]], i8* nonnull [[B:%.*]]) #5 personality i8* bitcast (i32 (...)* @esfp to i8*)<br>
+; IS__CGSCC_OPM-NEXT:  entry:<br>
+; IS__CGSCC_OPM-NEXT:    invoke void @use2nonnull(i8* nonnull [[A]], i8* nonnull [[B]])<br>
+; IS__CGSCC_OPM-NEXT:    to label [[CONT:%.*]] unwind label [[EXC:%.*]]<br>
+; IS__CGSCC_OPM:       cont:<br>
+; IS__CGSCC_OPM-NEXT:    [[NULL_CHECK:%.*]] = icmp eq i8* [[B]], null<br>
+; IS__CGSCC_OPM-NEXT:    ret i1 [[NULL_CHECK]]<br>
+; IS__CGSCC_OPM:       exc:<br>
+; IS__CGSCC_OPM-NEXT:    [[LP:%.*]] = landingpad { i8*, i32 }<br>
+; IS__CGSCC_OPM-NEXT:    filter [0 x i8*] zeroinitializer<br>
+; IS__CGSCC_OPM-NEXT:    unreachable<br>
+;<br>
<br>
 entry:<br>
   invoke void @use2nonnull(i8* %a, i8* %b)<br>
@@ -495,83 +704,138 @@ exc:<br>
   unreachable<br>
 }<br>
<br>
-; ATTRIBUTOR: define nonnull i32* @gep1(<br>
 define i32* @gep1(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@gep1<br>
+; CHECK-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1<br>
+; CHECK-NEXT:    ret i32* [[Q]]<br>
+;<br>
   %q = getelementptr inbounds i32, i32* %p, i32 1<br>
   ret i32* %q<br>
 }<br>
<br>
 define i32* @gep1_no_null_opt(i32* %p) #0 {<br>
 ; Should't be able to derive nonnull based on gep.<br>
-; ATTRIBUTOR: define i32* @gep1_no_null_opt(<br>
+; CHECK-LABEL: define {{[^@]+}}@gep1_no_null_opt<br>
+; CHECK-SAME: (i32* nofree readnone "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[Q:%.*]] = getelementptr inbounds i32, i32* [[P]], i32 1<br>
+; CHECK-NEXT:    ret i32* [[Q]]<br>
+;<br>
   %q = getelementptr inbounds i32, i32* %p, i32 1<br>
   ret i32* %q<br>
 }<br>
<br>
-; ATTRIBUTOR: define i32 addrspace(3)* @gep2(<br>
 define i32 addrspace(3)* @gep2(i32 addrspace(3)* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@gep2<br>
+; CHECK-SAME: (i32 addrspace(3)* nofree readnone "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    [[Q:%.*]] = getelementptr inbounds i32, i32 addrspace(3)* [[P]], i32 1<br>
+; CHECK-NEXT:    ret i32 addrspace(3)* [[Q]]<br>
+;<br>
   %q = getelementptr inbounds i32, i32 addrspace(3)* %p, i32 1<br>
   ret i32 addrspace(3)* %q<br>
 }<br>
<br>
 ; FIXME: We should propagate dereferenceable here but *not* nonnull<br>
-; ATTRIBUTOR: define dereferenceable_or_null(4) i32 addrspace(3)* @as(i32 addrspace(3)* nofree readnone returned dereferenceable(4) dereferenceable_or_null(4) %p)<br>
 define i32 addrspace(3)* @as(i32 addrspace(3)* dereferenceable(4) %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@as<br>
+; CHECK-SAME: (i32 addrspace(3)* nofree readnone returned dereferenceable(4) dereferenceable_or_null(4) "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    ret i32 addrspace(3)* [[P]]<br>
+;<br>
   ret i32 addrspace(3)* %p<br>
 }<br>
<br>
-; ATTRIBUTOR-NOT: @g2()<br>
+; CHECK-NOT: @g2()<br>
 define internal i32* @g2() {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@g2()<br>
+; IS__CGSCC____-NEXT:    ret i32* inttoptr (i64 4 to i32*)<br>
+;<br>
   ret i32* inttoptr (i64 4 to i32*)<br>
 }<br>
<br>
-; ATTRIBUTOR: define nonnull align 4 i32* @g1()<br>
-; ATTRIBUTOR:   ret i32* inttoptr (i64 4 to i32*)<br>
 define i32* @g1() {<br>
- %c = call i32* @g2()<br>
+; CHECK-LABEL: define {{[^@]+}}@g1()<br>
+; CHECK-NEXT:    ret i32* inttoptr (i64 4 to i32*)<br>
+;<br>
+  %c = call i32* @g2()<br>
   ret i32* %c<br>
 }<br>
<br>
 declare void @use_i32_ptr(i32* readnone nocapture) nounwind<br>
-; ATTRIBUTOR: define internal void @called_by_weak(i32* noalias nocapture nonnull readnone %a)<br>
 define internal void @called_by_weak(i32* %a) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@called_by_weak<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nonnull readnone [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@called_by_weak<br>
+; IS__CGSCC____-SAME: (i32* nocapture nonnull readnone [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   call void @use_i32_ptr(i32* %a)<br>
   ret void<br>
 }<br>
<br>
 ; Check we do not annotate the function interface of this weak function.<br>
-; ATTRIBUTOR: define weak_odr void @weak_caller(i32* nonnull %a)<br>
 define weak_odr void @weak_caller(i32* nonnull %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@weak_caller<br>
+; CHECK-SAME: (i32* nonnull [[A:%.*]])<br>
+; CHECK-NEXT:    call void @called_by_weak(i32* noalias nonnull readnone [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @called_by_weak(i32* %a)<br>
   ret void<br>
 }<br>
<br>
 ; Expect nonnull<br>
-; ATTRIBUTOR: define internal void @control(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) %a)<br>
 define internal void @control(i32* dereferenceable(4) %a) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@control<br>
+; IS__TUNIT____-SAME: (i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @use_i32_ptr(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@control<br>
+; IS__CGSCC____-SAME: (i32* nocapture nonnull readnone align 16 dereferenceable(8) [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @use_i32_ptr(i32* noalias nocapture nonnull readnone align 16 dereferenceable(8) [[A]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   call void @use_i32_ptr(i32* %a)<br>
   ret void<br>
 }<br>
 ; Avoid nonnull as we do not touch naked functions<br>
-; ATTRIBUTOR: define internal void @naked(i32* dereferenceable(4) %a)<br>
 define internal void @naked(i32* dereferenceable(4) %a) naked {<br>
+; CHECK-LABEL: define {{[^@]+}}@naked<br>
+; CHECK-SAME: (i32* dereferenceable(4) [[A:%.*]])<br>
+; CHECK-NEXT:    call void @use_i32_ptr(i32* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i32_ptr(i32* %a)<br>
   ret void<br>
 }<br>
 ; Avoid nonnull as we do not touch optnone<br>
-; ATTRIBUTOR: define internal void @optnone(i32* dereferenceable(4) %a)<br>
 define internal void @optnone(i32* dereferenceable(4) %a) optnone noinline {<br>
+; CHECK-LABEL: define {{[^@]+}}@optnone<br>
+; CHECK-SAME: (i32* dereferenceable(4) [[A:%.*]])<br>
+; CHECK-NEXT:    call void @use_i32_ptr(i32* [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @use_i32_ptr(i32* %a)<br>
   ret void<br>
 }<br>
 define void @make_live(i32* nonnull dereferenceable(8) %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@make_live<br>
+; CHECK-SAME: (i32* nonnull align 16 dereferenceable(8) [[A:%.*]])<br>
+; CHECK-NEXT:    call void @naked(i32* nonnull align 16 dereferenceable(8) [[A]])<br>
+; CHECK-NEXT:    call void @control(i32* noalias nonnull readnone align 16 dereferenceable(8) [[A]])<br>
+; CHECK-NEXT:    call void @optnone(i32* nonnull align 16 dereferenceable(8) [[A]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @naked(i32* nonnull dereferenceable(8) align 16 %a)<br>
   call void @control(i32* nonnull dereferenceable(8) align 16 %a)<br>
   call void @optnone(i32* nonnull dereferenceable(8) align 16 %a)<br>
   ret void<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
<br>
 ;int f(int *u, int n){<br>
 ;  for(int i = 0;i<n;i++){<br>
@@ -583,20 +847,20 @@ declare void @h(i32*) willreturn nounwind<br>
 declare i32 @g(i32*) willreturn nounwind<br>
 define i32 @nonnull_exec_ctx_1(i32* %a, i32 %b) {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1<br>
-; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])<br>
-; ATTRIBUTOR-NEXT:  en:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
-; ATTRIBUTOR:       ex:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[TMP5]]<br>
-; ATTRIBUTOR:       hd:<br>
-; ATTRIBUTOR-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]<br>
-; ATTRIBUTOR-NEXT:    tail call void @h(i32* [[A]])<br>
-; ATTRIBUTOR-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
-; ATTRIBUTOR-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1<br>
+; CHECK-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])<br>
+; CHECK-NEXT:  en:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
+; CHECK:       ex:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i32 [[TMP5]]<br>
+; CHECK:       hd:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]<br>
+; CHECK-NEXT:    tail call void @h(i32* [[A]])<br>
+; CHECK-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
 ;<br>
 en:<br>
   %tmp3 = icmp eq i32 %b, 0<br>
@@ -616,22 +880,22 @@ hd:<br>
<br>
 define i32 @nonnull_exec_ctx_1b(i32* %a, i32 %b) {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b<br>
-; ATTRIBUTOR-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])<br>
-; ATTRIBUTOR-NEXT:  en:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
-; ATTRIBUTOR:       ex:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[TMP5]]<br>
-; ATTRIBUTOR:       hd:<br>
-; ATTRIBUTOR-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]<br>
-; ATTRIBUTOR-NEXT:    tail call void @h(i32* [[A]])<br>
-; ATTRIBUTOR-NEXT:    br label [[HD2]]<br>
-; ATTRIBUTOR:       hd2:<br>
-; ATTRIBUTOR-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
-; ATTRIBUTOR-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_1b<br>
+; CHECK-SAME: (i32* [[A:%.*]], i32 [[B:%.*]])<br>
+; CHECK-NEXT:  en:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
+; CHECK:       ex:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i32 [[TMP5]]<br>
+; CHECK:       hd:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]<br>
+; CHECK-NEXT:    tail call void @h(i32* [[A]])<br>
+; CHECK-NEXT:    br label [[HD2]]<br>
+; CHECK:       hd2:<br>
+; CHECK-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
 ;<br>
 en:<br>
   %tmp3 = icmp eq i32 %b, 0<br>
@@ -654,20 +918,20 @@ hd2:<br>
<br>
 define i32 @nonnull_exec_ctx_2(i32* %a, i32 %b) willreturn nounwind {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2<br>
-; ATTRIBUTOR-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])<br>
-; ATTRIBUTOR-NEXT:  en:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
-; ATTRIBUTOR:       ex:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[TMP5]]<br>
-; ATTRIBUTOR:       hd:<br>
-; ATTRIBUTOR-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]<br>
-; ATTRIBUTOR-NEXT:    tail call void @h(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
-; ATTRIBUTOR-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2<br>
+; CHECK-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])<br>
+; CHECK-NEXT:  en:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
+; CHECK:       ex:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i32 [[TMP5]]<br>
+; CHECK:       hd:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD]] ], [ 0, [[EN:%.*]] ]<br>
+; CHECK-NEXT:    tail call void @h(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
 ;<br>
 en:<br>
   %tmp3 = icmp eq i32 %b, 0<br>
@@ -687,22 +951,22 @@ hd:<br>
<br>
 define i32 @nonnull_exec_ctx_2b(i32* %a, i32 %b) willreturn nounwind {<br>
 ;<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b<br>
-; ATTRIBUTOR-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])<br>
-; ATTRIBUTOR-NEXT:  en:<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
-; ATTRIBUTOR:       ex:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    ret i32 [[TMP5]]<br>
-; ATTRIBUTOR:       hd:<br>
-; ATTRIBUTOR-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]<br>
-; ATTRIBUTOR-NEXT:    tail call void @h(i32* nonnull [[A]])<br>
-; ATTRIBUTOR-NEXT:    br label [[HD2]]<br>
-; ATTRIBUTOR:       hd2:<br>
-; ATTRIBUTOR-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
-; ATTRIBUTOR-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_exec_ctx_2b<br>
+; CHECK-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]])<br>
+; CHECK-NEXT:  en:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[B]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[EX:%.*]], label [[HD:%.*]]<br>
+; CHECK:       ex:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    ret i32 [[TMP5]]<br>
+; CHECK:       hd:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8:%.*]], [[HD2:%.*]] ], [ 0, [[EN:%.*]] ]<br>
+; CHECK-NEXT:    tail call void @h(i32* nonnull [[A]])<br>
+; CHECK-NEXT:    br label [[HD2]]<br>
+; CHECK:       hd2:<br>
+; CHECK-NEXT:    [[TMP8]] = add nuw i32 [[TMP7]], 1<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[TMP9]], label [[EX]], label [[HD]]<br>
 ;<br>
 en:<br>
   %tmp3 = icmp eq i32 %b, 0<br>
@@ -728,22 +992,22 @@ declare void @sink(i32*)<br>
<br>
 ; FIXME: the sink argument should be marked nonnull as in @PR43833_simple.<br>
 define void @PR43833(i32* %0, i32 %1) {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@PR43833<br>
-; ATTRIBUTOR-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; ATTRIBUTOR-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], 1<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
-; ATTRIBUTOR:       4:<br>
-; ATTRIBUTOR-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
-; ATTRIBUTOR-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
-; ATTRIBUTOR-NEXT:    br label [[TMP8:%.*]]<br>
-; ATTRIBUTOR:       7:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
-; ATTRIBUTOR:       8:<br>
-; ATTRIBUTOR-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
-; ATTRIBUTOR-NEXT:    tail call void @sink(i32* [[TMP6]])<br>
-; ATTRIBUTOR-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
-; ATTRIBUTOR-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
-; ATTRIBUTOR-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
+; CHECK-LABEL: define {{[^@]+}}@PR43833<br>
+; CHECK-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP1]], 1<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
+; CHECK-NEXT:    br label [[TMP8:%.*]]<br>
+; CHECK:       7:<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       8:<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
+; CHECK-NEXT:    tail call void @sink(i32* [[TMP6]])<br>
+; CHECK-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
+; CHECK-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
 ;<br>
   %3 = icmp sgt i32 %1, 1<br>
   br i1 %3, label %4, label %7<br>
@@ -766,39 +1030,73 @@ define void @PR43833(i32* %0, i32 %1) {<br>
<br>
 ; Adjusted from PR43833<br>
 define void @PR43833_simple(i32* %0, i32 %1) {<br>
-; ATTRIBUTOR_OPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
-; ATTRIBUTOR_OPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
-; ATTRIBUTOR_OPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
-; ATTRIBUTOR_OPM:       4:<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
-; ATTRIBUTOR_OPM-NEXT:    br label [[TMP8:%.*]]<br>
-; ATTRIBUTOR_OPM:       7:<br>
-; ATTRIBUTOR_OPM-NEXT:    ret void<br>
-; ATTRIBUTOR_OPM:       8:<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
-; ATTRIBUTOR_OPM-NEXT:    tail call void @sink(i32* [[TMP6]])<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
-; ATTRIBUTOR_OPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
-; ATTRIBUTOR_OPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
-;<br>
-; ATTRIBUTOR_NPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
-; ATTRIBUTOR_NPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
-; ATTRIBUTOR_NPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
-; ATTRIBUTOR_NPM:       4:<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
-; ATTRIBUTOR_NPM-NEXT:    br label [[TMP8:%.*]]<br>
-; ATTRIBUTOR_NPM:       7:<br>
-; ATTRIBUTOR_NPM-NEXT:    ret void<br>
-; ATTRIBUTOR_NPM:       8:<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
-; ATTRIBUTOR_NPM-NEXT:    tail call void @sink(i32* nonnull [[TMP6]])<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
-; ATTRIBUTOR_NPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
-; ATTRIBUTOR_NPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
+; CHECK_OPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
+; CHECK_OPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK_OPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
+; CHECK_OPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
+; CHECK_OPM:       4:<br>
+; CHECK_OPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
+; CHECK_OPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
+; CHECK_OPM-NEXT:    br label [[TMP8:%.*]]<br>
+; CHECK_OPM:       7:<br>
+; CHECK_OPM-NEXT:    ret void<br>
+; CHECK_OPM:       8:<br>
+; CHECK_OPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
+; CHECK_OPM-NEXT:    tail call void @sink(i32* [[TMP6]])<br>
+; CHECK_OPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
+; CHECK_OPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
+; CHECK_OPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
+;<br>
+; CHECK_NPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
+; CHECK_NPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; CHECK_NPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
+; CHECK_NPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
+; CHECK_NPM:       4:<br>
+; CHECK_NPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
+; CHECK_NPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
+; CHECK_NPM-NEXT:    br label [[TMP8:%.*]]<br>
+; CHECK_NPM:       7:<br>
+; CHECK_NPM-NEXT:    ret void<br>
+; CHECK_NPM:       8:<br>
+; CHECK_NPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
+; CHECK_NPM-NEXT:    tail call void @sink(i32* nonnull [[TMP6]])<br>
+; CHECK_NPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
+; CHECK_NPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
+; CHECK_NPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
+;<br>
+; IS________OPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
+; IS________OPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
+; IS________OPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
+; IS________OPM:       4:<br>
+; IS________OPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
+; IS________OPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
+; IS________OPM-NEXT:    br label [[TMP8:%.*]]<br>
+; IS________OPM:       7:<br>
+; IS________OPM-NEXT:    ret void<br>
+; IS________OPM:       8:<br>
+; IS________OPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
+; IS________OPM-NEXT:    tail call void @sink(i32* [[TMP6]])<br>
+; IS________OPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
+; IS________OPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
+; IS________OPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@PR43833_simple<br>
+; IS________NPM-SAME: (i32* [[TMP0:%.*]], i32 [[TMP1:%.*]])<br>
+; IS________NPM-NEXT:    [[TMP3:%.*]] = icmp ne i32 [[TMP1]], 0<br>
+; IS________NPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP7:%.*]]<br>
+; IS________NPM:       4:<br>
+; IS________NPM-NEXT:    [[TMP5:%.*]] = zext i32 [[TMP1]] to i64<br>
+; IS________NPM-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP5]]<br>
+; IS________NPM-NEXT:    br label [[TMP8:%.*]]<br>
+; IS________NPM:       7:<br>
+; IS________NPM-NEXT:    ret void<br>
+; IS________NPM:       8:<br>
+; IS________NPM-NEXT:    [[TMP9:%.*]] = phi i32 [ 1, [[TMP4]] ], [ [[TMP10:%.*]], [[TMP8]] ]<br>
+; IS________NPM-NEXT:    tail call void @sink(i32* nonnull [[TMP6]])<br>
+; IS________NPM-NEXT:    [[TMP10]] = add nuw nsw i32 [[TMP9]], 1<br>
+; IS________NPM-NEXT:    [[TMP11:%.*]] = icmp eq i32 [[TMP10]], [[TMP1]]<br>
+; IS________NPM-NEXT:    br i1 [[TMP11]], label [[TMP7]], label [[TMP8]]<br>
 ;<br>
   %3 = icmp ne i32 %1, 0<br>
   br i1 %3, label %4, label %7<br>
@@ -823,13 +1121,13 @@ declare i8* @strrchr(i8* %0, i32 %1) nofree nounwind readonly<br>
<br>
 ; We should not mark the return of @strrchr as `nonnull`, it may well be NULL!<br>
 define i8* @mybasename(i8* nofree readonly %str) {<br>
-; ATTRIBUTOR-LABEL: define {{[^@]+}}@mybasename<br>
-; ATTRIBUTOR-SAME: (i8* nofree readonly [[STR:%.*]])<br>
-; ATTRIBUTOR-NEXT:    [[CALL:%.*]] = call i8* @strrchr(i8* nofree readonly [[STR]], i32 47)<br>
-; ATTRIBUTOR-NEXT:    [[TOBOOL:%.*]] = icmp ne i8* [[CALL]], null<br>
-; ATTRIBUTOR-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 1<br>
-; ATTRIBUTOR-NEXT:    [[COND:%.*]] = select i1 [[TOBOOL]], i8* [[ADD_PTR]], i8* [[STR]]<br>
-; ATTRIBUTOR-NEXT:    ret i8* [[COND]]<br>
+; CHECK-LABEL: define {{[^@]+}}@mybasename<br>
+; CHECK-SAME: (i8* nofree readonly [[STR:%.*]])<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i8* @strrchr(i8* nofree readonly [[STR]], i32 47)<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i8* [[CALL]], null<br>
+; CHECK-NEXT:    [[ADD_PTR:%.*]] = getelementptr inbounds i8, i8* [[CALL]], i64 1<br>
+; CHECK-NEXT:    [[COND:%.*]] = select i1 [[TOBOOL]], i8* [[ADD_PTR]], i8* [[STR]]<br>
+; CHECK-NEXT:    ret i8* [[COND]]<br>
 ;<br>
   %call = call i8* @strrchr(i8* %str, i32 47)<br>
   %tobool = icmp ne i8* %call, null<br>
@@ -845,6 +1143,20 @@ define void @nonnull_assume_pos(i8* %arg) {<br>
 ; ATTRIBUTOR-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
 ; ATTRIBUTOR-NEXT:    [[TMP1:%.*]] = call i8* @unknown()<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; NOT_CGSCC_OPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])<br>
+; NOT_CGSCC_OPM-NEXT:    call void @llvm.assume(i1 true) #11 [ "nonnull"(i8* [[ARG]]) ]<br>
+; NOT_CGSCC_OPM-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
+; NOT_CGSCC_OPM-NEXT:    [[TMP1:%.*]] = call i8* @unknown()<br>
+; NOT_CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_pos<br>
+; IS__CGSCC_OPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    call void @llvm.assume(i1 true) #12 [ "nonnull"(i8* [[ARG]]) ]<br>
+; IS__CGSCC_OPM-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
+; IS__CGSCC_OPM-NEXT:    [[TMP1:%.*]] = call i8* @unknown()<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
 ;<br>
   call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]<br>
   call void @use_i8_ptr(i8* %arg)<br>
@@ -863,6 +1175,18 @@ define void @nonnull_assume_neg(i8* %arg) {<br>
 ; ATTRIBUTOR-NEXT:    call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]<br>
 ; ATTRIBUTOR-NEXT:    call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
 ; ATTRIBUTOR-NEXT:    ret void<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_neg<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[ARG:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i8* @unknown()<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree readnone [[ARG]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]<br>
+; CHECK-NEXT:    call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = call i8* @unknown()<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
+; CHECK-NEXT:    call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]<br>
+; CHECK-NEXT:    call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG]])<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   call i8* @unknown()<br>
   call void @use_i8_ptr(i8* %arg)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/norecurse.ll b/llvm/test/Transforms/Attributor/norecurse.ll<br>
index f7e29e2b27a8..3c60c08c8d8e 100644<br>
--- a/llvm/test/Transforms/Attributor/norecurse.ll<br>
+++ b/llvm/test/Transforms/Attributor/norecurse.ll<br>
@@ -1,100 +1,152 @@<br>
-; RUN: opt -attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; RUN: opt -passes=attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_NPM<br>
-; Copied from Transforms/FunctoinAttrs/norecurse.ll<br>
-<br>
-; ATTRIBUTOR: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @leaf()<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn<br>
+; IS__CGSSA____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
 define i32 @leaf() {<br>
+; CHECK-LABEL: define {{[^@]+}}@leaf()<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   ret i32 1<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: readnone<br>
-; ATTRIBUTOR-NOT: norecurse<br>
-; ATTRIBUTOR-NEXT: define i32 @self_rec()<br>
+; CHECK: Function Attrs<br>
+; CHECK-SAME: readnone<br>
+; CHECK-NOT: norecurse<br>
 define i32 @self_rec() {<br>
+; CHECK-LABEL: define {{[^@]+}}@self_rec()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %a = call i32 @self_rec()<br>
   ret i32 4<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: readnone<br>
-; ATTRIBUTOR-NOT: norecurse<br>
-; ATTRIBUTOR-NEXT: define i32 @indirect_rec()<br>
+; CHECK: Function Attrs<br>
+; CHECK-SAME: readnone<br>
+; CHECK-NOT: norecurse<br>
 define i32 @indirect_rec() {<br>
+; CHECK-LABEL: define {{[^@]+}}@indirect_rec()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %a = call i32 @indirect_rec2()<br>
   ret i32 %a<br>
 }<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: readnone<br>
-; ATTRIBUTOR-NOT: norecurse<br>
-; ATTRIBUTOR-NEXT: define i32 @indirect_rec2()<br>
+; CHECK: Function Attrs<br>
+; CHECK-SAME: readnone<br>
+; CHECK-NOT: norecurse<br>
 define i32 @indirect_rec2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@indirect_rec2()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %a = call i32 @indirect_rec()<br>
   ret i32 %a<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: readnone<br>
-; ATTRIBUTOR-NOT: norecurse<br>
-; ATTRIBUTOR-NEXT: define i32 @extern()<br>
+; CHECK: Function Attrs<br>
+; CHECK-SAME: readnone<br>
+; CHECK-NOT: norecurse<br>
 define i32 @extern() {<br>
+; CHECK-LABEL: define {{[^@]+}}@extern()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @k()<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   %a = call i32 @k()<br>
   ret i32 %a<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-NEXT: declare i32 @k()<br>
+; CHECK: Function Attrs<br>
+; CHECK-NEXT: declare i32 @k()<br>
 declare i32 @k() readnone<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-NOT: norecurse<br>
-; ATTRIBUTOR-NEXT: define void @intrinsic(i8* nocapture writeonly %dest, i8* nocapture readonly %src, i32 %len)<br>
+; CHECK: Function Attrs<br>
+; CHECK-NOT: norecurse<br>
 define void @intrinsic(i8* %dest, i8* %src, i32 %len) {<br>
+; CHECK-LABEL: define {{[^@]+}}@intrinsic<br>
+; CHECK-SAME: (i8* nocapture writeonly [[DEST:%.*]], i8* nocapture readonly [[SRC:%.*]], i32 [[LEN:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly [[DEST]], i8* noalias nocapture readonly [[SRC]], i32 [[LEN]], i1 false)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dest, i8* %src, i32 %len, i1 false)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-NEXT: declare void @llvm.memcpy.p0i8.p0i8.i32<br>
+; CHECK: Function Attrs<br>
+; CHECK-NEXT: declare void @llvm.memcpy.p0i8.p0i8.i32<br>
 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i1)<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: norecurse nosync readnone<br>
+; IS__TUNIT____: Function Attrs<br>
+; IS__TUNIT____-SAME: nosync readnone<br>
+; IS__CGSSA____: Function Attrs<br>
+; IS__CGSSA____-SAME: norecurse nosync readnone<br>
 define internal i32 @called_by_norecurse() {<br>
+; CHECK-LABEL: define {{[^@]+}}@called_by_norecurse()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @k()<br>
+; CHECK-NEXT:    ret i32 undef<br>
+;<br>
   %a = call i32 @k()<br>
   ret i32 %a<br>
 }<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-NEXT: define void @m()<br>
+; CHECK: Function Attrs<br>
 define void @m() norecurse {<br>
+; CHECK-LABEL: define {{[^@]+}}@m()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @called_by_norecurse()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %a = call i32 @called_by_norecurse()<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs<br>
+; CHECK: Function Attrs<br>
 ; FIXME: norecurse missing<br>
-; ATTRIBUTOR-SAME: nosync readnone<br>
-; ATTRIBUTOR-NEXT: @called_by_norecurse_indirectly<br>
+; CHECK-SAME: nosync readnone<br>
 define internal i32 @called_by_norecurse_indirectly() {<br>
+; CHECK-LABEL: define {{[^@]+}}@called_by_norecurse_indirectly()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @k()<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   %a = call i32 @k()<br>
   ret i32 %a<br>
 }<br>
-; ATTRIBUTOR: Function Attrs<br>
-; ATTRIBUTOR-SAME: norecurse nosync readnone<br>
-; ATTRIBUTOR-NEXT: @o<br>
+; IS__TUNIT____: Function Attrs<br>
+; IS__TUNIT____-SAME: nosync readnone<br>
+; IS__CGSSA____: Function Attrs<br>
+; IS__CGSSA____-SAME: norecurse nosync readnone<br>
 define internal i32 @o() {<br>
+; CHECK-LABEL: define {{[^@]+}}@o()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @called_by_norecurse_indirectly()<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   %a = call i32 @called_by_norecurse_indirectly()<br>
   ret i32 %a<br>
 }<br>
 define i32 @p() norecurse {<br>
+; CHECK-LABEL: define {{[^@]+}}@p()<br>
+; CHECK-NEXT:    [[A:%.*]] = call i32 @o()<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   %a = call i32 @o()<br>
   ret i32 %a<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind<br>
-; ATTRIBUTOR-NEXT: define void @f(i32 %x)<br>
+; CHECK: Function Attrs: nofree nosync nounwind<br>
 define void @f(i32 %x)  {<br>
+; CHECK-LABEL: define {{[^@]+}}@f<br>
+; CHECK-SAME: (i32 [[X:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[X_ADDR:%.*]] = alloca i32, align 4<br>
+; CHECK-NEXT:    store i32 [[X]], i32* [[X_ADDR]], align 4<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[X_ADDR]], align 4<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    call void @g()<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %x.addr = alloca i32, align 4<br>
   store i32 %x, i32* %x.addr, align 4<br>
@@ -110,39 +162,57 @@ if.end:<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @g()<br>
 define void @g() norecurse {<br>
+; CHECK-LABEL: define {{[^@]+}}@g()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    call void @f(i32 0)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   call void @f(i32 0)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR-NOT: Function Attrs<br>
-; ATTRIBUTOR: define linkonce_odr i32 @leaf_redefinable()<br>
+; CHECK-NOT: Function Attrs<br>
 define linkonce_odr i32 @leaf_redefinable() {<br>
+; CHECK-LABEL: define {{[^@]+}}@leaf_redefinable()<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   ret i32 1<br>
 }<br>
<br>
 ; Call through a function pointer<br>
-; ATTRIBUTOR-NOT: Function Attrs<br>
-; ATTRIBUTOR: define i32 @eval_func1(i32 (i32)* nocapture nofree nonnull %0, i32 %1)<br>
+; CHECK-NOT: Function Attrs<br>
 define i32 @eval_func1(i32 (i32)* , i32) local_unnamed_addr {<br>
+; CHECK-LABEL: define {{[^@]+}}@eval_func1<br>
+; CHECK-SAME: (i32 (i32)* nocapture nofree nonnull [[TMP0:%.*]], i32 [[TMP1:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 [[TMP0]](i32 [[TMP1]])<br>
+; CHECK-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %3 = tail call i32 %0(i32 %1) #2<br>
   ret i32 %3<br>
 }<br>
<br>
-; ATTRIBUTOR-NOT: Function Attrs<br>
-; ATTRIBUTOR: define i32 @eval_func2(i32 (i32)* nocapture nofree %0, i32 %1)<br>
+; CHECK-NOT: Function Attrs<br>
 define i32 @eval_func2(i32 (i32)* , i32) local_unnamed_addr "null-pointer-is-valid"="true"{<br>
+; CHECK-LABEL: define {{[^@]+}}@eval_func2<br>
+; CHECK-SAME: (i32 (i32)* nocapture nofree [[TMP0:%.*]], i32 [[TMP1:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 [[TMP0]](i32 [[TMP1]])<br>
+; CHECK-NEXT:    ret i32 [[TMP3]]<br>
+;<br>
   %3 = tail call i32 %0(i32 %1) #2<br>
   ret i32 %3<br>
 }<br>
<br>
-declare void @unknown()<br>
 ; Call an unknown function in a dead block.<br>
-; ATTRIBUTOR_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
-; ATTRIBUTOR_NPM: define i32 @call_unknown_in_dead_block()<br>
+; CHECK_NPM: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
+declare void @unknown()<br>
 define i32 @call_unknown_in_dead_block() local_unnamed_addr {<br>
+; CHECK-LABEL: define {{[^@]+}}@call_unknown_in_dead_block() local_unnamed_addr<br>
+; CHECK-NEXT:    ret i32 0<br>
+; CHECK:       Dead:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   ret i32 0<br>
 Dead:<br>
   tail call void @unknown()<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/noreturn.ll b/llvm/test/Transforms/Attributor/noreturn.ll<br>
index 06e2cc4570ad..864769dc3454 100644<br>
--- a/llvm/test/Transforms/Attributor/noreturn.ll<br>
+++ b/llvm/test/Transforms/Attributor/noreturn.ll<br>
@@ -1,4 +1,8 @@<br>
-; RUN: opt -functionattrs -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=1 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
 ; Test cases specifically designed for the "no-return" function attribute.<br>
 ; We use FIXME's to indicate problems and missing attributes.<br>
@@ -12,10 +16,13 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 ;   return srec0();<br>
 ; }<br>
 ;<br>
-; CHECK: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; CHECK: define void @srec0()<br>
-;<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define void @srec0() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@srec0()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   call void @srec0()<br>
   ret void<br>
@@ -28,10 +35,16 @@ entry:<br>
 ;   return srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(srec16(a))))))))))))))));<br>
 ; }<br>
 ;<br>
-; CHECK: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; CHECK: define i32 @srec16(i32 %a)<br>
-;<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define i32 @srec16(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@srec16<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %call = call i32 @srec16(i32 %a)<br>
   %call1 = call i32 @srec16(i32 %call)<br>
@@ -62,10 +75,16 @@ exit:<br>
 ;   while (1);<br>
 ; }<br>
 ;<br>
-; CHECK: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
-; CHECK: define i32 @endless_loop(i32 %a)<br>
-;<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define i32 @endless_loop(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@endless_loop<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY]]<br>
+;<br>
 entry:<br>
   br label %while.body<br>
<br>
@@ -82,10 +101,18 @@ while.body:                                       ; preds = %entry, %while.body<br>
 ; }<br>
 ;<br>
 ; FIXME: no-return missing (D65243 should fix this)<br>
-; CHECK: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
-; CHECK: define i32 @dead_return(i32 returned %a)<br>
-;<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define i32 @dead_return(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@dead_return<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   br label %while.body<br>
<br>
@@ -103,10 +130,21 @@ return:                                           ; No predecessors!<br>
 ;   return a == 0 ? endless_loop(a) : srec16(a);<br>
 ; }<br>
 ;<br>
-; CHECK: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; CHECK: define i32 @multiple_noreturn_calls(i32 %a)<br>
-;<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define i32 @multiple_noreturn_calls(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@multiple_noreturn_calls<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32 %a, 0<br>
   br i1 %cmp, label %cond.true, label %cond.false<br>
@@ -128,9 +166,15 @@ cond.end:                                         ; preds = %cond.false, %cond.t<br>
 ; TEST 6a: willreturn means *not* no-return or UB<br>
 ; FIXME: we should derive "UB" as an argument and report it to the user on request.<br>
<br>
-; CHECK:      Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn<br>
-; CHECK-NEXT: define i32 @endless_loop_but_willreturn<br>
+; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn<br>
 define i32 @endless_loop_but_willreturn() willreturn {<br>
+; CHECK-LABEL: define {{[^@]+}}@endless_loop_but_willreturn()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY]]<br>
+;<br>
 entry:<br>
   br label %while.body<br>
<br>
@@ -139,9 +183,13 @@ while.body:                                       ; preds = %entry, %while.body<br>
 }<br>
<br>
 ; TEST 6b: willreturn means *not* no-return or UB<br>
-; CHECK:      Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn<br>
-; CHECK-NEXT: define i32 @UB_and_willreturn<br>
+; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind readnone willreturn<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse noreturn nosync nounwind readnone willreturn<br>
 define i32 @UB_and_willreturn() willreturn {<br>
+; CHECK-LABEL: define {{[^@]+}}@UB_and_willreturn()<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   unreachable<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nosync.ll b/llvm/test/Transforms/Attributor/nosync.ll<br>
index b23848e7ead0..7b7ba562544a 100644<br>
--- a/llvm/test/Transforms/Attributor/nosync.ll<br>
+++ b/llvm/test/Transforms/Attributor/nosync.ll<br>
@@ -1,4 +1,8 @@<br>
-; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
 ; Test cases designed for the nosync function attribute.<br>
@@ -24,9 +28,15 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 %struct.RT = type { i8, [10 x [20 x i32]], i8 }<br>
 %struct.ST = type { i32, double, %struct.RT }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind optsize readnone ssp uwtable<br>
-; ATTRIBUTOR-NEXT: define nonnull i32* @foo(%struct.ST* nofree readnone "no-capture-maybe-returned" %s)<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind optsize readnone ssp uwtable<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind optsize readnone ssp uwtable<br>
 define i32* @foo(%struct.ST* %s) nounwind uwtable readnone optsize ssp {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo<br>
+; CHECK-SAME: (%struct.ST* nofree readnone "no-capture-maybe-returned" [[S:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_ST:%.*]], %struct.ST* [[S]], i64 1, i32 2, i32 1, i64 5, i64 13<br>
+; CHECK-NEXT:    ret i32* [[ARRAYIDX]]<br>
+;<br>
 entry:<br>
   %arrayidx = getelementptr inbounds %struct.ST, %struct.ST* %s, i64 1, i32 2, i32 1, i64 5, i64 13<br>
   ret i32* %arrayidx<br>
@@ -39,9 +49,14 @@ entry:<br>
 ;   return n;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
-; ATTRIBUTOR-NEXT: define i32 @load_monotonic(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
 define i32 @load_monotonic(i32* nocapture readonly %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@load_monotonic<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load atomic i32, i32* [[TMP0]] monotonic, align 4<br>
+; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
   %2 = load atomic i32, i32* %0 monotonic, align 4<br>
   ret i32 %2<br>
 }<br>
@@ -53,9 +68,14 @@ define i32 @load_monotonic(i32* nocapture readonly %0) norecurse nounwind uwtabl<br>
 ;   atomic_load_explicit(num, memory_order_relaxed);<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
-; ATTRIBUTOR-NEXT: define void @store_monotonic(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind uwtable<br>
 define void @store_monotonic(i32* nocapture %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@store_monotonic<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]])<br>
+; CHECK-NEXT:    store atomic i32 10, i32* [[TMP0]] monotonic, align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store atomic i32 10, i32* %0 monotonic, align 4<br>
   ret void<br>
 }<br>
@@ -67,10 +87,15 @@ define void @store_monotonic(i32* nocapture %0) norecurse nounwind uwtable {<br>
 ;   return n;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define i32 @load_acquire(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define i32 @load_acquire(i32* nocapture readonly %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@load_acquire<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load atomic i32, i32* [[TMP0]] acquire, align 4<br>
+; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
   %2 = load atomic i32, i32* %0 acquire, align 4<br>
   ret i32 %2<br>
 }<br>
@@ -81,20 +106,30 @@ define i32 @load_acquire(i32* nocapture readonly %0) norecurse nounwind uwtable<br>
 ;   atomic_store_explicit(num, 10, memory_order_release);<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define void @load_release(i32* nocapture nofree writeonly align 4 %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define void @load_release(i32* nocapture %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@load_release<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly align 4 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    store atomic volatile i32 10, i32* [[TMP0]] release, align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store atomic volatile i32 10, i32* %0 release, align 4<br>
   ret void<br>
 }<br>
<br>
 ; TEST 6 - negative volatile, relaxed atomic<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define void @load_volatile_release(i32* nocapture nofree writeonly align 4 %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define void @load_volatile_release(i32* nocapture %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@load_volatile_release<br>
+; CHECK-SAME: (i32* nocapture nofree writeonly align 4 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    store atomic volatile i32 10, i32* [[TMP0]] release, align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store atomic volatile i32 10, i32* %0 release, align 4<br>
   ret void<br>
 }<br>
@@ -105,10 +140,15 @@ define void @load_volatile_release(i32* nocapture %0) norecurse nounwind uwtable<br>
 ;   *num = 14;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define void @volatile_store(i32* nofree align 4 %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define void @volatile_store(i32* %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@volatile_store<br>
+; CHECK-SAME: (i32* nofree align 4 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    store volatile i32 14, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store volatile i32 14, i32* %0, align 4<br>
   ret void<br>
 }<br>
@@ -120,37 +160,50 @@ define void @volatile_store(i32* %0) norecurse nounwind uwtable {<br>
 ;   return n;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define i32 @volatile_load(i32* nofree align 4 %0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define i32 @volatile_load(i32* %0) norecurse nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@volatile_load<br>
+; CHECK-SAME: (i32* nofree align 4 [[TMP0:%.*]])<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load volatile i32, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    ret i32 [[TMP2]]<br>
+;<br>
   %2 = load volatile i32, i32* %0, align 4<br>
   ret i32 %2<br>
 }<br>
<br>
 ; TEST 9<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nosync nounwind uwtable<br>
-; ATTRIBUTOR-NEXT: declare void @nosync_function()<br>
+; CHECK: Function Attrs: noinline nosync nounwind uwtable<br>
+; CHECK-NEXT: declare void @nosync_function()<br>
 declare void @nosync_function() noinline nounwind uwtable nosync<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nosync nounwind uwtable<br>
-; ATTRIBUTOR-next: define void @call_nosync_function()<br>
+; IS__TUNIT____: Function Attrs: noinline nosync nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: noinline nosync nounwind uwtable<br>
 define void @call_nosync_function() nounwind uwtable noinline {<br>
+; CHECK-LABEL: define {{[^@]+}}@call_nosync_function()<br>
+; CHECK-NEXT:    tail call void @nosync_function()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @nosync_function() noinline nounwind uwtable<br>
   ret void<br>
 }<br>
<br>
 ; TEST 10 - negative, should not deduce nosync<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NEXT: declare void @might_sync()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NEXT: declare void @might_sync()<br>
 declare void @might_sync() noinline nounwind uwtable<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define void @call_might_sync()<br>
+; IS__TUNIT____: Function Attrs: noinline nounwind uwtable<br>
+; IS__CGSCC____: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: nosync<br>
 define void @call_might_sync() nounwind uwtable noinline {<br>
+; CHECK-LABEL: define {{[^@]+}}@call_might_sync()<br>
+; CHECK-NEXT:    tail call void @might_sync()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @might_sync() noinline nounwind uwtable<br>
   ret void<br>
 }<br>
@@ -158,17 +211,27 @@ define void @call_might_sync() nounwind uwtable noinline {<br>
 ; TEST 11 - positive, should deduce nosync<br>
 ; volatile operation in same scc but dead. Call volatile_load defined in TEST 8.<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define i32 @scc1(i32* nocapture nofree readnone %0)<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_OPM: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_NPM: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define i32 @scc1(i32* %0) noinline nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc1<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[TMP0:%.*]])<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call void @scc2(i32* %0);<br>
   %val = tail call i32 @volatile_load(i32* %0);<br>
   ret i32 %val;<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define void @scc2(i32* nocapture nofree readnone %0)<br>
+; IS__TUNIT____: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_OPM: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; IS__CGSCC_NPM: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
 define void @scc2(i32* %0) noinline nounwind uwtable {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc2<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[TMP0:%.*]])<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call i32 @scc1(i32* %0);<br>
   ret void;<br>
 }<br>
@@ -192,10 +255,16 @@ define void @scc2(i32* %0) noinline nounwind uwtable {<br>
 %"struct.std::atomic" = type { %"struct.std::__atomic_base" }<br>
 %"struct.std::__atomic_base" = type { i8 }<br>
<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR: define void @foo1(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) %0, %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) %1)<br>
-<br>
+; CHECK-NOT: nosync<br>
 define void @foo1(i32* %0, %"struct.std::atomic"* %1) {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo1<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) [[TMP1:%.*]])<br>
+; CHECK-NEXT:    store i32 100, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    fence release<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* [[TMP1]], i64 0, i32 0, i32 0<br>
+; CHECK-NEXT:    store atomic i8 1, i8* [[TMP3]] monotonic, align 1<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32 100, i32* %0, align 4<br>
   fence release<br>
   %3 = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* %1, i64 0, i32 0, i32 0<br>
@@ -203,9 +272,21 @@ define void @foo1(i32* %0, %"struct.std::atomic"* %1) {<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR: define void @bar(i32* nocapture nofree readnone %0, %"struct.std::atomic"* nocapture nofree nonnull readonly dereferenceable(1) %1)<br>
+; CHECK-NOT: nosync<br>
 define void @bar(i32* %0, %"struct.std::atomic"* %1) {<br>
+; CHECK-LABEL: define {{[^@]+}}@bar<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull readonly dereferenceable(1) [[TMP1:%.*]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* [[TMP1]], i64 0, i32 0, i32 0<br>
+; CHECK-NEXT:    br label [[TMP4:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = load atomic i8, i8* [[TMP3]] monotonic, align 1<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = and i8 [[TMP5]], 1<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP7]], label [[TMP4]], label [[TMP8:%.*]]<br>
+; CHECK:       8:<br>
+; CHECK-NEXT:    fence acquire<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %3 = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* %1, i64 0, i32 0, i32 0<br>
   br label %4<br>
<br>
@@ -221,10 +302,17 @@ define void @bar(i32* %0, %"struct.std::atomic"* %1) {<br>
 }<br>
<br>
 ; TEST 13 - Fence syncscope("singlethread") seq_cst<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind willreturn<br>
-; ATTRIBUTOR: define void @foo1_singlethread(i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) %0, %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) %1)<br>
-<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind willreturn<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind willreturn<br>
 define void @foo1_singlethread(i32* %0, %"struct.std::atomic"* %1) {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo1_singlethread<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull writeonly align 4 dereferenceable(4) [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull writeonly dereferenceable(1) [[TMP1:%.*]])<br>
+; CHECK-NEXT:    store i32 100, i32* [[TMP0]], align 4<br>
+; CHECK-NEXT:    fence syncscope("singlethread") release<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* [[TMP1]], i64 0, i32 0, i32 0<br>
+; CHECK-NEXT:    store atomic i8 1, i8* [[TMP3]] monotonic, align 1<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i32 100, i32* %0, align 4<br>
   fence syncscope("singlethread") release<br>
   %3 = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* %1, i64 0, i32 0, i32 0<br>
@@ -232,9 +320,22 @@ define void @foo1_singlethread(i32* %0, %"struct.std::atomic"* %1) {<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind<br>
-; ATTRIBUTOR: define void @bar_singlethread(i32* nocapture nofree readnone %0, %"struct.std::atomic"* nocapture nofree nonnull readonly dereferenceable(1) %1)<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind<br>
 define void @bar_singlethread(i32* %0, %"struct.std::atomic"* %1) {<br>
+; CHECK-LABEL: define {{[^@]+}}@bar_singlethread<br>
+; CHECK-SAME: (i32* nocapture nofree readnone [[TMP0:%.*]], %"struct.std::atomic"* nocapture nofree nonnull readonly dereferenceable(1) [[TMP1:%.*]])<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* [[TMP1]], i64 0, i32 0, i32 0<br>
+; CHECK-NEXT:    br label [[TMP4:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = load atomic i8, i8* [[TMP3]] monotonic, align 1<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = and i8 [[TMP5]], 1<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i8 [[TMP6]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP7]], label [[TMP4]], label [[TMP8:%.*]]<br>
+; CHECK:       8:<br>
+; CHECK-NEXT:    fence syncscope("singlethread") acquire<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %3 = getelementptr inbounds %"struct.std::atomic", %"struct.std::atomic"* %1, i64 0, i32 0, i32 0<br>
   br label %4<br>
<br>
@@ -256,10 +357,15 @@ declare void @llvm.memset(i8* %dest, i8 %val, i32 %len, i1 %isvolatile)<br>
<br>
 ; It is odd to add nocapture but a result of the llvm.memcpy nocapture.<br>
 ;<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nounwind<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define i32 @memcpy_volatile(i8* nocapture writeonly %ptr1, i8* nocapture readonly %ptr2)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nounwind<br>
+; IS__CGSCC____: Function Attrs: argmemonly nounwind<br>
+; CHECK-NOT: nosync<br>
 define i32 @memcpy_volatile(i8* %ptr1, i8* %ptr2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@memcpy_volatile<br>
+; CHECK-SAME: (i8* nocapture writeonly [[PTR1:%.*]], i8* nocapture readonly [[PTR2:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly [[PTR1]], i8* noalias nocapture readonly [[PTR2]], i32 8, i1 true)<br>
+; CHECK-NEXT:    ret i32 4<br>
+;<br>
   call void @llvm.memcpy(i8* %ptr1, i8* %ptr2, i32 8, i1 1)<br>
   ret i32 4<br>
 }<br>
@@ -268,41 +374,57 @@ define i32 @memcpy_volatile(i8* %ptr1, i8* %ptr2) {<br>
<br>
 ; It is odd to add nocapture but a result of the llvm.memset nocapture.<br>
 ;<br>
-; ATTRIBUTOR: Function Attrs: argmemonly nosync<br>
-; ATTRIBUTOR-NEXT: define i32 @memset_non_volatile(i8* nocapture writeonly %ptr1, i8 %val)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nosync<br>
+; IS__CGSCC____: Function Attrs: argmemonly nosync<br>
 define i32 @memset_non_volatile(i8* %ptr1, i8 %val) {<br>
+; CHECK-LABEL: define {{[^@]+}}@memset_non_volatile<br>
+; CHECK-SAME: (i8* nocapture writeonly [[PTR1:%.*]], i8 [[VAL:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.memset.p0i8.i32(i8* nocapture writeonly [[PTR1]], i8 [[VAL]], i32 8, i1 false)<br>
+; CHECK-NEXT:    ret i32 4<br>
+;<br>
   call void @llvm.memset(i8* %ptr1, i8 %val, i32 8, i1 0)<br>
   ret i32 4<br>
 }<br>
<br>
 ; TEST 16 - negative, inline assembly.<br>
<br>
-; ATTRIBUTOR: define i32 @inline_asm_test(i32 %x)<br>
 define i32 @inline_asm_test(i32 %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@inline_asm_test<br>
+; CHECK-SAME: (i32 [[X:%.*]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = call i32 asm "bswap $0", "=r,r"(i32 [[X]])<br>
+; CHECK-NEXT:    ret i32 4<br>
+;<br>
   call i32 asm "bswap $0", "=r,r"(i32 %x)<br>
   ret i32 4<br>
 }<br>
<br>
 declare void @readnone_test() convergent readnone<br>
<br>
-; ATTRIBUTOR: define void @convergent_readnone()<br>
 ; TEST 17 - negative. Convergent<br>
 define void @convergent_readnone(){<br>
-    call void @readnone_test()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@convergent_readnone()<br>
+; CHECK-NEXT:    call void @readnone_test()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  call void @readnone_test()<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nounwind<br>
-; ATTRIBUTOR-NEXT: declare void @llvm.x86.sse2.clflush(i8*)<br>
+; CHECK: Function Attrs: nounwind<br>
+; CHECK-NEXT: declare void @llvm.x86.sse2.clflush(i8*)<br>
 declare void @llvm.x86.sse2.clflush(i8*)<br>
 @a = common global i32 0, align 4<br>
<br>
 ; TEST 18 - negative. Synchronizing intrinsic<br>
<br>
-; ATTRIBUTOR: Function Attrs: nounwind<br>
-; ATTRIBUTOR-NOT: nosync<br>
-; ATTRIBUTOR-NEXT: define void @i_totally_sync()<br>
+; IS__TUNIT____: Function Attrs: nounwind<br>
+; IS__CGSCC____: Function Attrs: nounwind<br>
+; CHECK-NOT: nosync<br>
 define void @i_totally_sync() {<br>
+; CHECK-LABEL: define {{[^@]+}}@i_totally_sync()<br>
+; CHECK-NEXT:    tail call void @llvm.x86.sse2.clflush(i8* nonnull align 4 dereferenceable(4) bitcast (i32* @a to i8*))<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @llvm.x86.sse2.clflush(i8* bitcast (i32* @a to i8*))<br>
   ret void<br>
 }<br>
@@ -311,16 +433,25 @@ declare float @llvm.cos(float %val) readnone<br>
<br>
 ; TEST 19 - positive, readnone & non-convergent intrinsic.<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind readnone willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @cos_test(float %x)<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind readnone willreturn<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
 define i32 @cos_test(float %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@cos_test<br>
+; CHECK-SAME: (float [[X:%.*]])<br>
+; CHECK-NEXT:    ret i32 4<br>
+;<br>
   call float @llvm.cos(float %x)<br>
   ret i32 4<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: nosync nounwind<br>
-; ATTRIBUTOR-NEXT: define float @cos_test2(float %x)<br>
+; IS__TUNIT____: Function Attrs: nosync nounwind<br>
+; IS__CGSCC____: Function Attrs: nosync nounwind<br>
 define float @cos_test2(float %x) {<br>
+; CHECK-LABEL: define {{[^@]+}}@cos_test2<br>
+; CHECK-SAME: (float [[X:%.*]])<br>
+; CHECK-NEXT:    [[C:%.*]] = call float @llvm.cos.f32(float [[X]])<br>
+; CHECK-NEXT:    ret float [[C]]<br>
+;<br>
   %c = call float @llvm.cos(float %x)<br>
   ret float %c<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/nounwind.ll b/llvm/test/Transforms/Attributor/nounwind.ll<br>
index e569095c8d41..a2f86d318e6c 100644<br>
--- a/llvm/test/Transforms/Attributor/nounwind.ll<br>
+++ b/llvm/test/Transforms/Attributor/nounwind.ll<br>
@@ -1,26 +1,40 @@<br>
-; RUN: opt < %s -attributor -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S | FileCheck %s --check-prefix=ATTRIBUTOR<br>
-; Copied from Transforms/FunctoinAttrs/nounwind.ll<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=3 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; TEST 1<br>
-; ATTRIBUTOR: Function Attrs: nofree nosync nounwind<br>
-; ATTRIBUTOR-NEXT: define i32 @foo1()<br>
+; IS__TUNIT____: Function Attrs: nofree nosync nounwind<br>
+; IS__CGSCC____: Function Attrs: nofree norecurse nosync nounwind<br>
 define i32 @foo1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@foo1()<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   ret i32 1<br>
 }<br>
<br>
 ; TEST 2<br>
-; ATTRIBUTOR: Function Attrs: nofree noreturn nosync nounwind<br>
-; ATTRIBUTOR-NEXT: define i32 @scc1_foo()<br>
+; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind<br>
+; IS__CGSCC_OPM: Function Attrs: nofree noreturn nosync nounwind<br>
+; IS__CGSCC_NPM: Function Attrs: nofree norecurse noreturn nosync nounwind<br>
 define i32 @scc1_foo() {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc1_foo()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %1 = call i32 @scc1_bar()<br>
   ret i32 1<br>
 }<br>
<br>
<br>
 ; TEST 3<br>
-; ATTRIBUTOR: Function Attrs: nofree noreturn nosync nounwind<br>
-; ATTRIBUTOR-NEXT: define i32 @scc1_bar()<br>
+; IS__TUNIT____: Function Attrs: nofree noreturn nosync nounwind<br>
+; IS__CGSCC_OPM: Function Attrs: nofree noreturn nosync nounwind<br>
+; IS__CGSCC_NPM: Function Attrs: nofree norecurse noreturn nosync nounwind<br>
 define i32 @scc1_bar() {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc1_bar()<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %1 = call i32 @scc1_foo()<br>
   ret i32 1<br>
 }<br>
@@ -28,10 +42,13 @@ define i32 @scc1_bar() {<br>
 declare i32 @non_nounwind()<br>
<br>
 ; TEST 4<br>
-; ATTRIBUTOR: define void @call_non_nounwind() {<br>
 define void @call_non_nounwind(){<br>
-    tail call i32 @non_nounwind()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_non_nounwind()<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = tail call i32 @non_nounwind()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call i32 @non_nounwind()<br>
+  ret void<br>
 }<br>
<br>
 ; TEST 5 - throw<br>
@@ -42,8 +59,16 @@ define void @call_non_nounwind(){<br>
 ;     return -1;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: define i32 @maybe_throw(i1 zeroext %0)<br>
 define i32 @maybe_throw(i1 zeroext %0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@maybe_throw<br>
+; CHECK-SAME: (i1 zeroext [[TMP0:%.*]])<br>
+; CHECK-NEXT:    br i1 [[TMP0]], label [[TMP2:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    tail call void @__cxa_rethrow()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    ret i32 -1<br>
+;<br>
   br i1 %0, label %2, label %3<br>
<br>
 2:                                                ; preds = %1<br>
@@ -65,17 +90,29 @@ declare void @__cxa_rethrow()<br>
 ;   return 1;<br>
 ; }<br>
<br>
-; ATTRIBUTOR: define i32 @catch_thing()<br>
 define i32 @catch_thing() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {<br>
+; CHECK-LABEL: define {{[^@]+}}@catch_thing() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)<br>
+; CHECK-NEXT:    invoke void @__cxa_rethrow()<br>
+; CHECK-NEXT:    to label [[TMP1:%.*]] unwind label [[TMP2:%.*]]<br>
+; CHECK:       1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = landingpad { i8*, i32 }<br>
+; CHECK-NEXT:    catch i8* null<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = extractvalue { i8*, i32 } [[TMP3]], 0<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i8* @__cxa_begin_catch(i8* [[TMP4]])<br>
+; CHECK-NEXT:    tail call void @__cxa_end_catch()<br>
+; CHECK-NEXT:    ret i32 -1<br>
+;<br>
   invoke void @__cxa_rethrow() #1<br>
-          to label %1 unwind label %2<br>
+  to label %1 unwind label %2<br>
<br>
 1:                                                ; preds = %0<br>
   unreachable<br>
<br>
 2:                                                ; preds = %0<br>
   %3 = landingpad { i8*, i32 }<br>
-          catch i8* null<br>
+  catch i8* null<br>
   %4 = extractvalue { i8*, i32 } %3, 0<br>
   %5 = tail call i8* @__cxa_begin_catch(i8* %4) #2<br>
   tail call void @__cxa_end_catch()<br>
@@ -83,9 +120,10 @@ define i32 @catch_thing() personality i8* bitcast (i32 (...)* @__gxx_personality<br>
 }<br>
<br>
 define i32 @catch_thing_user() {<br>
-; ATTRIBUTOR:     define i32 @catch_thing_user<br>
-; ATTRIBUTOR-NEXT: %catch_thing_call = call<br>
-; ATTRIBUTOR-NEXT: ret i32 -1<br>
+; CHECK-LABEL: define {{[^@]+}}@catch_thing_user()<br>
+; CHECK-NEXT:    [[CATCH_THING_CALL:%.*]] = call i32 @catch_thing()<br>
+; CHECK-NEXT:    ret i32 -1<br>
+;<br>
   %catch_thing_call = call i32 @catch_thing()<br>
   ret i32 %catch_thing_call<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/range.ll b/llvm/test/Transforms/Attributor/range.ll<br>
index efb2df556af6..e345b969d554 100644<br>
--- a/llvm/test/Transforms/Attributor/range.ll<br>
+++ b/llvm/test/Transforms/Attributor/range.ll<br>
@@ -1,8 +1,8 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,OLD_PM,MODULE_OLD_PM<br>
-; RUN: opt -passes=attributor -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,NEW_PM,MODULE_NEW_PM<br>
-; RUN: opt -attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC_OLD_PM<br>
-; RUN: opt -passes=attributor-cgscc -attributor-disable=false -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC_NEW_PM<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=9 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=14 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 ; FIXME: CGSCC is not looking at callees and calleers even though it could be allowed.<br>
<br>
@@ -17,26 +17,15 @@ define i32 @test0(i32* %p) {<br>
 }<br>
<br>
 define i32 @test0-range-check(i32* %p) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test0-range-check<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #4, !range !0<br>
+; IS__TUNIT____-NEXT:    ret i32 [[A]]<br>
 ;<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test0-range-check<br>
-; OLD_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; OLD_PM-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !0<br>
-; OLD_PM-NEXT:    ret i32 [[A]]<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test0-range-check<br>
-; NEW_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; NEW_PM-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !0<br>
-; NEW_PM-NEXT:    ret i32 [[A]]<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test0-range-check<br>
-; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 [[A]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test0-range-check<br>
-; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_NEW_PM-NEXT:    ret i32 [[A]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test0-range-check<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    ret i32 [[A]]<br>
 ;<br>
   %a = tail call i32 @test0(i32* %p)<br>
   ret i32 %a<br>
@@ -55,235 +44,121 @@ define void @use3(i1, i1, i1) {<br>
<br>
 ; TEST0 icmp test<br>
 define void @test0-icmp-check(i32* %p){<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test0-icmp-check<br>
-; OLD_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; OLD_PM-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !0<br>
-; OLD_PM-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
-; OLD_PM-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 false)<br>
-; OLD_PM-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
-; OLD_PM-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 true, i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 true)<br>
-; OLD_PM-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_UGT_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
-; OLD_PM-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
-; OLD_PM-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 false)<br>
-; OLD_PM-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_SGT_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 true)<br>
-; OLD_PM-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
-; OLD_PM-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 true, i1 true)<br>
-; OLD_PM-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
-; OLD_PM-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 true, i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 false, i1 false)<br>
-; OLD_PM-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
-; OLD_PM-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
-; OLD_PM-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]])<br>
-; OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false)<br>
-; OLD_PM-NEXT:    ret void<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test0-icmp-check<br>
-; NEW_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; NEW_PM-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !0<br>
-; NEW_PM-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
-; NEW_PM-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 false)<br>
-; NEW_PM-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
-; NEW_PM-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 true, i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 true)<br>
-; NEW_PM-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_UGT_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
-; NEW_PM-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
-; NEW_PM-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 false)<br>
-; NEW_PM-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_SGT_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 true)<br>
-; NEW_PM-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
-; NEW_PM-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 false, i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 true, i1 true)<br>
-; NEW_PM-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
-; NEW_PM-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 true, i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 false, i1 false)<br>
-; NEW_PM-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
-; NEW_PM-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
-; NEW_PM-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]])<br>
-; NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false)<br>
-; NEW_PM-NEXT:    ret void<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test0-icmp-check<br>
-; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_1:%.*]] = icmp eq i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_EQ_6:%.*]] = icmp eq i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_1]], i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 [[CMP_EQ_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_1:%.*]] = icmp ne i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_NE_6:%.*]] = icmp ne i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_1]], i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 [[CMP_NE_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGT_1:%.*]] = icmp ugt i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGT_2:%.*]] = icmp ugt i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_1]], i1 [[CMP_UGT_2]], i1 [[CMP_UGT_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGE_1:%.*]] = icmp uge i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_UGE_6:%.*]] = icmp uge i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_1]], i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 [[CMP_UGE_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_1:%.*]] = icmp sgt i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_2:%.*]] = icmp sgt i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SGT_6:%.*]] = icmp sgt i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_1]], i1 [[CMP_SGT_2]], i1 [[CMP_SGT_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 [[CMP_SGT_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_1:%.*]] = icmp sge i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_5:%.*]] = icmp sge i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_GTE_6:%.*]] = icmp sge i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_1]], i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 [[CMP_GTE_5]], i1 [[CMP_GTE_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_1:%.*]] = icmp slt i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_5:%.*]] = icmp slt i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_SLT_6:%.*]] = icmp slt i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_1]], i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 [[CMP_SLT_5]], i1 [[CMP_SLT_6]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_1:%.*]] = icmp sle i32 [[RET]], 10<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_2:%.*]] = icmp sle i32 [[RET]], 9<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP_LTE_6:%.*]] = icmp sle i32 [[RET]], -1<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]])<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]])<br>
-; CGSCC_OLD_PM-NEXT:    ret void<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test0-icmp-check<br>
-; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_1:%.*]] = icmp eq i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_EQ_6:%.*]] = icmp eq i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_1]], i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 [[CMP_EQ_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_1:%.*]] = icmp ne i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_NE_6:%.*]] = icmp ne i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_1]], i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 [[CMP_NE_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGT_1:%.*]] = icmp ugt i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGT_2:%.*]] = icmp ugt i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_1]], i1 [[CMP_UGT_2]], i1 [[CMP_UGT_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGE_1:%.*]] = icmp uge i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_UGE_6:%.*]] = icmp uge i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_1]], i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 [[CMP_UGE_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_1:%.*]] = icmp sgt i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_2:%.*]] = icmp sgt i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SGT_6:%.*]] = icmp sgt i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_1]], i1 [[CMP_SGT_2]], i1 [[CMP_SGT_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 [[CMP_SGT_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_1:%.*]] = icmp sge i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_5:%.*]] = icmp sge i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_GTE_6:%.*]] = icmp sge i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_1]], i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 [[CMP_GTE_5]], i1 [[CMP_GTE_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_1:%.*]] = icmp slt i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_5:%.*]] = icmp slt i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_SLT_6:%.*]] = icmp slt i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_1]], i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 [[CMP_SLT_5]], i1 [[CMP_SLT_6]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_1:%.*]] = icmp sle i32 [[RET]], 10<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_2:%.*]] = icmp sle i32 [[RET]], 9<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP_LTE_6:%.*]] = icmp sle i32 [[RET]], -1<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]])<br>
-; CGSCC_NEW_PM-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]])<br>
-; CGSCC_NEW_PM-NEXT:    ret void<br>
-;<br>
   ; ret = [0, 10)<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test0-icmp-check<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree readonly align 4 [[P]]) #4, !range !0<br>
+; IS__TUNIT____-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
+; IS__TUNIT____-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 false, i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 false)<br>
+; IS__TUNIT____-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
+; IS__TUNIT____-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 true, i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 true)<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_UGT_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 false, i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 false)<br>
+; IS__TUNIT____-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 false, i1 false, i1 [[CMP_SGT_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 true)<br>
+; IS__TUNIT____-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
+; IS__TUNIT____-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 false, i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 true, i1 true)<br>
+; IS__TUNIT____-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
+; IS__TUNIT____-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 true, i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 false, i1 false)<br>
+; IS__TUNIT____-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
+; IS__TUNIT____-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
+; IS__TUNIT____-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 true, i1 true, i1 [[CMP_LTE_3]])<br>
+; IS__TUNIT____-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 false)<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test0-icmp-check<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[RET:%.*]] = tail call i32 @test0(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_1:%.*]] = icmp eq i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_2:%.*]] = icmp eq i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_3:%.*]] = icmp eq i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_4:%.*]] = icmp eq i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_5:%.*]] = icmp eq i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_EQ_6:%.*]] = icmp eq i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_EQ_1]], i1 [[CMP_EQ_2]], i1 [[CMP_EQ_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_EQ_4]], i1 [[CMP_EQ_5]], i1 [[CMP_EQ_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_1:%.*]] = icmp ne i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_2:%.*]] = icmp ne i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_3:%.*]] = icmp ne i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_4:%.*]] = icmp ne i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_5:%.*]] = icmp ne i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_NE_6:%.*]] = icmp ne i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_NE_1]], i1 [[CMP_NE_2]], i1 [[CMP_NE_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_NE_4]], i1 [[CMP_NE_5]], i1 [[CMP_NE_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGT_1:%.*]] = icmp ugt i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGT_2:%.*]] = icmp ugt i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGT_3:%.*]] = icmp ugt i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGT_4:%.*]] = icmp ugt i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGT_5:%.*]] = icmp ugt i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_UGT_1]], i1 [[CMP_UGT_2]], i1 [[CMP_UGT_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_UGT_4]], i1 [[CMP_UGT_5]], i1 false)<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGE_1:%.*]] = icmp uge i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGE_2:%.*]] = icmp uge i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGE_3:%.*]] = icmp uge i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGE_4:%.*]] = icmp uge i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_UGE_6:%.*]] = icmp uge i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_UGE_1]], i1 [[CMP_UGE_2]], i1 [[CMP_UGE_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_UGE_4]], i1 true, i1 [[CMP_UGE_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_1:%.*]] = icmp sgt i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_2:%.*]] = icmp sgt i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_3:%.*]] = icmp sgt i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_4:%.*]] = icmp sgt i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_5:%.*]] = icmp sgt i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_SGT_6:%.*]] = icmp sgt i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_SGT_1]], i1 [[CMP_SGT_2]], i1 [[CMP_SGT_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_SGT_4]], i1 [[CMP_SGT_5]], i1 [[CMP_SGT_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_1:%.*]] = icmp sge i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_2:%.*]] = icmp sge i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_3:%.*]] = icmp sge i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_4:%.*]] = icmp sge i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_5:%.*]] = icmp sge i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_GTE_6:%.*]] = icmp sge i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_GTE_1]], i1 [[CMP_GTE_2]], i1 [[CMP_GTE_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_GTE_4]], i1 [[CMP_GTE_5]], i1 [[CMP_GTE_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_1:%.*]] = icmp slt i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_2:%.*]] = icmp slt i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_3:%.*]] = icmp slt i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_4:%.*]] = icmp slt i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_5:%.*]] = icmp slt i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_SLT_6:%.*]] = icmp slt i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_SLT_1]], i1 [[CMP_SLT_2]], i1 [[CMP_SLT_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_SLT_4]], i1 [[CMP_SLT_5]], i1 [[CMP_SLT_6]])<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_1:%.*]] = icmp sle i32 [[RET]], 10<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_2:%.*]] = icmp sle i32 [[RET]], 9<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_3:%.*]] = icmp sle i32 [[RET]], 8<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_4:%.*]] = icmp sle i32 [[RET]], 1<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_5:%.*]] = icmp sle i32 [[RET]], 0<br>
+; IS__CGSCC____-NEXT:    [[CMP_LTE_6:%.*]] = icmp sle i32 [[RET]], -1<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_LTE_1]], i1 [[CMP_LTE_2]], i1 [[CMP_LTE_3]])<br>
+; IS__CGSCC____-NEXT:    tail call void @use3(i1 [[CMP_LTE_4]], i1 [[CMP_LTE_5]], i1 [[CMP_LTE_6]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   %ret = tail call i32 @test0(i32 *%p)<br>
<br>
   ; ret = [0, 10), eq<br>
@@ -383,29 +258,18 @@ define i32 @test1(i32* %p) {<br>
 }<br>
<br>
 define i1 @test1-check(i32* %p) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test1-check<br>
-; OLD_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; OLD_PM-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !2<br>
-; OLD_PM-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
-; OLD_PM-NEXT:    ret i1 [[CMP]]<br>
 ;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test1-check<br>
-; NEW_PM-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
-; NEW_PM-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly align 4 [[P]]) #{{[0-9]+}}, !range !2<br>
-; NEW_PM-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
-; NEW_PM-NEXT:    ret i1 [[CMP]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test1-check<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readonly align 4 [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree readonly align 4 [[P]]) #4, !range !2<br>
+; IS__TUNIT____-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
+; IS__TUNIT____-NEXT:    ret i1 [[CMP]]<br>
 ;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test1-check<br>
-; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
-; CGSCC_OLD_PM-NEXT:    ret i1 [[CMP]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test1-check<br>
-; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
-; CGSCC_NEW_PM-NEXT:    ret i1 [[CMP]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test1-check<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[RES:%.*]] = tail call i32 @test1(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    [[CMP:%.*]] = icmp eq i32 [[RES]], 500<br>
+; IS__CGSCC____-NEXT:    ret i1 [[CMP]]<br>
 ;<br>
   %res = tail call i32 @test1(i32* %p)<br>
   %cmp = icmp eq i32 %res, 500<br>
@@ -441,55 +305,30 @@ entry:<br>
 }<br>
<br>
 define i32 @test2_check(i32* %p) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test2_check<br>
-; OLD_PM-SAME: (i32* nocapture nofree readnone align 4 [[P:%.*]])<br>
-; OLD_PM-NEXT:  entry:<br>
-; OLD_PM-NEXT:    br label [[IF_THEN:%.*]]<br>
-; OLD_PM:       if.then:<br>
-; OLD_PM-NEXT:    br label [[RETURN:%.*]]<br>
-; OLD_PM:       if.end:<br>
-; OLD_PM-NEXT:    unreachable<br>
-; OLD_PM:       return:<br>
-; OLD_PM-NEXT:    ret i32 2<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test2_check<br>
-; NEW_PM-SAME: (i32* nocapture nofree readnone align 4 [[P:%.*]])<br>
-; NEW_PM-NEXT:  entry:<br>
-; NEW_PM-NEXT:    br label [[IF_THEN:%.*]]<br>
-; NEW_PM:       if.then:<br>
-; NEW_PM-NEXT:    br label [[RETURN:%.*]]<br>
-; NEW_PM:       if.end:<br>
-; NEW_PM-NEXT:    unreachable<br>
-; NEW_PM:       return:<br>
-; NEW_PM-NEXT:    ret i32 2<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test2_check<br>
-; CGSCC_OLD_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:  entry:<br>
-; CGSCC_OLD_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test2(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_OLD_PM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL]], 5<br>
-; CGSCC_OLD_PM-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
-; CGSCC_OLD_PM:       if.then:<br>
-; CGSCC_OLD_PM-NEXT:    br label [[RETURN:%.*]]<br>
-; CGSCC_OLD_PM:       if.end:<br>
-; CGSCC_OLD_PM-NEXT:    br label [[RETURN]]<br>
-; CGSCC_OLD_PM:       return:<br>
-; CGSCC_OLD_PM-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ]<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 [[RETVAL_0]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test2_check<br>
-; CGSCC_NEW_PM-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:  entry:<br>
-; CGSCC_NEW_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test2(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
-; CGSCC_NEW_PM-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL]], 5<br>
-; CGSCC_NEW_PM-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
-; CGSCC_NEW_PM:       if.then:<br>
-; CGSCC_NEW_PM-NEXT:    br label [[RETURN:%.*]]<br>
-; CGSCC_NEW_PM:       if.end:<br>
-; CGSCC_NEW_PM-NEXT:    br label [[RETURN]]<br>
-; CGSCC_NEW_PM:       return:<br>
-; CGSCC_NEW_PM-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ]<br>
-; CGSCC_NEW_PM-NEXT:    ret i32 [[RETVAL_0]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test2_check<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree readnone align 4 [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    br label [[IF_THEN:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    unreachable<br>
+; IS__TUNIT____:       return:<br>
+; IS__TUNIT____-NEXT:    ret i32 2<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test2_check<br>
+; IS__CGSCC____-SAME: (i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = tail call i32 @test2(i32* nocapture nofree nonnull readonly align 4 dereferenceable(4) [[P]])<br>
+; IS__CGSCC____-NEXT:    [[CMP:%.*]] = icmp slt i32 [[CALL]], 5<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 2, [[IF_THEN]] ], [ 3, [[IF_END]] ]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[RETVAL_0]]<br>
 ;<br>
 entry:<br>
   %call = tail call i32 @test2(i32* %p)<br>
@@ -535,55 +374,38 @@ return:                                           ; preds = %if.end, %if.then<br>
 declare dso_local void @unkown()<br>
<br>
 define internal i32 @r1(i32) local_unnamed_addr {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr<br>
-; OLD_PM-NEXT:    br label [[TMP4:%.*]]<br>
-; OLD_PM:       1:<br>
-; OLD_PM-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000<br>
-; OLD_PM-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]]<br>
-; OLD_PM:       3:<br>
-; OLD_PM-NEXT:    ret i32 20<br>
-; OLD_PM:       f:<br>
-; OLD_PM-NEXT:    ret i32 10<br>
-; OLD_PM:       4:<br>
-; OLD_PM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ]<br>
-; OLD_PM-NEXT:    [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ]<br>
-; OLD_PM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]]<br>
-; OLD_PM-NEXT:    [[TMP8]] = add nuw nsw i32 [[TMP5]], 1<br>
-; OLD_PM-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100<br>
-; OLD_PM-NEXT:    br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]]<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr<br>
-; CGSCC_OLD_PM-NEXT:    br label [[TMP4:%.*]]<br>
-; CGSCC_OLD_PM:       1:<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000<br>
-; CGSCC_OLD_PM-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]]<br>
-; CGSCC_OLD_PM:       3:<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 20<br>
-; CGSCC_OLD_PM:       f:<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 10<br>
-; CGSCC_OLD_PM:       4:<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ]<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ]<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]]<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP8]] = add nuw nsw i32 [[TMP5]], 1<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100<br>
-; CGSCC_OLD_PM-NEXT:    br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr<br>
-; CGSCC_NEW_PM-NEXT:    br label [[TMP3:%.*]]<br>
-; CGSCC_NEW_PM:       1:<br>
-; CGSCC_NEW_PM-NEXT:    br label [[F:%.*]]<br>
-; CGSCC_NEW_PM:       2:<br>
-; CGSCC_NEW_PM-NEXT:    unreachable<br>
-; CGSCC_NEW_PM:       f:<br>
-; CGSCC_NEW_PM-NEXT:    ret i32 10<br>
-; CGSCC_NEW_PM:       3:<br>
-; CGSCC_NEW_PM-NEXT:    [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ]<br>
-; CGSCC_NEW_PM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ]<br>
-; CGSCC_NEW_PM-NEXT:    [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]]<br>
-; CGSCC_NEW_PM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP4]], 1<br>
-; CGSCC_NEW_PM-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100<br>
-; CGSCC_NEW_PM-NEXT:    br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]]<br>
+; IS________OPM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr<br>
+; IS________OPM-NEXT:    br label [[TMP4:%.*]]<br>
+; IS________OPM:       1:<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP7:%.*]], 10000<br>
+; IS________OPM-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[F:%.*]]<br>
+; IS________OPM:       3:<br>
+; IS________OPM-NEXT:    ret i32 20<br>
+; IS________OPM:       f:<br>
+; IS________OPM-NEXT:    ret i32 10<br>
+; IS________OPM:       4:<br>
+; IS________OPM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP8:%.*]], [[TMP4]] ]<br>
+; IS________OPM-NEXT:    [[TMP6:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP7]], [[TMP4]] ]<br>
+; IS________OPM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP5]], [[TMP6]]<br>
+; IS________OPM-NEXT:    [[TMP8]] = add nuw nsw i32 [[TMP5]], 1<br>
+; IS________OPM-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 100<br>
+; IS________OPM-NEXT:    br i1 [[TMP9]], label [[TMP1:%.*]], label [[TMP4]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@r1() local_unnamed_addr<br>
+; IS__CGSCC_NPM-NEXT:    br label [[TMP3:%.*]]<br>
+; IS__CGSCC_NPM:       1:<br>
+; IS__CGSCC_NPM-NEXT:    br label [[F:%.*]]<br>
+; IS__CGSCC_NPM:       2:<br>
+; IS__CGSCC_NPM-NEXT:    unreachable<br>
+; IS__CGSCC_NPM:       f:<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 10<br>
+; IS__CGSCC_NPM:       3:<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP4:%.*]] = phi i32 [ 0, [[TMP0:%.*]] ], [ [[TMP7:%.*]], [[TMP3]] ]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP0]] ], [ [[TMP6:%.*]], [[TMP3]] ]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP6]] = add nuw nsw i32 [[TMP4]], [[TMP5]]<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP7]] = add nuw nsw i32 [[TMP4]], 1<br>
+; IS__CGSCC_NPM-NEXT:    [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 100<br>
+; IS__CGSCC_NPM-NEXT:    br i1 [[TMP8]], label [[TMP1:%.*]], label [[TMP3]]<br>
 ;<br>
   br label %5<br>
<br>
@@ -604,43 +426,24 @@ f:<br>
 }<br>
<br>
 define void @f1(i32){<br>
-; OLD_PM-LABEL: define {{[^@]+}}@f1<br>
-; OLD_PM-SAME: (i32 [[TMP0:%.*]])<br>
-; OLD_PM-NEXT:    [[TMP2:%.*]] = tail call i32 @r1()<br>
-; OLD_PM-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15<br>
-; OLD_PM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]<br>
-; OLD_PM:       4:<br>
-; OLD_PM-NEXT:    tail call void @unkown()<br>
-; OLD_PM-NEXT:    br label [[TMP5]]<br>
-; OLD_PM:       5:<br>
-; OLD_PM-NEXT:    ret void<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@f1<br>
-; NEW_PM-SAME: (i32 [[TMP0:%.*]])<br>
-; NEW_PM-NEXT:    br label [[TMP3:%.*]]<br>
-; NEW_PM:       2:<br>
-; NEW_PM-NEXT:    unreachable<br>
-; NEW_PM:       3:<br>
-; NEW_PM-NEXT:    ret void<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@f1<br>
-; CGSCC_OLD_PM-SAME: (i32 [[TMP0:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP2:%.*]] = tail call i32 @r1()<br>
-; CGSCC_OLD_PM-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15<br>
-; CGSCC_OLD_PM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]<br>
-; CGSCC_OLD_PM:       4:<br>
-; CGSCC_OLD_PM-NEXT:    tail call void @unkown()<br>
-; CGSCC_OLD_PM-NEXT:    br label [[TMP5]]<br>
-; CGSCC_OLD_PM:       5:<br>
-; CGSCC_OLD_PM-NEXT:    ret void<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@f1<br>
-; CGSCC_NEW_PM-SAME: (i32 [[TMP0:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    br label [[TMP3:%.*]]<br>
-; CGSCC_NEW_PM:       2:<br>
-; CGSCC_NEW_PM-NEXT:    unreachable<br>
-; CGSCC_NEW_PM:       3:<br>
-; CGSCC_NEW_PM-NEXT:    ret void<br>
+; IS________OPM-LABEL: define {{[^@]+}}@f1<br>
+; IS________OPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________OPM-NEXT:    [[TMP2:%.*]] = tail call i32 @r1()<br>
+; IS________OPM-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP2]], 15<br>
+; IS________OPM-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP5:%.*]]<br>
+; IS________OPM:       4:<br>
+; IS________OPM-NEXT:    tail call void @unkown()<br>
+; IS________OPM-NEXT:    br label [[TMP5]]<br>
+; IS________OPM:       5:<br>
+; IS________OPM-NEXT:    ret void<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@f1<br>
+; IS________NPM-SAME: (i32 [[TMP0:%.*]])<br>
+; IS________NPM-NEXT:    br label [[TMP3:%.*]]<br>
+; IS________NPM:       2:<br>
+; IS________NPM-NEXT:    unreachable<br>
+; IS________NPM:       3:<br>
+; IS________NPM-NEXT:    ret void<br>
 ;<br>
   %2 = tail call i32 @r1(i32 %0)<br>
   %3 = icmp sgt i32 %2, 15<br>
@@ -745,65 +548,39 @@ return:                                           ; preds = %if.else, %if.then<br>
<br>
<br>
 define dso_local i32 @test4-g2(i32 %u) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test4-g2<br>
-; OLD_PM-SAME: (i32 [[U:%.*]])<br>
-; OLD_PM-NEXT:  entry:<br>
-; OLD_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]])<br>
-; OLD_PM-NEXT:    ret i32 [[CALL]]<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test4-g2<br>
-; NEW_PM-SAME: (i32 [[U:%.*]])<br>
-; NEW_PM-NEXT:  entry:<br>
-; NEW_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) #2, !range !3<br>
-; NEW_PM-NEXT:    ret i32 [[CALL]]<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test4-g2<br>
-; CGSCC_OLD_PM-SAME: (i32 [[U:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:  entry:<br>
-; CGSCC_OLD_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]])<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 [[CALL]]<br>
+; NOT_TUNIT_NPM-LABEL: define {{[^@]+}}@test4-g2<br>
+; NOT_TUNIT_NPM-SAME: (i32 [[U:%.*]])<br>
+; NOT_TUNIT_NPM-NEXT:  entry:<br>
+; NOT_TUNIT_NPM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]])<br>
+; NOT_TUNIT_NPM-NEXT:    ret i32 [[CALL]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@test4-g2<br>
+; IS__TUNIT_NPM-SAME: (i32 [[U:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]]) #2, !range !3<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[CALL]]<br>
 ;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test4-g2<br>
-; CGSCC_NEW_PM-SAME: (i32 [[U:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:  entry:<br>
-; CGSCC_NEW_PM-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]])<br>
-; CGSCC_NEW_PM-NEXT:    ret i32 [[CALL]]<br>
-;<br>
-; CGSCC-LABEL: define {{[^@]+}}@test4-g2<br>
-; CGSCC-SAME: (i32 [[U:%.*]])<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    [[CALL:%.*]] = tail call i32 @test4-f2(i32 [[U]])<br>
-; CGSCC-NEXT:    ret i32 [[CALL]]<br>
 entry:<br>
   %call = tail call i32 @test4-f2(i32 %u)<br>
   ret i32 %call<br>
 }<br>
<br>
 define dso_local i32 @test-5() {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@test-5()<br>
-; OLD_PM-NEXT:  entry:<br>
-; OLD_PM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0), !range !3<br>
-; OLD_PM-NEXT:    ret i32 [[CALL]]<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@test-5()<br>
-; NEW_PM-NEXT:  entry:<br>
-; NEW_PM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0), !range !4<br>
-; NEW_PM-NEXT:    ret i32 [[CALL]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@test-5()<br>
+; IS__TUNIT_OPM-NEXT:  entry:<br>
+; IS__TUNIT_OPM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0), !range !3<br>
+; IS__TUNIT_OPM-NEXT:    ret i32 [[CALL]]<br>
 ;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@test-5()<br>
-; CGSCC_OLD_PM-NEXT:  entry:<br>
-; CGSCC_OLD_PM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0)<br>
-; CGSCC_OLD_PM-NEXT:    ret i32 [[CALL]]<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@test-5()<br>
+; IS__TUNIT_NPM-NEXT:  entry:<br>
+; IS__TUNIT_NPM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0), !range !4<br>
+; IS__TUNIT_NPM-NEXT:    ret i32 [[CALL]]<br>
 ;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@test-5()<br>
-; CGSCC_NEW_PM-NEXT:  entry:<br>
-; CGSCC_NEW_PM-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0)<br>
-; CGSCC_NEW_PM-NEXT:    ret i32 [[CALL]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test-5()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0)<br>
+; IS__CGSCC____-NEXT:    ret i32 [[CALL]]<br>
 ;<br>
-; CGSCC-LABEL: define {{[^@]+}}@test-5()<br>
-; CGSCC-NEXT:  entry:<br>
-; CGSCC-NEXT:    [[CALL:%.*]] = call i32 @rec(i32 0)<br>
-; CGSCC-NEXT:    ret i32 [[CALL]]<br>
 entry:<br>
   %call = call i32 @rec(i32 0)<br>
   ret i32 %call<br>
@@ -1087,23 +864,15 @@ define i8 @undef_collapse_2() {<br>
 }<br>
<br>
 define i8 @undef_collapse_caller() {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
-; OLD_PM-NEXT:    ret i8 0<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
-; NEW_PM-NEXT:    ret i8 0<br>
 ;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
-; CGSCC_OLD_PM-NEXT:    [[C1:%.*]] = call i8 @undef_collapse_1()<br>
-; CGSCC_OLD_PM-NEXT:    [[C2:%.*]] = call i8 @undef_collapse_2()<br>
-; CGSCC_OLD_PM-NEXT:    [[A:%.*]] = add i8 [[C1]], [[C2]]<br>
-; CGSCC_OLD_PM-NEXT:    ret i8 [[A]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
+; IS__TUNIT____-NEXT:    ret i8 0<br>
 ;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
-; CGSCC_NEW_PM-NEXT:    [[C1:%.*]] = call i8 @undef_collapse_1()<br>
-; CGSCC_NEW_PM-NEXT:    [[C2:%.*]] = call i8 @undef_collapse_2()<br>
-; CGSCC_NEW_PM-NEXT:    [[A:%.*]] = add i8 [[C1]], [[C2]]<br>
-; CGSCC_NEW_PM-NEXT:    ret i8 [[A]]<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@undef_collapse_caller()<br>
+; IS__CGSCC____-NEXT:    [[C1:%.*]] = call i8 @undef_collapse_1()<br>
+; IS__CGSCC____-NEXT:    [[C2:%.*]] = call i8 @undef_collapse_2()<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = add i8 [[C1]], [[C2]]<br>
+; IS__CGSCC____-NEXT:    ret i8 [[A]]<br>
 ;<br>
   %c1 = call i8 @undef_collapse_1()<br>
   %c2 = call i8 @undef_collapse_2()<br>
@@ -1121,35 +890,21 @@ define i32 @ret1or2(i1 %c) {<br>
   ret i32 %s<br>
 }<br>
 define i1 @callee_range_1(i1 %c1, i1 %c2, i1 %c3) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@callee_range_1<br>
-; OLD_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
-; OLD_PM-NEXT:    ret i1 true<br>
 ;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@callee_range_1<br>
-; NEW_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
-; NEW_PM-NEXT:    ret i1 true<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@callee_range_1<br>
-; CGSCC_OLD_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
-; CGSCC_OLD_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
-; CGSCC_OLD_PM-NEXT:    [[INDIRECTION:%.*]] = select i1 [[C3]], i32 [[R1]], i32 [[R2]]<br>
-; CGSCC_OLD_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[INDIRECTION]]<br>
-; CGSCC_OLD_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 4<br>
-; CGSCC_OLD_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; CGSCC_OLD_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; CGSCC_OLD_PM-NEXT:    ret i1 [[F]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@callee_range_1<br>
-; CGSCC_NEW_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
-; CGSCC_NEW_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
-; CGSCC_NEW_PM-NEXT:    [[INDIRECTION:%.*]] = select i1 [[C3]], i32 [[R1]], i32 [[R2]]<br>
-; CGSCC_NEW_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[INDIRECTION]]<br>
-; CGSCC_NEW_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 4<br>
-; CGSCC_NEW_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; CGSCC_NEW_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; CGSCC_NEW_PM-NEXT:    ret i1 [[F]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@callee_range_1<br>
+; IS__TUNIT____-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
+; IS__TUNIT____-NEXT:    ret i1 true<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callee_range_1<br>
+; IS__CGSCC____-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]], i1 [[C3:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
+; IS__CGSCC____-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
+; IS__CGSCC____-NEXT:    [[INDIRECTION:%.*]] = select i1 [[C3]], i32 [[R1]], i32 [[R2]]<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = add i32 [[R1]], [[INDIRECTION]]<br>
+; IS__CGSCC____-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 4<br>
+; IS__CGSCC____-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
+; IS__CGSCC____-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
+; IS__CGSCC____-NEXT:    ret i1 [[F]]<br>
 ;<br>
   %r1 = call i32 @ret1or2(i1 %c1)<br>
   %r2 = call i32 @ret1or2(i1 %c2)<br>
@@ -1162,45 +917,36 @@ define i1 @callee_range_1(i1 %c1, i1 %c2, i1 %c3) {<br>
 }<br>
<br>
 define i1 @callee_range_2(i1 %c1, i1 %c2) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@callee_range_2<br>
-; OLD_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
-; OLD_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #2, !range !4<br>
-; OLD_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]]) #3, !range !4<br>
-; OLD_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
-; OLD_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
-; OLD_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; OLD_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; OLD_PM-NEXT:    ret i1 [[F]]<br>
-;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@callee_range_2<br>
-; NEW_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
-; NEW_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #2, !range !5<br>
-; NEW_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]]) #3, !range !5<br>
-; NEW_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
-; NEW_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
-; NEW_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; NEW_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; NEW_PM-NEXT:    ret i1 [[F]]<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@callee_range_2<br>
-; CGSCC_OLD_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
-; CGSCC_OLD_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
-; CGSCC_OLD_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
-; CGSCC_OLD_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
-; CGSCC_OLD_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; CGSCC_OLD_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; CGSCC_OLD_PM-NEXT:    ret i1 [[F]]<br>
 ;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@callee_range_2<br>
-; CGSCC_NEW_PM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
-; CGSCC_NEW_PM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
-; CGSCC_NEW_PM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
-; CGSCC_NEW_PM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
-; CGSCC_NEW_PM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
-; CGSCC_NEW_PM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
-; CGSCC_NEW_PM-NEXT:    ret i1 [[F]]<br>
+; IS__TUNIT_OPM-LABEL: define {{[^@]+}}@callee_range_2<br>
+; IS__TUNIT_OPM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
+; IS__TUNIT_OPM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #2, !range !4<br>
+; IS__TUNIT_OPM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]]) #3, !range !4<br>
+; IS__TUNIT_OPM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
+; IS__TUNIT_OPM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
+; IS__TUNIT_OPM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
+; IS__TUNIT_OPM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
+; IS__TUNIT_OPM-NEXT:    ret i1 [[F]]<br>
+;<br>
+; IS__TUNIT_NPM-LABEL: define {{[^@]+}}@callee_range_2<br>
+; IS__TUNIT_NPM-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
+; IS__TUNIT_NPM-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]]) #2, !range !5<br>
+; IS__TUNIT_NPM-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]]) #3, !range !5<br>
+; IS__TUNIT_NPM-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
+; IS__TUNIT_NPM-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
+; IS__TUNIT_NPM-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
+; IS__TUNIT_NPM-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
+; IS__TUNIT_NPM-NEXT:    ret i1 [[F]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callee_range_2<br>
+; IS__CGSCC____-SAME: (i1 [[C1:%.*]], i1 [[C2:%.*]])<br>
+; IS__CGSCC____-NEXT:    [[R1:%.*]] = call i32 @ret1or2(i1 [[C1]])<br>
+; IS__CGSCC____-NEXT:    [[R2:%.*]] = call i32 @ret1or2(i1 [[C2]])<br>
+; IS__CGSCC____-NEXT:    [[A:%.*]] = add i32 [[R1]], [[R2]]<br>
+; IS__CGSCC____-NEXT:    [[I1:%.*]] = icmp sle i32 [[A]], 3<br>
+; IS__CGSCC____-NEXT:    [[I2:%.*]] = icmp sge i32 [[A]], 2<br>
+; IS__CGSCC____-NEXT:    [[F:%.*]] = and i1 [[I1]], [[I2]]<br>
+; IS__CGSCC____-NEXT:    ret i1 [[F]]<br>
 ;<br>
   %r1 = call i32 @ret1or2(i1 %c1)<br>
   %r2 = call i32 @ret1or2(i1 %c2)<br>
@@ -1220,53 +966,30 @@ define i32 @ret100() {<br>
 }<br>
<br>
 define i1 @ctx_adjustment(i32 %V) {<br>
-; OLD_PM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
-; OLD_PM-SAME: (i32 [[V:%.*]])<br>
-; OLD_PM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
-; OLD_PM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
-; OLD_PM:       if.true:<br>
-; OLD_PM-NEXT:    br label [[END:%.*]]<br>
-; OLD_PM:       if.false:<br>
-; OLD_PM-NEXT:    br label [[END]]<br>
-; OLD_PM:       end:<br>
-; OLD_PM-NEXT:    [[PHI:%.*]] = phi i32 [ [[V]], [[IF_TRUE]] ], [ 100, [[IF_FALSE]] ]<br>
-; OLD_PM-NEXT:    [[C2:%.*]] = icmp sge i32 [[PHI]], 100<br>
-; OLD_PM-NEXT:    ret i1 [[C2]]<br>
 ;<br>
-; NEW_PM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
-; NEW_PM-SAME: (i32 [[V:%.*]])<br>
-; NEW_PM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
-; NEW_PM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
-; NEW_PM:       if.true:<br>
-; NEW_PM-NEXT:    br label [[END:%.*]]<br>
-; NEW_PM:       if.false:<br>
-; NEW_PM-NEXT:    br label [[END]]<br>
-; NEW_PM:       end:<br>
-; NEW_PM-NEXT:    ret i1 true<br>
-;<br>
-; CGSCC_OLD_PM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
-; CGSCC_OLD_PM-SAME: (i32 [[V:%.*]])<br>
-; CGSCC_OLD_PM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
-; CGSCC_OLD_PM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
-; CGSCC_OLD_PM:       if.true:<br>
-; CGSCC_OLD_PM-NEXT:    br label [[END:%.*]]<br>
-; CGSCC_OLD_PM:       if.false:<br>
-; CGSCC_OLD_PM-NEXT:    br label [[END]]<br>
-; CGSCC_OLD_PM:       end:<br>
-; CGSCC_OLD_PM-NEXT:    [[PHI:%.*]] = phi i32 [ [[V]], [[IF_TRUE]] ], [ 100, [[IF_FALSE]] ]<br>
-; CGSCC_OLD_PM-NEXT:    [[C2:%.*]] = icmp sge i32 [[PHI]], 100<br>
-; CGSCC_OLD_PM-NEXT:    ret i1 [[C2]]<br>
-;<br>
-; CGSCC_NEW_PM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
-; CGSCC_NEW_PM-SAME: (i32 [[V:%.*]])<br>
-; CGSCC_NEW_PM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
-; CGSCC_NEW_PM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
-; CGSCC_NEW_PM:       if.true:<br>
-; CGSCC_NEW_PM-NEXT:    br label [[END:%.*]]<br>
-; CGSCC_NEW_PM:       if.false:<br>
-; CGSCC_NEW_PM-NEXT:    br label [[END]]<br>
-; CGSCC_NEW_PM:       end:<br>
-; CGSCC_NEW_PM-NEXT:    ret i1 true<br>
+; IS________OPM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
+; IS________OPM-SAME: (i32 [[V:%.*]])<br>
+; IS________OPM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
+; IS________OPM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; IS________OPM:       if.true:<br>
+; IS________OPM-NEXT:    br label [[END:%.*]]<br>
+; IS________OPM:       if.false:<br>
+; IS________OPM-NEXT:    br label [[END]]<br>
+; IS________OPM:       end:<br>
+; IS________OPM-NEXT:    [[PHI:%.*]] = phi i32 [ [[V]], [[IF_TRUE]] ], [ 100, [[IF_FALSE]] ]<br>
+; IS________OPM-NEXT:    [[C2:%.*]] = icmp sge i32 [[PHI]], 100<br>
+; IS________OPM-NEXT:    ret i1 [[C2]]<br>
+;<br>
+; IS________NPM-LABEL: define {{[^@]+}}@ctx_adjustment<br>
+; IS________NPM-SAME: (i32 [[V:%.*]])<br>
+; IS________NPM-NEXT:    [[C1:%.*]] = icmp sge i32 [[V]], 100<br>
+; IS________NPM-NEXT:    br i1 [[C1]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; IS________NPM:       if.true:<br>
+; IS________NPM-NEXT:    br label [[END:%.*]]<br>
+; IS________NPM:       if.false:<br>
+; IS________NPM-NEXT:    br label [[END]]<br>
+; IS________NPM:       end:<br>
+; IS________NPM-NEXT:    ret i1 true<br>
 ;<br>
   %c1 = icmp sge i32 %V, 100<br>
   br i1 %c1, label %if.true, label %if.false<br>
@@ -1284,9 +1007,22 @@ end:<br>
<br>
 !0 = !{i32 0, i32 10}<br>
 !1 = !{i32 10, i32 100}<br>
-; CHECK: !0 = !{i32 0, i32 10}<br>
-; CHECK-NEXT: !1 = !{i32 10, i32 100}<br>
-; NEW_PM:     !2 = !{i32 200, i32 1091}<br>
-; OLD_PM:     !3 = !{i32 0, i32 2}<br>
-; NEW_PM:     !3 = !{i32 1, i32 -2147483648}<br>
-; NEW_PM:     !4 = !{i32 0, i32 2}<br>
+<br>
+; NOT_TUNIT____: !0 = !{i32 0, i32 10}<br>
+; NOT_TUNIT____: !1 = !{i32 10, i32 100}<br>
+; NOT_TUNIT____-NOT: !2<br>
+<br>
+; IS__TUNIT_OPM: !0 = !{i32 0, i32 10}<br>
+; IS__TUNIT_OPM: !1 = !{i32 10, i32 100}<br>
+; IS__TUNIT_OPM: !2 = !{i32 200, i32 1091}<br>
+; IS__TUNIT_OPM: !3 = !{i32 0, i32 2}<br>
+; IS__TUNIT_OPM: !4 = !{i32 1, i32 3}<br>
+; IS__TUNIT_OPM-NOT: !5<br>
+<br>
+; IS__TUNIT_NPM: !0 = !{i32 0, i32 10}<br>
+; IS__TUNIT_NPM: !1 = !{i32 10, i32 100}<br>
+; IS__TUNIT_NPM: !2 = !{i32 200, i32 1091}<br>
+; IS__TUNIT_NPM: !3 = !{i32 1, i32 -2147483648}<br>
+; IS__TUNIT_NPM: !4 = !{i32 0, i32 2}<br>
+; IS__TUNIT_NPM: !5 = !{i32 1, i32 3}<br>
+; IS__TUNIT_NPM-NOT: !6<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll b/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll<br>
index 1ddde3a9bcb4..673f17f66437 100644<br>
--- a/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll<br>
+++ b/llvm/test/Transforms/Attributor/read_write_returned_arguments_scc.ll<br>
@@ -1,4 +1,9 @@<br>
-; RUN: opt -functionattrs -enable-nonnull-arg-prop -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
 ;<br>
 ; This is an evolved example to stress test SCC parameter attribute propagation.<br>
 ; The SCC in this test is made up of the following six function, three of which<br>
@@ -30,8 +35,16 @@<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree nosync nounwind<br>
-; CHECK-NEXT: define i32* @external_ret2_nrw(i32* nofree %n0, i32* nofree %r0, i32* nofree returned %w0)<br>
 define i32* @external_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@external_ret2_nrw<br>
+; CHECK-SAME: (i32* nofree [[N0:%.*]], i32* nofree [[R0:%.*]], i32* nofree returned [[W0:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @internal_ret0_nw(i32* nofree [[N0]], i32* nofree [[W0]])<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32* @internal_ret1_rrw(i32* nofree align 4 [[R0]], i32* nofree [[R0]], i32* nofree [[W0]])<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree readonly align 4 [[R0]], i32* nofree writeonly [[W0]])<br>
+; CHECK-NEXT:    [[CALL3:%.*]] = call i32* @internal_ret1_rw(i32* nofree align 4 [[R0]], i32* nofree [[W0]])<br>
+; CHECK-NEXT:    ret i32* [[CALL3]]<br>
+;<br>
 entry:<br>
   %call = call i32* @internal_ret0_nw(i32* %n0, i32* %w0)<br>
   %call1 = call i32* @internal_ret1_rrw(i32* %r0, i32* %r0, i32* %w0)<br>
@@ -41,8 +54,55 @@ entry:<br>
 }<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree nosync nounwind<br>
-; CHECK-NEXT: define internal i32* @internal_ret0_nw(i32* nofree returned %n0, i32* nofree %w0)<br>
 define internal i32* @internal_ret0_nw(i32* %n0, i32* %w0) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@internal_ret0_nw<br>
+; IS__TUNIT____-SAME: (i32* nofree returned [[N0:%.*]], i32* nofree [[W0:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[R0:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    [[R1:%.*]] = alloca i32, align 4<br>
+; IS__TUNIT____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32* [[N0]], null<br>
+; IS__TUNIT____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    store i32 3, i32* [[R0]], align 4<br>
+; IS__TUNIT____-NEXT:    store i32 5, i32* [[R1]], align 4<br>
+; IS__TUNIT____-NEXT:    store i32 1, i32* [[W0]], align 4<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @internal_ret1_rrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL2:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL4:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) "no-capture-maybe-returned" [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL5:%.*]] = call i32* @internal_ret0_nw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN]]<br>
+; IS__TUNIT____:       return:<br>
+; IS__TUNIT____-NEXT:    [[RETVAL_0:%.*]] = phi i32* [ [[CALL5]], [[IF_END]] ], [ [[N0]], [[IF_THEN]] ]<br>
+; IS__TUNIT____-NEXT:    ret i32* [[RETVAL_0]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@internal_ret0_nw<br>
+; IS__CGSCC____-SAME: (i32* nofree returned [[N0:%.*]], i32* nofree [[W0:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[R0:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    [[R1:%.*]] = alloca i32, align 4<br>
+; IS__CGSCC____-NEXT:    [[TOBOOL:%.*]] = icmp ne i32* [[N0]], null<br>
+; IS__CGSCC____-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    store i32 3, i32* [[R0]], align 4<br>
+; IS__CGSCC____-NEXT:    store i32 5, i32* [[R1]], align 4<br>
+; IS__CGSCC____-NEXT:    store i32 1, i32* [[W0]], align 4<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32* @internal_ret1_rrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL2:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL4:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL5:%.*]] = call i32* @internal_ret0_nw(i32* nofree [[N0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    [[RETVAL_0:%.*]] = phi i32* [ [[CALL5]], [[IF_END]] ], [ [[N0]], [[IF_THEN]] ]<br>
+; IS__CGSCC____-NEXT:    ret i32* [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %r0 = alloca i32, align 4<br>
   %r1 = alloca i32, align 4<br>
@@ -70,8 +130,34 @@ return:                                           ; preds = %if.end, %if.then<br>
 }<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree nosync nounwind<br>
-; CHECK-NEXT: define internal i32* @internal_ret1_rrw(i32* nofree nonnull align 4 dereferenceable(4) %r0, i32* nofree returned %r1, i32* nofree %w0)<br>
 define internal i32* @internal_ret1_rrw(i32* %r0, i32* %r1, i32* %w0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@internal_ret1_rrw<br>
+; CHECK-SAME: (i32* nofree nonnull align 4 dereferenceable(4) [[R0:%.*]], i32* nofree returned [[R1:%.*]], i32* nofree [[W0:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[R0]], align 4<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    br label [[RETURN:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @internal_ret1_rw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree [[W0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[R0]], align 4<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = load i32, i32* [[R1]], align 4<br>
+; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP1]], [[TMP2]]<br>
+; CHECK-NEXT:    store i32 [[ADD]], i32* [[W0]], align 4<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32* @internal_ret1_rw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL3:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[W0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL4:%.*]] = call i32* @external_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL5:%.*]] = call i32* @external_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL6:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R1]], i32* nofree nonnull writeonly align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL7:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL8:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[R1]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32* [ [[CALL8]], [[IF_END]] ], [ [[R1]], [[IF_THEN]] ]<br>
+; CHECK-NEXT:    ret i32* undef<br>
+;<br>
 entry:<br>
   %0 = load i32, i32* %r0, align 4<br>
   %tobool = icmp ne i32 %0, 0<br>
@@ -101,9 +187,23 @@ return:                                           ; preds = %if.end, %if.then<br>
   ret i32* %retval.0<br>
 }<br>
<br>
-; CHECK: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn<br>
-; CHECK-NEXT: define i32* @external_sink_ret2_nrw(i32* nofree readnone %n0, i32* nocapture nofree readonly %r0, i32* nofree returned writeonly "no-capture-maybe-returned" %w0)<br>
+; IS__TUNIT____: Function Attrs: argmemonly nofree nosync nounwind willreturn<br>
+; IS__CGSCC____: Function Attrs: argmemonly nofree norecurse nosync nounwind willreturn<br>
 define i32* @external_sink_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@external_sink_ret2_nrw<br>
+; CHECK-SAME: (i32* nofree [[N0:%.*]], i32* nocapture nofree readonly [[R0:%.*]], i32* nofree returned writeonly "no-capture-maybe-returned" [[W0:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32* [[N0]], null<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    br label [[RETURN:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[R0]], align 4<br>
+; CHECK-NEXT:    store i32 [[TMP0]], i32* [[W0]], align 4<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    ret i32* [[W0]]<br>
+;<br>
 entry:<br>
   %tobool = icmp ne i32* %n0, null<br>
   br i1 %tobool, label %if.end, label %if.then<br>
@@ -121,8 +221,28 @@ return:                                           ; preds = %if.end, %if.then<br>
 }<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree nosync nounwind<br>
-; CHECK-NEXT: define internal i32* @internal_ret1_rw(i32* nofree nonnull align 4 dereferenceable(4) %r0, i32* nofree returned %w0)<br>
 define internal i32* @internal_ret1_rw(i32* %r0, i32* %w0) {<br>
+; CHECK-LABEL: define {{[^@]+}}@internal_ret1_rw<br>
+; CHECK-SAME: (i32* nofree nonnull align 4 dereferenceable(4) [[R0:%.*]], i32* nofree returned [[W0:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, i32* [[R0]], align 4<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp ne i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    br label [[RETURN:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @internal_ret1_rrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree [[W0]])<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[R0]], align 4<br>
+; CHECK-NEXT:    store i32 [[TMP1]], i32* [[W0]], align 4<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL2:%.*]] = call i32* @internal_ret0_nw(i32* nofree nonnull align 4 dereferenceable(4) [[W0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL3:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull readonly align 4 dereferenceable(4) [[R0]], i32* nofree nonnull writeonly align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    [[CALL4:%.*]] = call i32* @external_ret2_nrw(i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[R0]], i32* nofree nonnull align 4 dereferenceable(4) [[W0]])<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32* [ [[CALL4]], [[IF_END]] ], [ [[W0]], [[IF_THEN]] ]<br>
+; CHECK-NEXT:    ret i32* [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %0 = load i32, i32* %r0, align 4<br>
   %tobool = icmp ne i32 %0, 0<br>
@@ -147,8 +267,21 @@ return:                                           ; preds = %if.end, %if.then<br>
 }<br>
<br>
 ; CHECK: Function Attrs: argmemonly nofree nosync nounwind<br>
-; CHECK-NEXT: define i32* @external_source_ret2_nrw(i32* nofree %n0, i32* nofree %r0, i32* nofree returned %w0)<br>
 define i32* @external_source_ret2_nrw(i32* %n0, i32* %r0, i32* %w0) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@external_source_ret2_nrw<br>
+; IS__TUNIT____-SAME: (i32* nofree [[N0:%.*]], i32* nofree [[R0:%.*]], i32* nofree returned [[W0:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nocapture nofree readonly [[R0]], i32* nofree writeonly "no-capture-maybe-returned" [[W0]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree [[R0]], i32* nofree [[W0]])<br>
+; IS__TUNIT____-NEXT:    ret i32* [[CALL1]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@external_source_ret2_nrw<br>
+; IS__CGSCC____-SAME: (i32* nofree [[N0:%.*]], i32* nofree [[R0:%.*]], i32* nofree returned [[W0:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32* @external_sink_ret2_nrw(i32* nofree [[N0]], i32* nofree readonly [[R0]], i32* nofree writeonly [[W0]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i32* @external_ret2_nrw(i32* nofree [[N0]], i32* nofree [[R0]], i32* nofree [[W0]])<br>
+; IS__CGSCC____-NEXT:    ret i32* [[CALL1]]<br>
+;<br>
 entry:<br>
   %call = call i32* @external_sink_ret2_nrw(i32* %n0, i32* %r0, i32* %w0)<br>
   %call1 = call i32* @external_ret2_nrw(i32* %n0, i32* %r0, i32* %w0)<br>
@@ -158,9 +291,17 @@ entry:<br>
 ; Verify that we see only expected attribute sets, the above lines only check<br>
 ; for a subset relation.<br>
 ;<br>
-; CHECK-NOT: attributes #<br>
-; CHECK: attributes #{{.*}} = { argmemonly nofree nosync nounwind }<br>
-; CHECK: attributes #{{.*}} = { argmemonly nofree norecurse nosync nounwind willreturn }<br>
-; CHECK: attributes #{{.*}} = { nosync nounwind }<br>
-; CHECK: attributes #{{.*}} = { norecurse nosync nounwind willreturn }<br>
-; CHECK-NOT: attributes #<br>
+; IS__CGSCC____-NOT: attributes #<br>
+; IS__CGSCC____: attributes #{{.*}} = { argmemonly nofree nosync nounwind }<br>
+; IS__CGSCC____: attributes #{{.*}} = { argmemonly nofree norecurse nosync nounwind willreturn }<br>
+; IS__CGSCC____: attributes #{{.*}} = { nofree nosync nounwind }<br>
+; IS__CGSCC____: attributes #{{.*}} = { nounwind }<br>
+; IS__CGSCC____: attributes #{{.*}} = { nounwind willreturn }<br>
+; IS__CGSCC____-NOT: attributes #<br>
+<br>
+; IS__TUNIT____-NOT: attributes #<br>
+; IS__TUNIT____: attributes #{{.*}} = { argmemonly nofree nosync nounwind }<br>
+; IS__TUNIT____: attributes #{{.*}} = { argmemonly nofree nosync nounwind willreturn }<br>
+; IS__TUNIT____: attributes #{{.*}} = { nofree nosync nounwind }<br>
+; IS__TUNIT____: attributes #{{.*}} = { nofree nosync nounwind willreturn }<br>
+; IS__TUNIT____-NOT: attributes #<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/readattrs.ll b/llvm/test/Transforms/Attributor/readattrs.ll<br>
index 08c13d92b01c..cadb79e3bc21 100644<br>
--- a/llvm/test/Transforms/Attributor/readattrs.ll<br>
+++ b/llvm/test/Transforms/Attributor/readattrs.ll<br>
@@ -1,6 +1,9 @@<br>
-; RUN: opt < %s -attributor -attributor-disable=false -S -attributor-annotate-decl-cs | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; RUN: opt < %s -aa-pipeline=basic-aa -passes='attributor' -attributor-disable=false -S -attributor-annotate-decl-cs | FileCheck %s --check-prefixes=ATTRIBUTOR<br>
-; Copied from Transforms/FunctionAttrs/readattrs.ll<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
+<br>
<br>
 @x = global i32 0<br>
<br>
@@ -8,111 +11,175 @@ declare void @test1_1(i8* %x1_1, i8* readonly %y1_1, ...)<br>
<br>
 ; NOTE: readonly for %y1_2 would be OK here but not for the similar situation in test13.<br>
 ;<br>
-; ATTRIBUTOR: define void @test1_2(i8* %x1_2, i8* %y1_2, i8* %z1_2)<br>
 define void @test1_2(i8* %x1_2, i8* %y1_2, i8* %z1_2) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test1_2<br>
+; CHECK-SAME: (i8* [[X1_2:%.*]], i8* [[Y1_2:%.*]], i8* [[Z1_2:%.*]])<br>
+; CHECK-NEXT:    call void (i8*, i8*, ...) @test1_1(i8* [[X1_2]], i8* readonly [[Y1_2]], i8* [[Z1_2]])<br>
+; CHECK-NEXT:    store i32 0, i32* @x, align 4<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void (i8*, i8*, ...) @test1_1(i8* %x1_2, i8* %y1_2, i8* %z1_2)<br>
   store i32 0, i32* @x<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i8* @test2(i8* nofree readnone returned %p)<br>
 define i8* @test2(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2<br>
+; CHECK-SAME: (i8* nofree readnone returned "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:    store i32 0, i32* @x, align 4<br>
+; CHECK-NEXT:    ret i8* [[P]]<br>
+;<br>
   store i32 0, i32* @x<br>
   ret i8* %p<br>
 }<br>
<br>
-; ATTRIBUTOR: define i1 @test3(i8* nofree readnone %p, i8* nofree readnone %q)<br>
 define i1 @test3(i8* %p, i8* %q) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test3<br>
+; CHECK-SAME: (i8* nofree readnone [[P:%.*]], i8* nofree readnone [[Q:%.*]])<br>
+; CHECK-NEXT:    [[A:%.*]] = icmp ult i8* [[P]], [[Q]]<br>
+; CHECK-NEXT:    ret i1 [[A]]<br>
+;<br>
   %A = icmp ult i8* %p, %q<br>
   ret i1 %A<br>
 }<br>
<br>
 declare void @test4_1(i8* nocapture) readonly<br>
<br>
-; ATTRIBUTOR: define void @test4_2(i8* nocapture readonly %p)<br>
 define void @test4_2(i8* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test4_2<br>
+; CHECK-SAME: (i8* nocapture readonly [[P:%.*]])<br>
+; CHECK-NEXT:    call void @test4_1(i8* nocapture readonly [[P]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @test4_1(i8* %p)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test5(i8** nocapture nofree nonnull writeonly align 8 dereferenceable(8) %p, i8* nofree writeonly %q)<br>
 ; Missed optz'n: we could make %q readnone, but don't break test6!<br>
 define void @test5(i8** %p, i8* %q) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test5<br>
+; CHECK-SAME: (i8** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[P:%.*]], i8* nofree writeonly [[Q:%.*]])<br>
+; CHECK-NEXT:    store i8* [[Q]], i8** [[P]], align 8<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8* %q, i8** %p<br>
   ret void<br>
 }<br>
<br>
 declare void @test6_1()<br>
-; ATTRIBUTOR: define void @test6_2(i8** nocapture nonnull writeonly align 8 dereferenceable(8) %p, i8* %q)<br>
 ; This is not a missed optz'n.<br>
 define void @test6_2(i8** %p, i8* %q) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test6_2<br>
+; CHECK-SAME: (i8** nocapture nonnull writeonly align 8 dereferenceable(8) [[P:%.*]], i8* [[Q:%.*]])<br>
+; CHECK-NEXT:    store i8* [[Q]], i8** [[P]], align 8<br>
+; CHECK-NEXT:    call void @test6_1()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8* %q, i8** %p<br>
   call void @test6_1()<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test7_1(i32* inalloca nocapture nofree writeonly %a)<br>
 ; inalloca parameters are always considered written<br>
 define void @test7_1(i32* inalloca %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test7_1<br>
+; CHECK-SAME: (i32* inalloca nocapture nofree writeonly [[A:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: define i32* @test8_1(i32* nofree readnone returned %p)<br>
 define i32* @test8_1(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test8_1<br>
+; CHECK-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[P:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32* [[P]]<br>
+;<br>
 entry:<br>
   ret i32* %p<br>
 }<br>
<br>
-; ATTRIBUTOR: define void @test8_2(i32* nocapture nofree writeonly %p)<br>
 define void @test8_2(i32* %p) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test8_2<br>
+; IS__TUNIT____-SAME: (i32* nocapture nofree writeonly [[P:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @test8_1(i32* noalias nofree readnone "no-capture-maybe-returned" [[P]])<br>
+; IS__TUNIT____-NEXT:    store i32 10, i32* [[CALL]], align 4<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test8_2<br>
+; IS__CGSCC____-SAME: (i32* nofree writeonly [[P:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call align 4 i32* @test8_1(i32* noalias nofree readnone [[P]])<br>
+; IS__CGSCC____-NEXT:    store i32 10, i32* [[CALL]], align 4<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i32* @test8_1(i32* %p)<br>
   store i32 10, i32* %call, align 4<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: declare void @llvm.masked.scatter<br>
+; CHECK: declare void @llvm.masked.scatter<br>
 declare void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32>%val, <4 x i32*>, i32, <4 x i1>)<br>
<br>
-; ATTRIBUTOR-NOT: readnone<br>
-; ATTRIBUTOR-NOT: readonly<br>
-; ATTRIBUTOR: define void @test9<br>
+; CHECK-NOT: readnone<br>
+; CHECK-NOT: readonly<br>
 define void @test9(<4 x i32*> %ptrs, <4 x i32>%val) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test9<br>
+; CHECK-SAME: (<4 x i32*> [[PTRS:%.*]], <4 x i32> [[VAL:%.*]])<br>
+; CHECK-NEXT:    call void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32> [[VAL]], <4 x i32*> [[PTRS]], i32 4, <4 x i1> <i1 true, i1 false, i1 true, i1 false>)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @llvm.masked.scatter.v4i32.v4p0i32(<4 x i32>%val, <4 x i32*> %ptrs, i32 4, <4 x i1><i1 true, i1 false, i1 true, i1 false>)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: declare <4 x i32> @llvm.masked.gather<br>
+; CHECK: declare <4 x i32> @llvm.masked.gather<br>
 declare <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*>, i32, <4 x i1>, <4 x i32>)<br>
-; ATTRIBUTOR: readonly<br>
-; ATTRIBUTOR: define <4 x i32> @test10<br>
+; CHECK: readonly<br>
 define <4 x i32> @test10(<4 x i32*> %ptrs) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test10<br>
+; CHECK-SAME: (<4 x i32*> [[PTRS:%.*]])<br>
+; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> [[PTRS]], i32 4, <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> undef)<br>
+; CHECK-NEXT:    ret <4 x i32> [[RES]]<br>
+;<br>
   %res = call <4 x i32> @llvm.masked.gather.v4i32.v4p0i32(<4 x i32*> %ptrs, i32 4, <4 x i1><i1 true, i1 false, i1 true, i1 false>, <4 x i32>undef)<br>
   ret <4 x i32> %res<br>
 }<br>
<br>
-; ATTRIBUTOR: declare <4 x i32> @test11_1<br>
+; CHECK: declare <4 x i32> @test11_1<br>
 declare <4 x i32> @test11_1(<4 x i32*>) argmemonly nounwind readonly<br>
-; ATTRIBUTOR: readonly<br>
-; ATTRIBUTOR-NOT: readnone<br>
-; ATTRIBUTOR: define <4 x i32> @test11_2<br>
+; CHECK: readonly<br>
+; CHECK-NOT: readnone<br>
 define <4 x i32> @test11_2(<4 x i32*> %ptrs) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test11_2<br>
+; CHECK-SAME: (<4 x i32*> [[PTRS:%.*]])<br>
+; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @test11_1(<4 x i32*> [[PTRS]])<br>
+; CHECK-NEXT:    ret <4 x i32> [[RES]]<br>
+;<br>
   %res = call <4 x i32> @test11_1(<4 x i32*> %ptrs)<br>
   ret <4 x i32> %res<br>
 }<br>
<br>
 declare <4 x i32> @test12_1(<4 x i32*>) argmemonly nounwind<br>
-; ATTRIBUTOR-NOT: readnone<br>
-; ATTRIBUTOR: define <4 x i32> @test12_2<br>
+; CHECK-NOT: readnone<br>
 define <4 x i32> @test12_2(<4 x i32*> %ptrs) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test12_2<br>
+; CHECK-SAME: (<4 x i32*> [[PTRS:%.*]])<br>
+; CHECK-NEXT:    [[RES:%.*]] = call <4 x i32> @test12_1(<4 x i32*> [[PTRS]])<br>
+; CHECK-NEXT:    ret <4 x i32> [[RES]]<br>
+;<br>
   %res = call <4 x i32> @test12_1(<4 x i32*> %ptrs)<br>
   ret <4 x i32> %res<br>
 }<br>
<br>
-; ATTRIBUTOR: define i32 @volatile_load(<br>
-; ATTRIBUTOR-NOT: readonly<br>
-; ATTRIBUTOR: ret<br>
 define i32 @volatile_load(i32* %p) {<br>
+; CHECK-LABEL: define {{[^@]+}}@volatile_load<br>
+; CHECK-SAME: (i32* nofree align 4 [[P:%.*]])<br>
+; CHECK-NEXT:    [[LOAD:%.*]] = load volatile i32, i32* [[P]], align 4<br>
+; CHECK-NEXT:    ret i32 [[LOAD]]<br>
+;<br>
   %load = load volatile i32, i32* %p<br>
   ret i32 %load<br>
 }<br>
@@ -125,10 +192,15 @@ declare void @escape_readonly_ptr(i8** %addr, i8* readonly %ptr)<br>
 ; is marked as readnone/only. However, the functions can write the pointer into<br>
 ; %addr, causing the store to write to %escaped_then_written.<br>
 ;<br>
-;<br>
-; ATTRIBUTOR: define void @unsound_readnone(i8* nocapture nofree readnone %ignored, i8* %escaped_then_written)<br>
-; ATTRIBUTOR: define void @unsound_readonly(i8* nocapture nofree readnone %ignored, i8* %escaped_then_written)<br>
 define void @unsound_readnone(i8* %ignored, i8* %escaped_then_written) {<br>
+; CHECK-LABEL: define {{[^@]+}}@unsound_readnone<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[IGNORED:%.*]], i8* [[ESCAPED_THEN_WRITTEN:%.*]])<br>
+; CHECK-NEXT:    [[ADDR:%.*]] = alloca i8*<br>
+; CHECK-NEXT:    call void @escape_readnone_ptr(i8** nonnull align 8 dereferenceable(8) [[ADDR]], i8* noalias readnone [[ESCAPED_THEN_WRITTEN]])<br>
+; CHECK-NEXT:    [[ADDR_LD:%.*]] = load i8*, i8** [[ADDR]], align 8<br>
+; CHECK-NEXT:    store i8 0, i8* [[ADDR_LD]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %addr = alloca i8*<br>
   call void @escape_readnone_ptr(i8** %addr, i8* %escaped_then_written)<br>
   %addr.ld = load i8*, i8** %addr<br>
@@ -137,6 +209,14 @@ define void @unsound_readnone(i8* %ignored, i8* %escaped_then_written) {<br>
 }<br>
<br>
 define void @unsound_readonly(i8* %ignored, i8* %escaped_then_written) {<br>
+; CHECK-LABEL: define {{[^@]+}}@unsound_readonly<br>
+; CHECK-SAME: (i8* nocapture nofree readnone [[IGNORED:%.*]], i8* [[ESCAPED_THEN_WRITTEN:%.*]])<br>
+; CHECK-NEXT:    [[ADDR:%.*]] = alloca i8*<br>
+; CHECK-NEXT:    call void @escape_readonly_ptr(i8** nonnull align 8 dereferenceable(8) [[ADDR]], i8* readonly [[ESCAPED_THEN_WRITTEN]])<br>
+; CHECK-NEXT:    [[ADDR_LD:%.*]] = load i8*, i8** [[ADDR]], align 8<br>
+; CHECK-NEXT:    store i8 0, i8* [[ADDR_LD]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %addr = alloca i8*<br>
   call void @escape_readonly_ptr(i8** %addr, i8* %escaped_then_written)<br>
   %addr.ld = load i8*, i8** %addr<br>
@@ -149,44 +229,69 @@ define void @unsound_readonly(i8* %ignored, i8* %escaped_then_written) {<br>
 ;{<br>
 declare void @escape_i8(i8* %ptr)<br>
<br>
-; ATTRIBUTOR:      @byval_not_readonly_1<br>
-; ATTRIBUTOR-SAME: i8* noalias byval %written<br>
 define void @byval_not_readonly_1(i8* byval %written) readonly {<br>
+; CHECK-LABEL: define {{[^@]+}}@byval_not_readonly_1<br>
+; CHECK-SAME: (i8* noalias byval [[WRITTEN:%.*]])<br>
+; CHECK-NEXT:    call void @escape_i8(i8* [[WRITTEN]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @escape_i8(i8* %written)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR:      @byval_not_readonly_2<br>
-; ATTRIBUTOR-SAME: i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) %written<br>
 define void @byval_not_readonly_2(i8* byval %written) readonly {<br>
+; CHECK-LABEL: define {{[^@]+}}@byval_not_readonly_2<br>
+; CHECK-SAME: (i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) [[WRITTEN:%.*]])<br>
+; CHECK-NEXT:    store i8 0, i8* [[WRITTEN]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8 0, i8* %written<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR:      @byval_not_readnone_1<br>
-; ATTRIBUTOR-SAME: i8* noalias byval %written<br>
 define void @byval_not_readnone_1(i8* byval %written) readnone {<br>
+; CHECK-LABEL: define {{[^@]+}}@byval_not_readnone_1<br>
+; CHECK-SAME: (i8* noalias byval [[WRITTEN:%.*]])<br>
+; CHECK-NEXT:    call void @escape_i8(i8* [[WRITTEN]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @escape_i8(i8* %written)<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR:      @byval_not_readnone_2<br>
-; ATTRIBUTOR-SAME: i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) %written<br>
 define void @byval_not_readnone_2(i8* byval %written) readnone {<br>
+; CHECK-LABEL: define {{[^@]+}}@byval_not_readnone_2<br>
+; CHECK-SAME: (i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) [[WRITTEN:%.*]])<br>
+; CHECK-NEXT:    store i8 0, i8* [[WRITTEN]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8 0, i8* %written<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR:      @byval_no_fnarg<br>
-; ATTRIBUTOR-SAME: i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) %written<br>
 define void @byval_no_fnarg(i8* byval %written) {<br>
+; CHECK-LABEL: define {{[^@]+}}@byval_no_fnarg<br>
+; CHECK-SAME: (i8* noalias nocapture nofree nonnull writeonly byval dereferenceable(1) [[WRITTEN:%.*]])<br>
+; CHECK-NEXT:    store i8 0, i8* [[WRITTEN]]<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   store i8 0, i8* %written<br>
   ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: @testbyval<br>
-; ATTRIBUTOR-SAME: i8* nocapture readonly %read_only<br>
 define void @testbyval(i8* %read_only) {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@testbyval<br>
+; IS__TUNIT____-SAME: (i8* nocapture readonly [[READ_ONLY:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @byval_not_readonly_1(i8* nocapture readonly [[READ_ONLY]])<br>
+; IS__TUNIT____-NEXT:    call void @byval_not_readnone_1(i8* noalias nocapture readnone [[READ_ONLY]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@testbyval<br>
+; IS__CGSCC____-SAME: (i8* nocapture readonly [[READ_ONLY:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @byval_not_readonly_1(i8* noalias nocapture readonly [[READ_ONLY]])<br>
+; IS__CGSCC____-NEXT:    call void @byval_not_readnone_1(i8* noalias nocapture nonnull readnone dereferenceable(1) [[READ_ONLY]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   call void @byval_not_readonly_1(i8* %read_only)<br>
   call void @byval_not_readonly_2(i8* %read_only)<br>
   call void @byval_not_readnone_1(i8* %read_only)<br>
@@ -201,7 +306,10 @@ declare i8 @maybe_returned_val(i8* %ptr) readonly nounwind<br>
 declare void @val_use(i8 %ptr) readonly nounwind<br>
<br>
 define void @ptr_uses(i8* %ptr) {<br>
-; ATTRIBUTOR: define void @ptr_uses(i8* nocapture readonly %ptr)<br>
+; CHECK-LABEL: define {{[^@]+}}@ptr_uses<br>
+; CHECK-SAME: (i8* nocapture readonly [[PTR:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %call_ptr = call i8* @maybe_returned_ptr(i8* %ptr)<br>
   %call_val = call i8 @maybe_returned_val(i8* %call_ptr)<br>
   call void @val_use(i8 %call_val)<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/returned.ll b/llvm/test/Transforms/Attributor/returned.ll<br>
index 98399fe2f9cc..4e4448ead796 100644<br>
--- a/llvm/test/Transforms/Attributor/returned.ll<br>
+++ b/llvm/test/Transforms/Attributor/returned.ll<br>
@@ -1,29 +1,15 @@<br>
-; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR<br>
-; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -functionattrs -S < %s | FileCheck %s --check-prefix=BOTH<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
 ;<br>
-; Copied from Transforms/FunctoinAttrs/read_write_returned_arguments_scc.ll<br>
-; <br>
 ; Test cases specifically designed for the "returned" argument attribute.<br>
 ; We use FIXME's to indicate problems and missing attributes.<br>
 ;<br>
<br>
 ; TEST SCC test returning an integer value argument<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define i32 @sink_r0(i32 returned %r)<br>
-; BOTH: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define i32 @scc_r1(i32 %a, i32 returned %r, i32 %b)<br>
-; BOTH: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define i32 @scc_r2(i32 %a, i32 %b, i32 returned %r)<br>
-; BOTH: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define i32 @scc_rX(i32 %a, i32 %b, i32 %r)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: define i32 @sink_r0(i32 returned %r)<br>
-; ATTRIBUTOR: define i32 @scc_r1(i32 %a, i32 returned %r, i32 %b)<br>
-; ATTRIBUTOR: define i32 @scc_r2(i32 %a, i32 %b, i32 returned %r)<br>
-; ATTRIBUTOR: define i32 @scc_rX(i32 %a, i32 %b, i32 %r)<br>
-;<br>
 ; int scc_r1(int a, int b, int r);<br>
 ; int scc_r2(int a, int b, int r);<br>
 ;<br>
@@ -52,11 +38,23 @@<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
 define i32 @sink_r0(i32 %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@sink_r0<br>
+; CHECK-SAME: (i32 returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32 [[R]]<br>
+;<br>
 entry:<br>
   ret i32 %r<br>
 }<br>
<br>
 define i32 @scc_r1(i32 %a, i32 %r, i32 %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_r1<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32 returned [[R:%.*]], i32 [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 @sink_r0(i32 [[R]])<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[A]], i32 [[CALL]])<br>
+; CHECK-NEXT:    ret i32 [[CALL1]]<br>
+;<br>
 entry:<br>
   %call = call i32 @sink_r0(i32 %r)<br>
   %call1 = call i32 @scc_r2(i32 %r, i32 %a, i32 %call)<br>
@@ -64,6 +62,42 @@ entry:<br>
 }<br>
<br>
 define i32 @scc_r2(i32 %a, i32 %b, i32 %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@scc_r2<br>
+; CHECK-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 @sink_r0(i32 [[R]])<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @scc_r2(i32 [[B]], i32 [[A]], i32 [[CALL]])<br>
+; CHECK-NEXT:    br label [[RETURN:%.*]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]<br>
+; CHECK:       if.then3:<br>
+; CHECK-NEXT:    [[CALL4:%.*]] = call i32 @sink_r0(i32 [[B]])<br>
+; CHECK-NEXT:    [[CALL5:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef)<br>
+; CHECK-NEXT:    [[CALL6:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[R]], i32 [[R]])<br>
+; CHECK-NEXT:    [[CALL7:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[CALL6]], i32 undef)<br>
+; CHECK-NEXT:    [[CALL8:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; CHECK-NEXT:    [[CALL9:%.*]] = call i32 @scc_r2(i32 [[CALL5]], i32 [[CALL7]], i32 [[CALL8]])<br>
+; CHECK-NEXT:    [[CALL11:%.*]] = call i32 @scc_r1(i32 [[CALL4]], i32 [[CALL9]], i32 undef)<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       if.end12:<br>
+; CHECK-NEXT:    [[CMP13:%.*]] = icmp eq i32 [[A]], [[B]]<br>
+; CHECK-NEXT:    br i1 [[CMP13]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; CHECK:       cond.true:<br>
+; CHECK-NEXT:    br label [[COND_END:%.*]]<br>
+; CHECK:       cond.false:<br>
+; CHECK-NEXT:    [[CALL14:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; CHECK-NEXT:    br label [[COND_END]]<br>
+; CHECK:       cond.end:<br>
+; CHECK-NEXT:    [[COND:%.*]] = phi i32 [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]<br>
+; CHECK-NEXT:    br label [[RETURN]]<br>
+; CHECK:       return:<br>
+; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], [[IF_THEN]] ], [ [[CALL11]], [[IF_THEN3]] ], [ [[COND]], [[COND_END]] ]<br>
+; CHECK-NEXT:    ret i32 [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %cmp = icmp sgt i32 %a, %b<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -109,6 +143,79 @@ return:                                           ; preds = %cond.end, %if.then3<br>
 }<br>
<br>
 define i32 @scc_rX(i32 %a, i32 %b, i32 %r) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@scc_rX<br>
+; IS__TUNIT____-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[R:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32 @sink_r0(i32 [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call i32 @scc_r2(i32 [[B]], i32 [[A]], i32 [[CALL]])<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]<br>
+; IS__TUNIT____:       if.then3:<br>
+; IS__TUNIT____-NEXT:    [[CALL4:%.*]] = call i32 @sink_r0(i32 [[B]])<br>
+; IS__TUNIT____-NEXT:    [[CALL5:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL6:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[R]], i32 [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL7:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[CALL6]], i32 undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL8:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL9:%.*]] = call i32 @scc_r2(i32 [[CALL5]], i32 [[CALL7]], i32 [[CALL8]])<br>
+; IS__TUNIT____-NEXT:    [[CALL11:%.*]] = call i32 @scc_r1(i32 [[CALL4]], i32 [[CALL9]], i32 undef)<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN]]<br>
+; IS__TUNIT____:       if.end12:<br>
+; IS__TUNIT____-NEXT:    [[CMP13:%.*]] = icmp eq i32 [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP13]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__TUNIT____:       cond.true:<br>
+; IS__TUNIT____-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__TUNIT____:       cond.false:<br>
+; IS__TUNIT____-NEXT:    [[CALL14:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; IS__TUNIT____-NEXT:    br label [[COND_END]]<br>
+; IS__TUNIT____:       cond.end:<br>
+; IS__TUNIT____-NEXT:    [[COND:%.*]] = phi i32 [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN]]<br>
+; IS__TUNIT____:       return:<br>
+; IS__TUNIT____-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], [[IF_THEN]] ], [ [[CALL11]], [[IF_THEN3]] ], [ [[COND]], [[COND_END]] ]<br>
+; IS__TUNIT____-NEXT:    ret i32 [[RETVAL_0]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@scc_rX<br>
+; IS__CGSCC____-SAME: (i32 [[A:%.*]], i32 [[B:%.*]], i32 [[R:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32 @sink_r0(i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call i32 @scc_r2(i32 [[B]], i32 [[A]], i32 [[CALL]])<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]<br>
+; IS__CGSCC____:       if.then3:<br>
+; IS__CGSCC____-NEXT:    [[CALL4:%.*]] = call i32 @sink_r0(i32 [[B]])<br>
+; IS__CGSCC____-NEXT:    [[CALL5:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL6:%.*]] = call i32 @scc_r2(i32 [[R]], i32 [[R]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL7:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[CALL6]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL8:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL9:%.*]] = call i32 @scc_r2(i32 [[CALL5]], i32 [[CALL7]], i32 [[CALL8]])<br>
+; IS__CGSCC____-NEXT:    [[CALL10:%.*]] = call i32 @scc_r1(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL11:%.*]] = call i32 @scc_r1(i32 [[CALL4]], i32 [[CALL9]], i32 [[CALL10]])<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       if.end12:<br>
+; IS__CGSCC____-NEXT:    [[CMP13:%.*]] = icmp eq i32 [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP13]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__CGSCC____:       cond.true:<br>
+; IS__CGSCC____-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__CGSCC____:       cond.false:<br>
+; IS__CGSCC____-NEXT:    [[CALL14:%.*]] = call i32 @scc_r2(i32 [[A]], i32 [[B]], i32 [[R]])<br>
+; IS__CGSCC____-NEXT:    br label [[COND_END]]<br>
+; IS__CGSCC____:       cond.end:<br>
+; IS__CGSCC____-NEXT:    [[COND:%.*]] = phi i32 [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ [[CALL1]], [[IF_THEN]] ], [ [[CALL11]], [[IF_THEN3]] ], [ [[COND]], [[COND_END]] ]<br>
+; IS__CGSCC____-NEXT:    ret i32 [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %cmp = icmp sgt i32 %a, %b<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -156,14 +263,6 @@ return:                                           ; preds = %cond.end, %if.then3<br>
<br>
 ; TEST SCC test returning a pointer value argument<br>
 ;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @ptr_sink_r0(double* nofree readnone returned "no-capture-maybe-returned" %r)<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @ptr_scc_r1(double* nofree readnone %a, double* nofree readnone returned %r, double* nocapture nofree readnone %b)<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @ptr_scc_r2(double* nofree readnone %a, double* nofree readnone %b, double* nofree readnone returned %r)<br>
-;<br>
 ; double* ptr_scc_r1(double* a, double* b, double* r);<br>
 ; double* ptr_scc_r2(double* a, double* b, double* r);<br>
 ;<br>
@@ -183,11 +282,30 @@ return:                                           ; preds = %cond.end, %if.then3<br>
 ;   return a == b ? r : ptr_scc_r2(a, b, r);<br>
 ; }<br>
 define double* @ptr_sink_r0(double* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ptr_sink_r0<br>
+; CHECK-SAME: (double* nofree readnone returned "no-capture-maybe-returned" [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret double* [[R]]<br>
+;<br>
 entry:<br>
   ret double* %r<br>
 }<br>
<br>
 define double* @ptr_scc_r1(double* %a, double* %r, double* %b) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@ptr_scc_r1<br>
+; IS__TUNIT____-SAME: (double* nofree readnone [[A:%.*]], double* nofree readnone returned [[R:%.*]], double* nocapture nofree readnone [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone "no-capture-maybe-returned" [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[R]], double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL]])<br>
+; IS__TUNIT____-NEXT:    ret double* [[CALL1]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ptr_scc_r1<br>
+; IS__CGSCC____-SAME: (double* nofree readnone [[A:%.*]], double* nofree readnone returned [[R:%.*]], double* nocapture nofree readnone [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[R]], double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL]])<br>
+; IS__CGSCC____-NEXT:    ret double* [[CALL1]]<br>
+;<br>
 entry:<br>
   %call = call double* @ptr_sink_r0(double* %r)<br>
   %call1 = call double* @ptr_scc_r2(double* %r, double* %a, double* %call)<br>
@@ -195,6 +313,78 @@ entry:<br>
 }<br>
<br>
 define double* @ptr_scc_r2(double* %a, double* %b, double* %r) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@ptr_scc_r2<br>
+; IS__TUNIT____-SAME: (double* nofree readnone [[A:%.*]], double* nofree readnone [[B:%.*]], double* nofree readnone returned [[R:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CMP:%.*]] = icmp ugt double* [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; IS__TUNIT____:       if.then:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone "no-capture-maybe-returned" [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL1:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[B]], double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL]])<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__TUNIT____:       if.end:<br>
+; IS__TUNIT____-NEXT:    [[CMP2:%.*]] = icmp ult double* [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]<br>
+; IS__TUNIT____:       if.then3:<br>
+; IS__TUNIT____-NEXT:    [[CALL4:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone [[B]])<br>
+; IS__TUNIT____-NEXT:    [[CALL5:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL6:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[R]], double* noalias nofree readnone [[R]], double* noalias nofree readnone [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL7:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL6]], double* noalias nofree readnone undef)<br>
+; IS__TUNIT____-NEXT:    [[CALL8:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone [[R]])<br>
+; IS__TUNIT____-NEXT:    [[CALL9:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[CALL5]], double* noalias nofree readnone [[CALL7]], double* noalias nofree readnone [[CALL8]])<br>
+; IS__TUNIT____-NEXT:    [[CALL11:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[CALL4]], double* noalias nofree readnone [[CALL9]], double* noalias nofree readnone undef)<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN]]<br>
+; IS__TUNIT____:       if.end12:<br>
+; IS__TUNIT____-NEXT:    [[CMP13:%.*]] = icmp eq double* [[A]], [[B]]<br>
+; IS__TUNIT____-NEXT:    br i1 [[CMP13]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__TUNIT____:       cond.true:<br>
+; IS__TUNIT____-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__TUNIT____:       cond.false:<br>
+; IS__TUNIT____-NEXT:    [[CALL14:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone [[R]])<br>
+; IS__TUNIT____-NEXT:    br label [[COND_END]]<br>
+; IS__TUNIT____:       cond.end:<br>
+; IS__TUNIT____-NEXT:    [[COND:%.*]] = phi double* [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]<br>
+; IS__TUNIT____-NEXT:    br label [[RETURN]]<br>
+; IS__TUNIT____:       return:<br>
+; IS__TUNIT____-NEXT:    [[RETVAL_0:%.*]] = phi double* [ [[CALL1]], [[IF_THEN]] ], [ [[CALL11]], [[IF_THEN3]] ], [ [[COND]], [[COND_END]] ]<br>
+; IS__TUNIT____-NEXT:    ret double* [[RETVAL_0]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ptr_scc_r2<br>
+; IS__CGSCC____-SAME: (double* nofree readnone [[A:%.*]], double* nofree readnone [[B:%.*]], double* nofree readnone returned [[R:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CMP:%.*]] = icmp ugt double* [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; IS__CGSCC____:       if.then:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL1:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[B]], double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL]])<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN:%.*]]<br>
+; IS__CGSCC____:       if.end:<br>
+; IS__CGSCC____-NEXT:    [[CMP2:%.*]] = icmp ult double* [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_END12:%.*]]<br>
+; IS__CGSCC____:       if.then3:<br>
+; IS__CGSCC____-NEXT:    [[CALL4:%.*]] = call double* @ptr_sink_r0(double* noalias nofree readnone [[B]])<br>
+; IS__CGSCC____-NEXT:    [[CALL5:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone undef)<br>
+; IS__CGSCC____-NEXT:    [[CALL6:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[R]], double* noalias nofree readnone [[R]], double* noalias nofree readnone [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL7:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[CALL6]], double* noalias nofree readnone undef)<br>
+; IS__CGSCC____-NEXT:    [[CALL8:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone [[R]])<br>
+; IS__CGSCC____-NEXT:    [[CALL9:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[CALL5]], double* noalias nofree readnone [[CALL7]], double* noalias nofree readnone [[CALL8]])<br>
+; IS__CGSCC____-NEXT:    [[CALL11:%.*]] = call double* @ptr_scc_r1(double* noalias nofree readnone [[CALL4]], double* noalias nofree readnone [[CALL9]], double* noalias nofree readnone undef)<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       if.end12:<br>
+; IS__CGSCC____-NEXT:    [[CMP13:%.*]] = icmp eq double* [[A]], [[B]]<br>
+; IS__CGSCC____-NEXT:    br i1 [[CMP13]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]<br>
+; IS__CGSCC____:       cond.true:<br>
+; IS__CGSCC____-NEXT:    br label [[COND_END:%.*]]<br>
+; IS__CGSCC____:       cond.false:<br>
+; IS__CGSCC____-NEXT:    [[CALL14:%.*]] = call double* @ptr_scc_r2(double* noalias nofree readnone [[A]], double* noalias nofree readnone [[B]], double* noalias nofree readnone [[R]])<br>
+; IS__CGSCC____-NEXT:    br label [[COND_END]]<br>
+; IS__CGSCC____:       cond.end:<br>
+; IS__CGSCC____-NEXT:    [[COND:%.*]] = phi double* [ [[R]], [[COND_TRUE]] ], [ [[CALL14]], [[COND_FALSE]] ]<br>
+; IS__CGSCC____-NEXT:    br label [[RETURN]]<br>
+; IS__CGSCC____:       return:<br>
+; IS__CGSCC____-NEXT:    [[RETVAL_0:%.*]] = phi double* [ [[CALL1]], [[IF_THEN]] ], [ [[CALL11]], [[IF_THEN3]] ], [ [[COND]], [[COND_END]] ]<br>
+; IS__CGSCC____-NEXT:    ret double* [[RETVAL_0]]<br>
+;<br>
 entry:<br>
   %cmp = icmp ugt double* %a, %b<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -246,9 +436,12 @@ return:                                           ; preds = %cond.end, %if.then3<br>
 ;   return *a ? a : rt0(a);<br>
 ; }<br>
 ;<br>
-; BOTH:      Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable willreturn<br>
-; BOTH-NEXT: define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @rt0(i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) %a)<br>
 define i32* @rt0(i32* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rt0<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %v = load i32, i32* %a, align 4<br>
   %tobool = icmp ne i32 %v, 0<br>
@@ -263,9 +456,12 @@ entry:<br>
 ;   return *a ? undef : rt1(a);<br>
 ; }<br>
 ;<br>
-; BOTH:         Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable willreturn<br>
-; BOTH-NEXT:    define noalias nonnull align 536870912 dereferenceable(4294967295) i32* @rt1(i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) %a)<br>
 define i32* @rt1(i32* %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rt1<br>
+; CHECK-SAME: (i32* nocapture nofree nonnull readnone align 4 dereferenceable(4) [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   %v = load i32, i32* %a, align 4<br>
   %tobool = icmp ne i32 %v, 0<br>
@@ -276,15 +472,37 @@ entry:<br>
<br>
 ; TEST another SCC test<br>
 ;<br>
-; BOTH:    define i32* @rt2_helper(i32* nofree readnone returned %a)<br>
-; BOTH:    define i32* @rt2(i32* nofree readnone %a, i32* nofree readnone "no-capture-maybe-returned" %b)<br>
 define i32* @rt2_helper(i32* %a) #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@rt2_helper<br>
+; IS__TUNIT____-SAME: (i32* nofree readnone returned [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:  entry:<br>
+; IS__TUNIT____-NEXT:    [[CALL:%.*]] = call i32* @rt2(i32* noalias nofree readnone [[A]], i32* noalias nofree readnone "no-capture-maybe-returned" [[A]])<br>
+; IS__TUNIT____-NEXT:    ret i32* [[CALL]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@rt2_helper<br>
+; IS__CGSCC____-SAME: (i32* nofree readnone returned [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    [[CALL:%.*]] = call i32* @rt2(i32* noalias nofree readnone [[A]], i32* noalias nofree readnone [[A]])<br>
+; IS__CGSCC____-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @rt2(i32* %a, i32* %a)<br>
   ret i32* %call<br>
 }<br>
<br>
 define i32* @rt2(i32* %a, i32 *%b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rt2<br>
+; CHECK-SAME: (i32* nofree readnone [[A:%.*]], i32* nofree readnone "no-capture-maybe-returned" [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[A]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @rt2_helper(i32* noalias nofree readnone [[A]])<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[SEL:%.*]] = phi i32* [ [[B]], [[ENTRY:%.*]] ], [ [[CALL]], [[IF_THEN]] ]<br>
+; CHECK-NEXT:    ret i32* [[SEL]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %a, null<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -300,15 +518,31 @@ if.end:<br>
<br>
 ; TEST another SCC test<br>
 ;<br>
-; BOTH:    define i32* @rt3_helper(i32* nofree readnone %a, i32* nofree readnone returned "no-capture-maybe-returned" %b)<br>
-; BOTH:    define i32* @rt3(i32* nofree readnone %a, i32* nofree readnone returned "no-capture-maybe-returned" %b)<br>
 define i32* @rt3_helper(i32* %a, i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rt3_helper<br>
+; CHECK-SAME: (i32* nofree readnone [[A:%.*]], i32* nofree readnone returned "no-capture-maybe-returned" [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @rt3(i32* noalias nofree readnone [[A]], i32* noalias nofree readnone "no-capture-maybe-returned" [[B]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @rt3(i32* %a, i32* %b)<br>
   ret i32* %call<br>
 }<br>
<br>
 define i32* @rt3(i32* %a, i32 *%b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@rt3<br>
+; CHECK-SAME: (i32* nofree readnone [[A:%.*]], i32* nofree readnone returned "no-capture-maybe-returned" [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[A]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @rt3_helper(i32* noalias nofree readnone [[A]], i32* noalias nofree readnone "no-capture-maybe-returned" [[B]])<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[SEL:%.*]] = phi i32* [ [[B]], [[ENTRY:%.*]] ], [ [[CALL]], [[IF_THEN]] ]<br>
+; CHECK-NEXT:    ret i32* [[SEL]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %a, null<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -331,14 +565,14 @@ if.end:<br>
 ;    return r;<br>
 ;  }<br>
 ;<br>
-; BOTH: declare void @unknown_fn(i32* (i32*)*)<br>
-;<br>
-; BOTH:       Function Attrs: noinline nounwind uwtable<br>
-; BOTH-NEXT:  define i32* @calls_unknown_fn(i32* nofree readnone returned "no-capture-maybe-returned" %r)<br>
-; ATTRIBUTOR: define i32* @calls_unknown_fn(i32* nofree readnone returned "no-capture-maybe-returned" %r)<br>
 declare void @unknown_fn(i32* (i32*)*) #0<br>
<br>
 define i32* @calls_unknown_fn(i32* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@calls_unknown_fn<br>
+; CHECK-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[R:%.*]])<br>
+; CHECK-NEXT:    tail call void @unknown_fn(i32* (i32*)* nonnull @calls_unknown_fn)<br>
+; CHECK-NEXT:    ret i32* [[R]]<br>
+;<br>
   tail call void @unknown_fn(i32* (i32*)* nonnull @calls_unknown_fn)<br>
   ret i32* %r<br>
 }<br>
@@ -357,23 +591,23 @@ define i32* @calls_unknown_fn(i32* %r) #0 {<br>
 ;<br>
 ; Verify the maybe-redefined function is not annotated:<br>
 ;<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR: define linkonce_odr i32* @maybe_redefined_fn(i32* %r)<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR: define i32* @calls_maybe_redefined_fn(i32* returned %r)<br>
-;<br>
-; BOTH: Function Attrs: noinline nounwind uwtable<br>
-; BOTH-NEXT: define linkonce_odr i32* @maybe_redefined_fn(i32* %r)<br>
-;<br>
-; BOTH: Function Attrs: noinline nounwind uwtable<br>
-; BOTH-NEXT: define i32* @calls_maybe_redefined_fn(i32* returned %r)<br>
 define linkonce_odr i32* @maybe_redefined_fn(i32* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@maybe_redefined_fn<br>
+; CHECK-SAME: (i32* [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32* [[R]]<br>
+;<br>
 entry:<br>
   ret i32* %r<br>
 }<br>
<br>
 define i32* @calls_maybe_redefined_fn(i32* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@calls_maybe_redefined_fn<br>
+; CHECK-SAME: (i32* returned [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @maybe_redefined_fn(i32* [[R]])<br>
+; CHECK-NEXT:    ret i32* [[R]]<br>
+;<br>
 entry:<br>
   %call = call i32* @maybe_redefined_fn(i32* %r)<br>
   ret i32* %r<br>
@@ -391,18 +625,23 @@ entry:<br>
 ;<br>
 ; Verify the maybe-redefined function is not annotated:<br>
 ;<br>
-; BOTH: Function Attrs: noinline nounwind uwtable<br>
-; BOTH-NEXT: define linkonce_odr i32* @maybe_redefined_fn2(i32* %r)<br>
-; BOTH: Function Attrs: noinline nounwind uwtable<br>
-; BOTH-NEXT: define i32* @calls_maybe_redefined_fn2(i32* %r)<br>
-;<br>
-; ATTRIBUTOR: define i32* @calls_maybe_redefined_fn2(i32* %r)<br>
 define linkonce_odr i32* @maybe_redefined_fn2(i32* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@maybe_redefined_fn2<br>
+; CHECK-SAME: (i32* [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32* [[R]]<br>
+;<br>
 entry:<br>
   ret i32* %r<br>
 }<br>
<br>
 define i32* @calls_maybe_redefined_fn2(i32* %r) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@calls_maybe_redefined_fn2<br>
+; CHECK-SAME: (i32* [[R:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @maybe_redefined_fn2(i32* [[R]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %call = call i32* @maybe_redefined_fn2(i32* %r)<br>
   ret i32* %call<br>
@@ -418,12 +657,20 @@ entry:<br>
 ;   return b == 0? b : x;<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define double @select_and_phi(double returned %b)<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double @select_and_phi(double returned %b)<br>
 define double @select_and_phi(double %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@select_and_phi<br>
+; CHECK-SAME: (double returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = fcmp ogt double [[B]], 0.000000e+00<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi double [ [[B]], [[IF_THEN]] ], [ [[B]], [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT:    [[CMP1:%.*]] = fcmp oeq double [[B]], 0.000000e+00<br>
+; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP1]], double [[B]], double [[PHI]]<br>
+; CHECK-NEXT:    ret double [[SEL]]<br>
+;<br>
 entry:<br>
   %cmp = fcmp ogt double %b, 0.000000e+00<br>
   br i1 %cmp, label %if.then, label %if.end<br>
@@ -448,13 +695,22 @@ if.end:                                           ; preds = %if.then, %entry<br>
 ;   return b == 0? b : x;<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define double @recursion_select_and_phi(i32 %a, double returned %b)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double @recursion_select_and_phi(i32 %a, double returned %b)<br>
 define double @recursion_select_and_phi(i32 %a, double %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@recursion_select_and_phi<br>
+; CHECK-SAME: (i32 [[A:%.*]], double returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[DEC:%.*]] = add nsw i32 [[A]], -1<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call double @recursion_select_and_phi(i32 [[DEC]], double [[B]])<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi double [ [[CALL]], [[IF_THEN]] ], [ [[B]], [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT:    [[CMP1:%.*]] = fcmp oeq double [[B]], 0.000000e+00<br>
+; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP1]], double [[B]], double [[PHI]]<br>
+; CHECK-NEXT:    ret double [[SEL]]<br>
+;<br>
 entry:<br>
   %dec = add nsw i32 %a, -1<br>
   %cmp = icmp sgt i32 %a, 0<br>
@@ -478,13 +734,13 @@ if.end:                                           ; preds = %if.then, %entry<br>
 ;   return (double*)b;<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT:  define double* @bitcast(i32* nofree readnone returned "no-capture-maybe-returned" %b)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @bitcast(i32* nofree readnone returned "no-capture-maybe-returned" %b)<br>
 define double* @bitcast(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@bitcast<br>
+; CHECK-SAME: (i32* nofree readnone returned "no-capture-maybe-returned" [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC0:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    ret double* [[BC0]]<br>
+;<br>
 entry:<br>
   %bc0 = bitcast i32* %b to double*<br>
   ret double* %bc0<br>
@@ -500,13 +756,25 @@ entry:<br>
 ;   return b != 0 ? b : x;<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT: define double* @bitcasts_select_and_phi(i32* nofree readnone returned %b)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @bitcasts_select_and_phi(i32* nofree readnone returned %b)<br>
 define double* @bitcasts_select_and_phi(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@bitcasts_select_and_phi<br>
+; CHECK-SAME: (i32* nofree readnone returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC0:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq double* [[BC0]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    [[BC1:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    br label [[IF_END]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi double* [ [[BC1]], [[IF_THEN]] ], [ [[BC0]], [[ENTRY:%.*]] ]<br>
+; CHECK-NEXT:    [[BC2:%.*]] = bitcast double* [[PHI]] to i8*<br>
+; CHECK-NEXT:    [[BC3:%.*]] = bitcast i32* [[B]] to i8*<br>
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne double* [[BC0]], null<br>
+; CHECK-NEXT:    [[SEL:%.*]] = select i1 [[CMP2]], i8* [[BC2]], i8* [[BC3]]<br>
+; CHECK-NEXT:    [[BC4:%.*]] = bitcast i8* [[SEL]] to double*<br>
+; CHECK-NEXT:    ret double* [[BC4]]<br>
+;<br>
 entry:<br>
   %bc0 = bitcast i32* %b to double*<br>
   %cmp = icmp eq double* %bc0, null<br>
@@ -537,13 +805,23 @@ if.end:                                           ; preds = %if.then, %entry<br>
 ;   /* return undef */<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT:  define double* @ret_arg_arg_undef(i32* nofree readnone returned %b)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @ret_arg_arg_undef(i32* nofree readnone returned %b)<br>
 define double* @ret_arg_arg_undef(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_arg_arg_undef<br>
+; CHECK-SAME: (i32* nofree readnone returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC0:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq double* [[BC0]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG0:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       ret_arg0:<br>
+; CHECK-NEXT:    [[BC1:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    ret double* [[BC1]]<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG1:%.*]], label [[RET_UNDEF:%.*]]<br>
+; CHECK:       ret_arg1:<br>
+; CHECK-NEXT:    ret double* [[BC0]]<br>
+; CHECK:       ret_undef:<br>
+; CHECK-NEXT:    ret double* undef<br>
+;<br>
 entry:<br>
   %bc0 = bitcast i32* %b to double*<br>
   %cmp = icmp eq double* %bc0, null<br>
@@ -574,13 +852,23 @@ ret_undef:<br>
 ;   /* return undef */<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT:  define double* @ret_undef_arg_arg(i32* nofree readnone returned %b)<br>
-;<br>
-;<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define double* @ret_undef_arg_arg(i32* nofree readnone returned %b)<br>
 define double* @ret_undef_arg_arg(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_undef_arg_arg<br>
+; CHECK-SAME: (i32* nofree readnone returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC0:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq double* [[BC0]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_UNDEF:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       ret_undef:<br>
+; CHECK-NEXT:    ret double* undef<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG0:%.*]], label [[RET_ARG1:%.*]]<br>
+; CHECK:       ret_arg0:<br>
+; CHECK-NEXT:    ret double* [[BC0]]<br>
+; CHECK:       ret_arg1:<br>
+; CHECK-NEXT:    [[BC1:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    ret double* [[BC1]]<br>
+;<br>
 entry:<br>
   %bc0 = bitcast i32* %b to double*<br>
   %cmp = icmp eq double* %bc0, null<br>
@@ -611,11 +899,22 @@ ret_arg1:<br>
 ;   /* return undef */<br>
 ; }<br>
 ;<br>
-; BOTH: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; BOTH-NEXT:  define double* @ret_undef_arg_undef(i32* nofree readnone returned %b)<br>
-;<br>
-; ATTRIBUTOR: define double* @ret_undef_arg_undef(i32* nofree readnone returned %b)<br>
 define double* @ret_undef_arg_undef(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_undef_arg_undef<br>
+; CHECK-SAME: (i32* nofree readnone returned [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[BC0:%.*]] = bitcast i32* [[B]] to double*<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq double* [[BC0]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_UNDEF0:%.*]], label [[IF_END:%.*]]<br>
+; CHECK:       ret_undef0:<br>
+; CHECK-NEXT:    ret double* undef<br>
+; CHECK:       if.end:<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG:%.*]], label [[RET_UNDEF1:%.*]]<br>
+; CHECK:       ret_arg:<br>
+; CHECK-NEXT:    ret double* [[BC0]]<br>
+; CHECK:       ret_undef1:<br>
+; CHECK-NEXT:    ret double* undef<br>
+;<br>
 entry:<br>
   %bc0 = bitcast i32* %b to double*<br>
   %cmp = icmp eq double* %bc0, null<br>
@@ -644,13 +943,20 @@ ret_undef1:<br>
 ;<br>
 ; Verify we do not assume b is returned<br>
 ;<br>
-; ATTRIBUTOR: define i32* @ret_arg_or_unknown(i32* %b)<br>
-; ATTRIBUTOR: define i32* @ret_arg_or_unknown_through_phi(i32* %b)<br>
-; BOTH:       define i32* @ret_arg_or_unknown(i32* %b)<br>
-; BOTH:       define i32* @ret_arg_or_unknown_through_phi(i32* %b)<br>
 declare i32* @unknown(i32*)<br>
<br>
 define i32* @ret_arg_or_unknown(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_arg_or_unknown<br>
+; CHECK-SAME: (i32* [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[B]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG:%.*]], label [[RET_UNKNOWN:%.*]]<br>
+; CHECK:       ret_arg:<br>
+; CHECK-NEXT:    ret i32* [[B]]<br>
+; CHECK:       ret_unknown:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown(i32* [[B]])<br>
+; CHECK-NEXT:    ret i32* [[CALL]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %b, null<br>
   br i1 %cmp, label %ret_arg, label %ret_unknown<br>
@@ -664,6 +970,20 @@ ret_unknown:<br>
 }<br>
<br>
 define i32* @ret_arg_or_unknown_through_phi(i32* %b) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_arg_or_unknown_through_phi<br>
+; CHECK-SAME: (i32* [[B:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32* [[B]], null<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[RET_ARG:%.*]], label [[RET_UNKNOWN:%.*]]<br>
+; CHECK:       ret_arg:<br>
+; CHECK-NEXT:    br label [[R:%.*]]<br>
+; CHECK:       ret_unknown:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32* @unknown(i32* [[B]])<br>
+; CHECK-NEXT:    br label [[R]]<br>
+; CHECK:       r:<br>
+; CHECK-NEXT:    [[PHI:%.*]] = phi i32* [ [[B]], [[RET_ARG]] ], [ [[CALL]], [[RET_UNKNOWN]] ]<br>
+; CHECK-NEXT:    ret i32* [[PHI]]<br>
+;<br>
 entry:<br>
   %cmp = icmp eq i32* %b, null<br>
   br i1 %cmp, label %ret_arg, label %ret_unknown<br>
@@ -682,15 +1002,14 @@ r:<br>
<br>
 ; TEST inconsistent IR in dead code.<br>
 ;<br>
-; ATTRIBUTOR: define i32 @deadblockcall1(i32 returned %A)<br>
-; ATTRIBUTOR: define i32 @deadblockcall2(i32 returned %A)<br>
-; ATTRIBUTOR: define i32 @deadblockphi1(i32 returned %A)<br>
-; ATTRIBUTOR: define i32 @deadblockphi2(i32 returned %A)<br>
-; BOTH:       define i32 @deadblockcall1(i32 returned %A)<br>
-; BOTH:       define i32 @deadblockcall2(i32 returned %A)<br>
-; BOTH:       define i32 @deadblockphi1(i32 returned %A)<br>
-; BOTH:       define i32 @deadblockphi2(i32 returned %A)<br>
 define i32 @deadblockcall1(i32 %A) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@deadblockcall1<br>
+; CHECK-SAME: (i32 returned [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+; CHECK:       unreachableblock:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   ret i32 %A<br>
 unreachableblock:<br>
@@ -701,6 +1020,15 @@ unreachableblock:<br>
 declare i32 @deadblockcall_helper(i32 returned %A);<br>
<br>
 define i32 @deadblockcall2(i32 %A) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@deadblockcall2<br>
+; CHECK-SAME: (i32 returned [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+; CHECK:       unreachableblock1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock2:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
 entry:<br>
   ret i32 %A<br>
 unreachableblock1:<br>
@@ -712,6 +1040,17 @@ unreachableblock2:<br>
 }<br>
<br>
 define i32 @deadblockphi1(i32 %A) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@deadblockphi1<br>
+; CHECK-SAME: (i32 returned [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[R:%.*]]<br>
+; CHECK:       unreachableblock1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock2:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       r:<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
 entry:<br>
   br label %r<br>
 unreachableblock1:<br>
@@ -726,6 +1065,19 @@ r:<br>
 }<br>
<br>
 define i32 @deadblockphi2(i32 %A) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@deadblockphi2<br>
+; CHECK-SAME: (i32 returned [[A:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[R:%.*]]<br>
+; CHECK:       unreachableblock1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock2:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock3:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       r:<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
 entry:<br>
   br label %r<br>
 unreachableblock1:<br>
@@ -745,6 +1097,20 @@ r:<br>
 declare void @noreturn() noreturn;<br>
<br>
 define i32 @deadblockphi3(i32 %A, i1 %c) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@deadblockphi3<br>
+; CHECK-SAME: (i32 returned [[A:%.*]], i1 [[C:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br i1 [[C]], label [[R:%.*]], label [[UNREACHABLECALL:%.*]]<br>
+; CHECK:       unreachablecall:<br>
+; CHECK-NEXT:    call void @noreturn()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock2:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachableblock3:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       r:<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
 entry:<br>
   br i1 %c, label %r, label %unreachablecall<br>
 unreachablecall:<br>
@@ -763,38 +1129,109 @@ r:<br>
 }<br>
<br>
 define weak_odr i32 @non_exact_0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact_0()<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
   ret i32 0<br>
 }<br>
 define weak_odr i32 @non_exact_1(i32 %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact_1<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   ret i32 %a<br>
 }<br>
 define weak_odr i32 @non_exact_2(i32 returned %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact_2<br>
+; CHECK-SAME: (i32 returned [[A:%.*]])<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
+;<br>
   ret i32 %a<br>
 }<br>
 define weak_odr align 16 i32* @non_exact_3(i32* align 32 returned %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact_3<br>
+; CHECK-SAME: (i32* returned align 32 [[A:%.*]])<br>
+; CHECK-NEXT:    ret i32* [[A]]<br>
+;<br>
   ret i32* %a<br>
 }<br>
 define weak_odr align 16 i32* @non_exact_4(i32* align 32 %a) {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_exact_4<br>
+; CHECK-SAME: (i32* align 32 [[A:%.*]])<br>
+; CHECK-NEXT:    ret i32* [[A]]<br>
+;<br>
   ret i32* %a<br>
 }<br>
+; We can use the alignment information of the weak function non_exact_3 argument<br>
+; because it was given to us and not derived.<br>
+; We can use the return information of the weak function non_exact_4.<br>
+; FIXME: %c2 and %c3 should be replaced but not %c0 or %c1!<br>
 define i32 @exact(i32* align 8 %a, i32* align 8 %b) {<br>
+; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@exact<br>
+; NOT_CGSCC_NPM-SAME: (i32* align 8 [[A:%.*]], i32* align 8 [[B:%.*]])<br>
+; NOT_CGSCC_NPM-NEXT:    [[C0:%.*]] = call i32 @non_exact_0()<br>
+; NOT_CGSCC_NPM-NEXT:    [[C1:%.*]] = call i32 @non_exact_1(i32 1)<br>
+; NOT_CGSCC_NPM-NEXT:    [[C2:%.*]] = call i32 @non_exact_2(i32 2)<br>
+; NOT_CGSCC_NPM-NEXT:    [[C3:%.*]] = call align 32 i32* @non_exact_3(i32* align 32 [[A]])<br>
+; NOT_CGSCC_NPM-NEXT:    [[C4:%.*]] = call align 16 i32* @non_exact_4(i32* align 32 [[B]])<br>
+; NOT_CGSCC_NPM-NEXT:    [[C3L:%.*]] = load i32, i32* [[C3]], align 32<br>
+; NOT_CGSCC_NPM-NEXT:    [[C4L:%.*]] = load i32, i32* [[C4]], align 16<br>
+; NOT_CGSCC_NPM-NEXT:    [[ADD1:%.*]] = add i32 [[C0]], [[C1]]<br>
+; NOT_CGSCC_NPM-NEXT:    [[ADD2:%.*]] = add i32 [[ADD1]], [[C2]]<br>
+; NOT_CGSCC_NPM-NEXT:    [[ADD3:%.*]] = add i32 [[ADD2]], [[C3L]]<br>
+; NOT_CGSCC_NPM-NEXT:    [[ADD4:%.*]] = add i32 [[ADD3]], [[C4L]]<br>
+; NOT_CGSCC_NPM-NEXT:    ret i32 [[ADD4]]<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@exact<br>
+; IS__CGSCC_NPM-SAME: (i32* align 8 [[A:%.*]], i32* align 8 [[B:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:    [[C0:%.*]] = call i32 @non_exact_0()<br>
+; IS__CGSCC_NPM-NEXT:    [[C1:%.*]] = call i32 @non_exact_1(i32 1)<br>
+; IS__CGSCC_NPM-NEXT:    [[C2:%.*]] = call i32 @non_exact_2(i32 2)<br>
+; IS__CGSCC_NPM-NEXT:    [[C3:%.*]] = call align 32 i32* @non_exact_3(i32* align 32 [[A]])<br>
+; IS__CGSCC_NPM-NEXT:    [[C4:%.*]] = call align 16 i32* @non_exact_4(i32* align 32 [[B]])<br>
+; IS__CGSCC_NPM-NEXT:    [[C3L:%.*]] = load i32, i32* [[C3]], align 32<br>
+; IS__CGSCC_NPM-NEXT:    [[C4L:%.*]] = load i32, i32* [[C4]], align 16<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD1:%.*]] = add i32 [[C0]], [[C1]]<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD2:%.*]] = add i32 [[ADD1]], 2<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD3:%.*]] = add i32 [[ADD2]], [[C3L]]<br>
+; IS__CGSCC_NPM-NEXT:    [[ADD4:%.*]] = add i32 [[ADD3]], [[C4L]]<br>
+; IS__CGSCC_NPM-NEXT:    ret i32 [[ADD4]]<br>
+;<br>
+; ____CGSCC_NPM-LABEL: define {{[^@]+}}@exact<br>
+; ____CGSCC_NPM-SAME: (i32* align 8 [[A:%.*]], i32* align 8 [[B:%.*]])<br>
+; ____CGSCC_NPM-NEXT:    [[C0:%.*]] = call i32 @non_exact_0()<br>
+; ____CGSCC_NPM-NEXT:    [[C1:%.*]] = call i32 @non_exact_1(i32 1)<br>
+; ____CGSCC_NPM-NEXT:    [[C2:%.*]] = call i32 @non_exact_2(i32 2)<br>
+; ____CGSCC_NPM-NEXT:    [[C3:%.*]] = call align 32 i32* @non_exact_3(i32* align 32 [[A]])<br>
+; ____CGSCC_NPM-NEXT:    [[C4:%.*]] = call align 16 i32* @non_exact_4(i32* align 32 [[B]])<br>
+; ____CGSCC_NPM-NEXT:    [[C3L:%.*]] = load i32, i32* [[C3]], align 32<br>
+; ____CGSCC_NPM-NEXT:    [[C4L:%.*]] = load i32, i32* [[C4]], align 16<br>
+; ____CGSCC_NPM-NEXT:    [[ADD1:%.*]] = add i32 [[C0]], [[C1]]<br>
+; ____CGSCC_NPM-NEXT:    [[ADD2:%.*]] = add i32 [[ADD1]], 2<br>
+; ____CGSCC_NPM-NEXT:    [[ADD3:%.*]] = add i32 [[ADD2]], [[C3L]]<br>
+; ____CGSCC_NPM-NEXT:    [[ADD4:%.*]] = add i32 [[ADD3]], [[C4L]]<br>
+; ____CGSCC_NPM-NEXT:    ret i32 [[ADD4]]<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-LABEL: define {{[^@]+}}@exact<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-SAME: (i32* align 8 [[A:%.*]], i32* align 8 [[B:%.*]])<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C0:%.*]] = call i32 @non_exact_0()<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C1:%.*]] = call i32 @non_exact_1(i32 1)<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C2:%.*]] = call i32 @non_exact_2(i32 2)<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C3:%.*]] = call align 32 i32* @non_exact_3(i32* align 32 [[A]])<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C4:%.*]] = call align 16 i32* @non_exact_4(i32* align 32 [[B]])<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C3L:%.*]] = load i32, i32* [[C3]], align 32<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[C4L:%.*]] = load i32, i32* [[C4]], align 16<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[ADD1:%.*]] = add i32 [[C0]], [[C1]]<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[ADD2:%.*]] = add i32 [[ADD1]], 2<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[ADD3:%.*]] = add i32 [[ADD2]], [[C3L]]<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    [[ADD4:%.*]] = add i32 [[ADD3]], [[C4L]]<br>
+; CGSCC_NPM,CHECK_MODULE,CHECK_CGSCC-NEXT:    ret i32 [[ADD4]]<br>
   %c0 = call i32 @non_exact_0()<br>
   %c1 = call i32 @non_exact_1(i32 1)<br>
   %c2 = call i32 @non_exact_2(i32 2)<br>
   %c3 = call i32* @non_exact_3(i32* %a)<br>
   %c4 = call i32* @non_exact_4(i32* %b)<br>
-; We can use the alignment information of the weak function non_exact_3 argument<br>
-; because it was given to us and not derived.<br>
-; ATTRIBUTOR:  %c3l = load i32, i32* %c3, align 32<br>
   %c3l = load i32, i32* %c3<br>
-; We can use the return information of the weak function non_exact_4.<br>
-; ATTRIBUTOR:  %c4l = load i32, i32* %c4, align 16<br>
   %c4l = load i32, i32* %c4<br>
-; FIXME: %c2 and %c3 should be replaced but not %c0 or %c1!<br>
-; ATTRIBUTOR:  %add1 = add i32 %c0, %c1<br>
-; ATTRIBUTOR:  %add2 = add i32 %add1, %c2<br>
-; ATTRIBUTOR:  %add3 = add i32 %add2, %c3l<br>
-; ATTRIBUTOR:  %add4 = add i32 %add3, %c4l<br>
   %add1 = add i32 %c0, %c1<br>
   %add2 = add i32 %add1, %c2<br>
   %add3 = add i32 %add2, %c3l<br>
@@ -804,17 +1241,30 @@ define i32 @exact(i32* align 8 %a, i32* align 8 %b) {<br>
<br>
 @G = external global i8<br>
 define i32* @ret_const() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_const()<br>
+; CHECK-NEXT:    [[BC:%.*]] = bitcast i8* @G to i32*<br>
+; CHECK-NEXT:    ret i32* [[BC]]<br>
+;<br>
   %bc = bitcast i8* @G to i32*<br>
   ret i32* %bc<br>
 }<br>
 define i32* @use_const() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@use_const()<br>
+; CHECK-NEXT:    ret i32* bitcast (i8* @G to i32*)<br>
+;<br>
   %c = call i32* @ret_const()<br>
-  ; ATTRIBUTOR: ret i32* bitcast (i8* @G to i32*)<br>
   ret i32* %c<br>
 }<br>
 define i32* @dont_use_const() #0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@dont_use_const()<br>
+; IS__TUNIT____-NEXT:    [[C:%.*]] = musttail call i32* @ret_const()<br>
+; IS__TUNIT____-NEXT:    ret i32* [[C]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@dont_use_const()<br>
+; IS__CGSCC____-NEXT:    [[C:%.*]] = musttail call nonnull dereferenceable(1) i32* @ret_const()<br>
+; IS__CGSCC____-NEXT:    ret i32* [[C]]<br>
+;<br>
   %c = musttail call i32* @ret_const()<br>
-  ; ATTRIBUTOR: ret i32* %c<br>
   ret i32* %c<br>
 }<br>
<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/undefined_behavior.ll b/llvm/test/Transforms/Attributor/undefined_behavior.ll<br>
index 4265de525e73..4aa9cef4a64f 100644<br>
--- a/llvm/test/Transforms/Attributor/undefined_behavior.ll<br>
+++ b/llvm/test/Transforms/Attributor/undefined_behavior.ll<br>
@@ -1,4 +1,8 @@<br>
-; RUN: opt --attributor --attributor-disable=false -S < %s | FileCheck %s --check-prefix=ATTRIBUTOR<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=2 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
<br>
@@ -9,16 +13,16 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
 ; -- Load tests --<br>
<br>
 define void @load_wholly_unreachable() {<br>
-; ATTRIBUTOR-LABEL: @load_wholly_unreachable(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@load_wholly_unreachable()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %a = load i32, i32* null<br>
   ret void<br>
 }<br>
<br>
 define void @loads_wholly_unreachable() {<br>
-; ATTRIBUTOR-LABEL: @loads_wholly_unreachable(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@loads_wholly_unreachable()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %a = load i32, i32* null<br>
   %b = load i32, i32* null<br>
@@ -27,12 +31,13 @@ define void @loads_wholly_unreachable() {<br>
<br>
<br>
 define void @load_single_bb_unreachable(i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @load_single_bb_unreachable(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[COND:%.*]], label [[T:%.*]], label [[E:%.*]]<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@load_single_bb_unreachable<br>
+; CHECK-SAME: (i1 [[COND:%.*]])<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -45,20 +50,23 @@ e:<br>
 ; Note that while the load is removed (because it's unused), the block<br>
 ; is not changed to unreachable<br>
 define void @load_null_pointer_is_defined() "null-pointer-is-valid"="true" {<br>
-; ATTRIBUTOR-LABEL: @load_null_pointer_is_defined(<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@load_null_pointer_is_defined()<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %a = load i32, i32* null<br>
   ret void<br>
 }<br>
<br>
 define internal i32* @ret_null() {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ret_null()<br>
+; IS__CGSCC____-NEXT:    ret i32* null<br>
+;<br>
   ret i32* null<br>
 }<br>
<br>
 define void @load_null_propagated() {<br>
-; ATTRIBUTOR-LABEL: @load_null_propagated(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@load_null_propagated()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %ptr = call i32* @ret_null()<br>
   %a = load i32, i32* %ptr<br>
@@ -68,20 +76,21 @@ define void @load_null_propagated() {<br>
 ; -- Store tests --<br>
<br>
 define void @store_wholly_unreachable() {<br>
-; ATTRIBUTOR-LABEL: @store_wholly_unreachable(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@store_wholly_unreachable()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   store i32 5, i32* null<br>
   ret void<br>
 }<br>
<br>
 define void @store_single_bb_unreachable(i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @store_single_bb_unreachable(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[COND:%.*]], label [[T:%.*]], label [[E:%.*]]<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@store_single_bb_unreachable<br>
+; CHECK-SAME: (i1 [[COND:%.*]])<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -92,9 +101,9 @@ e:<br>
 }<br>
<br>
 define void @store_null_pointer_is_defined() "null-pointer-is-valid"="true" {<br>
-; ATTRIBUTOR-LABEL: @store_null_pointer_is_defined(<br>
-; ATTRIBUTOR-NEXT:    store i32 5, i32* null<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@store_null_pointer_is_defined()<br>
+; CHECK-NEXT:    store i32 5, i32* null, align 536870912<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   store i32 5, i32* null<br>
   ret void<br>
@@ -103,6 +112,9 @@ define void @store_null_pointer_is_defined() "null-pointer-is-valid"="true" {<br>
 define void @store_null_propagated() {<br>
 ; ATTRIBUTOR-LABEL: @store_null_propagated(<br>
 ; ATTRIBUTOR-NEXT:    unreachable<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@store_null_propagated()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %ptr = call i32* @ret_null()<br>
   store i32 5, i32* %ptr<br>
@@ -112,20 +124,21 @@ define void @store_null_propagated() {<br>
 ; -- AtomicRMW tests --<br>
<br>
 define void @atomicrmw_wholly_unreachable() {<br>
-; ATTRIBUTOR-LABEL: @atomicrmw_wholly_unreachable(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@atomicrmw_wholly_unreachable()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %a = atomicrmw add i32* null, i32 1 acquire<br>
   ret void<br>
 }<br>
<br>
 define void @atomicrmw_single_bb_unreachable(i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @atomicrmw_single_bb_unreachable(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[COND:%.*]], label [[T:%.*]], label [[E:%.*]]<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@atomicrmw_single_bb_unreachable<br>
+; CHECK-SAME: (i1 [[COND:%.*]])<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -136,9 +149,9 @@ e:<br>
 }<br>
<br>
 define void @atomicrmw_null_pointer_is_defined() "null-pointer-is-valid"="true" {<br>
-; ATTRIBUTOR-LABEL: @atomicrmw_null_pointer_is_defined(<br>
-; ATTRIBUTOR-NEXT:    [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@atomicrmw_null_pointer_is_defined()<br>
+; CHECK-NEXT:    [[A:%.*]] = atomicrmw add i32* null, i32 1 acquire<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %a = atomicrmw add i32* null, i32 1 acquire<br>
   ret void<br>
@@ -147,6 +160,9 @@ define void @atomicrmw_null_pointer_is_defined() "null-pointer-is-valid"="true"<br>
 define void @atomicrmw_null_propagated() {<br>
 ; ATTRIBUTOR-LABEL: @atomicrmw_null_propagated(<br>
 ; ATTRIBUTOR-NEXT:    unreachable<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@atomicrmw_null_propagated()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %ptr = call i32* @ret_null()<br>
   %a = atomicrmw add i32* %ptr, i32 1 acquire<br>
@@ -156,20 +172,21 @@ define void @atomicrmw_null_propagated() {<br>
 ; -- AtomicCmpXchg tests --<br>
<br>
 define void @atomiccmpxchg_wholly_unreachable() {<br>
-; ATTRIBUTOR-LABEL: @atomiccmpxchg_wholly_unreachable(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@atomiccmpxchg_wholly_unreachable()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic<br>
   ret void<br>
 }<br>
<br>
 define void @atomiccmpxchg_single_bb_unreachable(i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @atomiccmpxchg_single_bb_unreachable(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[COND:%.*]], label [[T:%.*]], label [[E:%.*]]<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@atomiccmpxchg_single_bb_unreachable<br>
+; CHECK-SAME: (i1 [[COND:%.*]])<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -180,9 +197,9 @@ e:<br>
 }<br>
<br>
 define void @atomiccmpxchg_null_pointer_is_defined() "null-pointer-is-valid"="true" {<br>
-; ATTRIBUTOR-LABEL: @atomiccmpxchg_null_pointer_is_defined(<br>
-; ATTRIBUTOR-NEXT:    [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@atomiccmpxchg_null_pointer_is_defined()<br>
+; CHECK-NEXT:    [[A:%.*]] = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic<br>
+; CHECK-NEXT:    ret void<br>
 ;<br>
   %a = cmpxchg i32* null, i32 2, i32 3 acq_rel monotonic<br>
   ret void<br>
@@ -191,6 +208,9 @@ define void @atomiccmpxchg_null_pointer_is_defined() "null-pointer-is-valid"="tr<br>
 define void @atomiccmpxchg_null_propagated() {<br>
 ; ATTRIBUTOR-LABEL: @atomiccmpxchg_null_propagated(<br>
 ; ATTRIBUTOR-NEXT:    unreachable<br>
+;<br>
+; CHECK-LABEL: define {{[^@]+}}@atomiccmpxchg_null_propagated()<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
   %ptr = call i32* @ret_null()<br>
   %a = cmpxchg i32* %ptr, i32 2, i32 3 acq_rel monotonic<br>
@@ -202,14 +222,13 @@ define void @atomiccmpxchg_null_propagated() {<br>
 ; Note: The unreachable on %t and %e is _not_ from AAUndefinedBehavior<br>
<br>
 define i32 @cond_br_on_undef() {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    unreachable<br>
 ;<br>
-<br>
   br i1 undef, label %t, label %e<br>
 t:<br>
   ret i32 1<br>
@@ -218,21 +237,21 @@ e:<br>
 }<br>
<br>
 ; More complicated branching<br>
-define void @cond_br_on_undef2(i1 %cond) {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef2(<br>
-; ATTRIBUTOR-NEXT:    br i1 [[COND:%.*]], label [[T1:%.*]], label [[E1:%.*]]<br>
-; ATTRIBUTOR:       t1:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       t2:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e2:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e1:<br>
-; ATTRIBUTOR-NEXT:    ret void<br>
-;<br>
-<br>
   ; Valid branch - verify that this is not converted<br>
   ; to unreachable.<br>
+define void @cond_br_on_undef2(i1 %cond) {<br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef2<br>
+; CHECK-SAME: (i1 [[COND:%.*]])<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T1:%.*]], label [[E1:%.*]]<br>
+; CHECK:       t1:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       t2:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e2:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e1:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   br i1 %cond, label %t1, label %e1<br>
 t1:<br>
   br i1 undef, label %t2, label %e2<br>
@@ -245,17 +264,20 @@ e1:<br>
 }<br>
<br>
 define i1 @ret_undef() {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_undef()<br>
+; CHECK-NEXT:    ret i1 undef<br>
+;<br>
   ret i1 undef<br>
 }<br>
<br>
 define void @cond_br_on_undef_interproc() {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef_interproc(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-  <br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %cond = call i1 @ret_undef()<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -265,6 +287,13 @@ e:<br>
 }<br>
<br>
 define i1 @ret_undef2() {<br>
+; CHECK-LABEL: define {{[^@]+}}@ret_undef2()<br>
+; CHECK-NEXT:    br i1 true, label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    ret i1 undef<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   br i1 true, label %t, label %e<br>
 t:<br>
   ret i1 undef<br>
@@ -274,12 +303,13 @@ e:<br>
<br>
 ; More complicated interproc deduction of undef<br>
 define void @cond_br_on_undef_interproc2() {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef_interproc2(<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef_interproc2()<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %cond = call i1 @ret_undef2()<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -291,13 +321,13 @@ e:<br>
 ; Branch on undef that depends on propagation of<br>
 ; undef of a previous instruction.<br>
 define i32 @cond_br_on_undef3() {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef3(<br>
-; ATTRIBUTOR-NEXT:    br label %t<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    ret i32 1<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    unreachable<br>
-<br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef3()<br>
+; CHECK-NEXT:    br label [[T:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    ret i32 1<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %cond = icmp ne i32 1, undef<br>
   br i1 %cond, label %t, label %e<br>
 t:<br>
@@ -309,15 +339,15 @@ e:<br>
 ; Branch on undef because of uninitialized value.<br>
 ; FIXME: Currently it doesn't propagate the undef.<br>
 define i32 @cond_br_on_undef_uninit() {<br>
-; ATTRIBUTOR-LABEL: @cond_br_on_undef_uninit(<br>
-; ATTRIBUTOR-NEXT:    %alloc = alloca i1<br>
-; ATTRIBUTOR-NEXT:    %cond = load i1, i1* %alloc<br>
-; ATTRIBUTOR-NEXT:    br i1 %cond, label %t, label %e<br>
-; ATTRIBUTOR:       t:<br>
-; ATTRIBUTOR-NEXT:    ret i32 1<br>
-; ATTRIBUTOR:       e:<br>
-; ATTRIBUTOR-NEXT:    ret i32 2<br>
-  <br>
+; CHECK-LABEL: define {{[^@]+}}@cond_br_on_undef_uninit()<br>
+; CHECK-NEXT:    [[ALLOC:%.*]] = alloca i1<br>
+; CHECK-NEXT:    [[COND:%.*]] = load i1, i1* [[ALLOC]], align 1<br>
+; CHECK-NEXT:    br i1 [[COND]], label [[T:%.*]], label [[E:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    ret i32 1<br>
+; CHECK:       e:<br>
+; CHECK-NEXT:    ret i32 2<br>
+;<br>
   %alloc = alloca i1<br>
   %cond = load i1, i1* %alloc<br>
   br i1 %cond, label %t, label %e<br>
@@ -330,8 +360,16 @@ e:<br>
 ; Note that the `load` has UB (so it will be changed to unreachable)<br>
 ; and the branch is a terminator that can be constant-folded.<br>
 ; We want to test that doing both won't cause a segfault.<br>
+; MODULE-NOT: @callee(<br>
 define internal i32 @callee(i1 %C, i32* %A) {<br>
-; ATTRIBUTOR-NOT: @callee(<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@callee()<br>
+; IS__CGSCC____-NEXT:  entry:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       T:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+; IS__CGSCC____:       F:<br>
+; IS__CGSCC____-NEXT:    ret i32 1<br>
 ;<br>
 entry:<br>
   %A.0 = load i32, i32* null<br>
@@ -345,8 +383,9 @@ F:<br>
 }<br>
<br>
 define i32 @foo() {<br>
-; ATTRIBUTOR-LABEL: @foo()<br>
-; ATTRIBUTOR-NEXT:    ret i32 1<br>
+; CHECK-LABEL: define {{[^@]+}}@foo()<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   %X = call i32 @callee(i1 false, i32* null)<br>
   ret i32 %X<br>
 }<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/value-simplify.ll b/llvm/test/Transforms/Attributor/value-simplify.ll<br>
index 5a131c6f0b8c..931212f53967 100644<br>
--- a/llvm/test/Transforms/Attributor/value-simplify.ll<br>
+++ b/llvm/test/Transforms/Attributor/value-simplify.ll<br>
@@ -1,38 +1,59 @@<br>
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
-; RUN: opt -attributor --attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s<br>
-; TODO: Add max-iteration check<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=4 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
-; Disable update test checks and enable it where required.<br>
-; UTC_ARGS: --disable<br>
-<br>
-; ModuleID = 'value-simplify.ll'<br>
-source_filename = "value-simplify.ll"<br>
 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"<br>
 declare void @f(i32)<br>
<br>
 ; Test1: Replace argument with constant<br>
 define internal void @test1(i32 %a) {<br>
-; CHECK: tail call void @f(i32 1)<br>
+; CHECK-LABEL: define {{[^@]+}}@test1()<br>
+; CHECK-NEXT:    tail call void @f(i32 1)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @f(i32 %a)<br>
   ret void<br>
 }<br>
<br>
 define void @test1_helper() {<br>
+; CHECK-LABEL: define {{[^@]+}}@test1_helper()<br>
+; CHECK-NEXT:    tail call void @test1()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   tail call void @test1(i32 1)<br>
   ret void<br>
 }<br>
<br>
 ; TEST 2 : Simplify return value<br>
 define i32 @return0() {<br>
+; CHECK-LABEL: define {{[^@]+}}@return0()<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
   ret i32 0<br>
 }<br>
<br>
 define i32 @return1() {<br>
+; CHECK-LABEL: define {{[^@]+}}@return1()<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   ret i32 1<br>
 }<br>
<br>
-; CHECK: define i32 @test2_1(i1 %c)<br>
 define i32 @test2_1(i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2_1<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK:       if.true:<br>
+; CHECK-NEXT:    [[RET0:%.*]] = add i32 0, 1<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       if.false:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[RET:%.*]] = phi i32 [ [[RET0]], [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   br i1 %c, label %if.true, label %if.false<br>
 if.true:<br>
   %call = tail call i32 @return0()<br>
@@ -43,25 +64,36 @@ if.false:<br>
   br label %end<br>
 end:<br>
<br>
-; CHECK: %ret = phi i32 [ %ret0, %if.true ], [ 1, %if.false ]<br>
   %ret = phi i32 [ %ret0, %if.true ], [ %ret1, %if.false ]<br>
<br>
-; CHECK: ret i32 1<br>
   ret i32 1<br>
 }<br>
<br>
<br>
<br>
-; CHECK: define i32 @test2_2(i1 %c)<br>
 define i32 @test2_2(i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test2_2<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    ret i32 1<br>
+;<br>
   %ret = tail call i32 @test2_1(i1 %c)<br>
-; CHECK: ret i32 1<br>
   ret i32 %ret<br>
 }<br>
<br>
 declare void @use(i32)<br>
-; CHECK: define void @test3(i1 %c)<br>
 define void @test3(i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test3<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK:       if.true:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       if.false:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[R:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    tail call void @use(i32 1)<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   br i1 %c, label %if.true, label %if.false<br>
 if.true:<br>
   br label %end<br>
@@ -70,21 +102,40 @@ if.false:<br>
   br label %end<br>
 end:<br>
<br>
-; CHECK: %r = phi i32 [ 1, %if.true ], [ 1, %if.false ]<br>
   %r = phi i32 [ 1, %if.true ], [ %ret1, %if.false ]<br>
<br>
-; CHECK: tail call void @use(i32 1)<br>
   tail call void @use(i32 %r)<br>
   ret void<br>
 }<br>
<br>
 define void @test-select-phi(i1 %c) {<br>
+; CHECK-LABEL: define {{[^@]+}}@test-select-phi<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    tail call void @use(i32 1)<br>
+; CHECK-NEXT:    [[SELECT_NOT_SAME:%.*]] = select i1 [[C]], i32 1, i32 0<br>
+; CHECK-NEXT:    tail call void @use(i32 [[SELECT_NOT_SAME]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]<br>
+; CHECK:       if-true:<br>
+; CHECK-NEXT:    br label [[END:%.*]]<br>
+; CHECK:       if-false:<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    [[PHI_SAME:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    [[PHI_NOT_SAME:%.*]] = phi i32 [ 0, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    [[PHI_SAME_PROP:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ 1, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    [[PHI_SAME_UNDEF:%.*]] = phi i32 [ 1, [[IF_TRUE]] ], [ undef, [[IF_FALSE]] ]<br>
+; CHECK-NEXT:    [[SELECT_NOT_SAME_UNDEF:%.*]] = select i1 [[C]], i32 [[PHI_NOT_SAME]], i32 undef<br>
+; CHECK-NEXT:    tail call void @use(i32 1)<br>
+; CHECK-NEXT:    tail call void @use(i32 [[PHI_NOT_SAME]])<br>
+; CHECK-NEXT:    tail call void @use(i32 1)<br>
+; CHECK-NEXT:    tail call void @use(i32 1)<br>
+; CHECK-NEXT:    tail call void @use(i32 [[SELECT_NOT_SAME_UNDEF]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %select-same = select i1 %c, i32 1, i32 1<br>
-  ; CHECK: tail call void @use(i32 1)<br>
   tail call void @use(i32 %select-same)<br>
<br>
   %select-not-same = select i1 %c, i32 1, i32 0<br>
-  ; CHECK: tail call void @use(i32 %select-not-same)<br>
   tail call void @use(i32 %select-not-same)<br>
   br i1 %c, label %if-true, label %if-false<br>
 if-true:<br>
@@ -99,19 +150,14 @@ end:<br>
   %select-not-same-undef = select i1 %c, i32 %phi-not-same, i32 undef<br>
<br>
<br>
-  ; CHECK: tail call void @use(i32 1)<br>
   tail call void @use(i32 %phi-same)<br>
<br>
-  ; CHECK: tail call void @use(i32 %phi-not-same)<br>
   tail call void @use(i32 %phi-not-same)<br>
<br>
-  ; CHECK: tail call void @use(i32 1)<br>
   tail call void @use(i32 %phi-same-prop)<br>
<br>
-  ; CHECK: tail call void @use(i32 1)<br>
   tail call void @use(i32 %phi-same-undef)<br>
<br>
-  ; CHECK: tail call void @use(i32 %select-not-same-undef)<br>
   tail call void @use(i32 %select-not-same-undef)<br>
<br>
   ret void<br>
@@ -123,7 +169,7 @@ define i32 @ipccp1(i32 %a) {<br>
 ; CHECK-SAME: (i32 returned [[A:%.*]])<br>
 ; CHECK-NEXT:    br i1 true, label [[T:%.*]], label [[F:%.*]]<br>
 ; CHECK:       t:<br>
-; CHECK-NEXT:    ret i32 [[A:%.*]]<br>
+; CHECK-NEXT:    ret i32 [[A]]<br>
 ; CHECK:       f:<br>
 ; CHECK-NEXT:    unreachable<br>
 ;<br>
@@ -136,6 +182,13 @@ f:<br>
 }<br>
<br>
 define internal i1 @ipccp2i(i1 %a) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2i()<br>
+; IS__CGSCC____-NEXT:    br label [[T:%.*]]<br>
+; IS__CGSCC____:       t:<br>
+; IS__CGSCC____-NEXT:    ret i1 true<br>
+; IS__CGSCC____:       f:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
   br i1 %a, label %t, label %f<br>
 t:<br>
   ret i1 %a<br>
@@ -145,14 +198,25 @@ f:<br>
 }<br>
<br>
 define i1 @ipccp2() {<br>
-; CHECK-LABEL: define {{[^@]+}}@ipccp2()<br>
-; CHECK-NEXT:    ret i1 true<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp2()<br>
+; IS__TUNIT____-NEXT:    ret i1 true<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2()<br>
+; IS__CGSCC____-NEXT:    [[R:%.*]] = call i1 @ipccp2i()<br>
+; IS__CGSCC____-NEXT:    ret i1 [[R]]<br>
 ;<br>
   %r = call i1 @ipccp2i(i1 true)<br>
   ret i1 %r<br>
 }<br>
<br>
 define internal i1 @ipccp2ib(i1 %a) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp2ib()<br>
+; IS__CGSCC____-NEXT:    br label [[T:%.*]]<br>
+; IS__CGSCC____:       t:<br>
+; IS__CGSCC____-NEXT:    ret i1 true<br>
+; IS__CGSCC____:       f:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
   br i1 %a, label %t, label %f<br>
 t:<br>
   ret i1 true<br>
@@ -170,6 +234,13 @@ define i1 @ipccp2b() {<br>
 }<br>
<br>
 define internal i32 @ipccp3i(i32 %a) {<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3i()<br>
+; IS__CGSCC____-NEXT:    br label [[T:%.*]]<br>
+; IS__CGSCC____:       t:<br>
+; IS__CGSCC____-NEXT:    ret i32 7<br>
+; IS__CGSCC____:       f:<br>
+; IS__CGSCC____-NEXT:    unreachable<br>
+;<br>
   %c = icmp eq i32 %a, 7<br>
   br i1 %c, label %t, label %f<br>
 t:<br>
@@ -180,20 +251,27 @@ f:<br>
 }<br>
<br>
 define i32 @ipccp3() {<br>
-; CHECK-LABEL: define {{[^@]+}}@ipccp3()<br>
-; CHECK-NEXT:    ret i32 7<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@ipccp3()<br>
+; IS__TUNIT____-NEXT:    ret i32 7<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@ipccp3()<br>
+; IS__CGSCC____-NEXT:    [[R:%.*]] = call i32 @ipccp3i()<br>
+; IS__CGSCC____-NEXT:    ret i32 [[R]]<br>
+;<br>
   %r = call i32 @ipccp3i(i32 7)<br>
   ret i32 %r<br>
 }<br>
<br>
-; UTC_ARGS: --enable<br>
-<br>
 ; Do not touch complicated arguments (for now)<br>
 %struct.X = type { i8* }<br>
 define internal i32* @test_inalloca(i32* inalloca %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test_inalloca<br>
-; CHECK-SAME: (i32* inalloca noalias nofree returned writeonly align 536870912 [[A:%.*]])<br>
-; CHECK-NEXT:    ret i32* [[A]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test_inalloca<br>
+; IS__TUNIT____-SAME: (i32* inalloca noalias nofree returned writeonly align 536870912 "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    ret i32* [[A]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_inalloca<br>
+; IS__CGSCC____-SAME: (i32* inalloca noalias nofree returned writeonly "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    ret i32* [[A]]<br>
 ;<br>
   ret i32* %a<br>
 }<br>
@@ -207,29 +285,45 @@ define i32* @complicated_args_inalloca() {<br>
 }<br>
<br>
 define internal void @test_sret(%struct.X* sret %a, %struct.X** %b) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test_sret<br>
-; CHECK-SAME: (%struct.X* noalias nofree sret writeonly align 536870912 [[A:%.*]], %struct.X** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[B:%.*]])<br>
-; CHECK-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test_sret<br>
+; IS__TUNIT____-SAME: (%struct.X* noalias nofree sret writeonly align 536870912 [[A:%.*]], %struct.X** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_sret<br>
+; IS__CGSCC____-SAME: (%struct.X* noalias nofree sret writeonly [[A:%.*]], %struct.X** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    store %struct.X* [[A]], %struct.X** [[B]], align 8<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   store %struct.X* %a, %struct.X** %b<br>
   ret void<br>
 }<br>
 ; FIXME: Alignment and dereferenceability are not propagated to the argument<br>
 define void @complicated_args_sret(%struct.X** %b) {<br>
-; CHECK-LABEL: define {{[^@]+}}@complicated_args_sret<br>
-; CHECK-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]])<br>
-; CHECK-NEXT:    call void @test_sret(%struct.X* noalias nofree writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]])<br>
-; CHECK-NEXT:    ret void<br>
+;<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@complicated_args_sret<br>
+; IS__TUNIT____-SAME: (%struct.X** nocapture nofree writeonly [[B:%.*]])<br>
+; IS__TUNIT____-NEXT:    call void @test_sret(%struct.X* noalias nofree writeonly align 536870912 null, %struct.X** nocapture nofree writeonly align 8 [[B]])<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@complicated_args_sret<br>
+; IS__CGSCC____-SAME: (%struct.X** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[B:%.*]])<br>
+; IS__CGSCC____-NEXT:    call void @test_sret(%struct.X* noalias nofree writeonly align 536870912 null, %struct.X** nocapture nofree nonnull writeonly align 8 dereferenceable(8) [[B]])<br>
+; IS__CGSCC____-NEXT:    ret void<br>
 ;<br>
   call void @test_sret(%struct.X* null, %struct.X** %b)<br>
   ret void<br>
 }<br>
<br>
 define internal %struct.X* @test_nest(%struct.X* nest %a) {<br>
-; CHECK-LABEL: define {{[^@]+}}@test_nest<br>
-; CHECK-SAME: (%struct.X* nest noalias nofree readnone returned align 536870912 [[A:%.*]])<br>
-; CHECK-NEXT:    ret %struct.X* [[A]]<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@test_nest<br>
+; IS__TUNIT____-SAME: (%struct.X* nest noalias nofree readnone returned align 536870912 "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__TUNIT____-NEXT:    ret %struct.X* [[A]]<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@test_nest<br>
+; IS__CGSCC____-SAME: (%struct.X* nest noalias nofree readnone returned "no-capture-maybe-returned" [[A:%.*]])<br>
+; IS__CGSCC____-NEXT:    ret %struct.X* [[A]]<br>
 ;<br>
   ret %struct.X* %a<br>
 }<br>
@@ -244,6 +338,21 @@ define %struct.X* @complicated_args_nest() {<br>
<br>
 @S = external global %struct.X<br>
 define internal void @test_byval(%struct.X* byval %a) {<br>
+; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@test_byval<br>
+; IS__CGSCC_OPM-SAME: (%struct.X* noalias nocapture nofree nonnull writeonly byval align 8 dereferenceable(8) [[A:%.*]])<br>
+; IS__CGSCC_OPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X:%.*]], %struct.X* [[A]], i32 0, i32 0<br>
+; IS__CGSCC_OPM-NEXT:    store i8* null, i8** [[G0]], align 8<br>
+; IS__CGSCC_OPM-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test_byval<br>
+; IS__CGSCC_NPM-SAME: (i8* nocapture nofree readnone [[TMP0:%.*]])<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PRIV:%.*]] = alloca [[STRUCT_X:%.*]]<br>
+; IS__CGSCC_NPM-NEXT:    [[A_PRIV_CAST:%.*]] = bitcast %struct.X* [[A_PRIV]] to i8**<br>
+; IS__CGSCC_NPM-NEXT:    store i8* [[TMP0]], i8** [[A_PRIV_CAST]]<br>
+; IS__CGSCC_NPM-NEXT:    [[G0:%.*]] = getelementptr [[STRUCT_X]], %struct.X* [[A_PRIV]], i32 0, i32 0<br>
+; IS__CGSCC_NPM-NEXT:    store i8* null, i8** [[G0]], align 8<br>
+; IS__CGSCC_NPM-NEXT:    ret void<br>
+;<br>
   %g0 = getelementptr %struct.X, %struct.X* %a, i32 0, i32 0<br>
   store i8* null, i8** %g0<br>
   ret void<br>
@@ -383,4 +492,3 @@ define internal i8 @callee(i8 %a) {<br>
   ret i8 %c<br>
 }<br>
<br>
-; UTC_ARGS: --disable<br>
<br>
diff  --git a/llvm/test/Transforms/Attributor/willreturn.ll b/llvm/test/Transforms/Attributor/willreturn.ll<br>
index f521293e5a97..f168aa7864df 100644<br>
--- a/llvm/test/Transforms/Attributor/willreturn.ll<br>
+++ b/llvm/test/Transforms/Attributor/willreturn.ll<br>
@@ -1,19 +1,23 @@<br>
-; RUN: opt -passes=attributor --attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_MODULE<br>
-; RUN: opt -passes=attributor-cgscc --attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=ATTRIBUTOR,ATTRIBUTOR_CGSCC<br>
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes<br>
+; RUN: opt -attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=5 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_NPM,NOT_CGSCC_OPM,NOT_TUNIT_NPM,IS__TUNIT____,IS________OPM,IS__TUNIT_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal -attributor-disable=false -attributor-max-iterations-verify -attributor-annotate-decl-cs -attributor-max-iterations=6 -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_CGSCC_OPM,NOT_CGSCC_NPM,NOT_TUNIT_OPM,IS__TUNIT____,IS________NPM,IS__TUNIT_NPM<br>
+; RUN: opt -attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_NPM,IS__CGSCC____,IS________OPM,IS__CGSCC_OPM<br>
+; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal -attributor-disable=false -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,NOT_TUNIT_NPM,NOT_TUNIT_OPM,NOT_CGSCC_OPM,IS__CGSCC____,IS________NPM,IS__CGSCC_NPM<br>
<br>
-<br>
-target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target datalayout = "e-m:e-i54:64-f80:128-n8:16:32:64-S128"<br>
<br>
 ; Test cases specifically designed for the "willreturn" function attribute.<br>
 ; We use FIXME's to indicate problems and missing attributes.<br>
<br>
<br>
 ; TEST 1 (positive case)<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define void @only_return()<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
 define void @only_return() #0 {<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@only_return()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  ret void<br>
 }<br>
<br>
<br>
@@ -25,9 +29,22 @@ define void @only_return() #0 {<br>
 ; }<br>
<br>
 ; FIXME: missing willreturn<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NEXT: define i32 @fib(i32 %0) local_unnamed_addr<br>
+; CHECK: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
 define i32 @fib(i32 %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@fib<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP0]], 2<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP9:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = add nsw i32 [[TMP0]], -1<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @fib(i32 [[TMP4]])<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = add nsw i32 [[TMP0]], -2<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = tail call i32 @fib(i32 [[TMP6]])<br>
+; CHECK-NEXT:    [[TMP8:%.*]] = add nsw i32 [[TMP7]], [[TMP5]]<br>
+; CHECK-NEXT:    ret i32 [[TMP8]]<br>
+; CHECK:       9:<br>
+; CHECK-NEXT:    ret i32 [[TMP0]]<br>
+;<br>
   %2 = icmp slt i32 %0, 2<br>
   br i1 %2, label %9, label %3<br>
<br>
@@ -53,11 +70,27 @@ define i32 @fib(i32 %0) local_unnamed_addr #0 {<br>
 ; }<br>
 ; fact_maybe_not(-1) doesn't stop.<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @fact_maybe_not_halt(i32 %0) local_unnamed_addr<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable<br>
+; CHECK-NOT: willreturn<br>
 define i32 @fact_maybe_not_halt(i32 %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@fact_maybe_not_halt<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP11:%.*]], label [[TMP3:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ [[TMP8:%.*]], [[TMP3]] ], [ [[TMP0]], [[TMP1:%.*]] ]<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = phi i32 [ [[TMP9:%.*]], [[TMP3]] ], [ 1, [[TMP1]] ]<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = icmp sgt i32 [[TMP4]], 0<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = sext i1 [[TMP6]] to i32<br>
+; CHECK-NEXT:    [[TMP8]] = add nsw i32 [[TMP4]], [[TMP7]]<br>
+; CHECK-NEXT:    [[TMP9]] = mul nsw i32 [[TMP4]], [[TMP5]]<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP8]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP10]], label [[TMP11]], label [[TMP3]]<br>
+; CHECK:       11:<br>
+; CHECK-NEXT:    [[TMP12:%.*]] = phi i32 [ 1, [[TMP1]] ], [ [[TMP9]], [[TMP3]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP12]]<br>
+;<br>
   %2 = icmp eq i32 %0, 0<br>
   br i1 %2, label %11, label %3<br>
<br>
@@ -87,10 +120,24 @@ define i32 @fact_maybe_not_halt(i32 %0) local_unnamed_addr #0 {<br>
 ;   return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @fact_loop(i32 %0) local_unnamed_addr<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
 define i32 @fact_loop(i32 %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@fact_loop<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP0]], 1<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ 1, [[TMP1:%.*]] ], [ [[TMP8:%.*]], [[TMP5]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP4]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = phi i32 [ [[TMP9:%.*]], [[TMP5]] ], [ 1, [[TMP1]] ]<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8]], [[TMP5]] ], [ 1, [[TMP1]] ]<br>
+; CHECK-NEXT:    [[TMP8]] = mul nsw i32 [[TMP6]], [[TMP7]]<br>
+; CHECK-NEXT:    [[TMP9]] = add nuw nsw i32 [[TMP6]], 1<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP6]], [[TMP0]]<br>
+; CHECK-NEXT:    br i1 [[TMP10]], label [[TMP3]], label [[TMP5]]<br>
+;<br>
   %2 = icmp slt i32 %0, 1<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -118,10 +165,19 @@ define i32 @fact_loop(i32 %0) local_unnamed_addr #0 {<br>
<br>
 declare void @sink() nounwind willreturn nosync nofree<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @mutual_recursion1(i1 %c)<br>
+; CHECK: Function Attrs: nofree noinline nosync nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @mutual_recursion1(i1 %c) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@mutual_recursion1<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    br i1 [[C]], label [[REC:%.*]], label [[END:%.*]]<br>
+; CHECK:       rec:<br>
+; CHECK-NEXT:    call void @sink()<br>
+; CHECK-NEXT:    call void @mutual_recursion2(i1 [[C]])<br>
+; CHECK-NEXT:    br label [[END]]<br>
+; CHECK:       end:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   br i1 %c, label %rec, label %end<br>
 rec:<br>
   call void @sink()<br>
@@ -132,10 +188,14 @@ end:<br>
 }<br>
<br>
<br>
-; ATTRIBUTOR: Function Attrs: nofree noinline nosync nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @mutual_recursion2(i1 %c)<br>
+; CHECK: Function Attrs: nofree noinline nosync nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @mutual_recursion2(i1 %c) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@mutual_recursion2<br>
+; CHECK-SAME: (i1 [[C:%.*]])<br>
+; CHECK-NEXT:    call void @mutual_recursion1(i1 [[C]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   call void @mutual_recursion1(i1 %c)<br>
   ret void<br>
 }<br>
@@ -143,14 +203,17 @@ define void @mutual_recursion2(i1 %c) #0 {<br>
<br>
 ; TEST 5 (negative case)<br>
 ; call exit/abort (has noreturn attribute)<br>
-; ATTRIBUTOR: Function Attrs: noreturn<br>
-; ATTRIBUTOR-NEXT: declare void @exit(i32) local_unnamed_add<br>
+; CHECK: Function Attrs: noreturn<br>
+; CHECK-NEXT: declare void @exit(i32) local_unnamed_add<br>
 declare void @exit(i32 %0) local_unnamed_addr noreturn<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline noreturn nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @only_exit() local_unnamed_addr<br>
+; CHECK: Function Attrs: noinline noreturn nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @only_exit() local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@only_exit() local_unnamed_addr<br>
+; CHECK-NEXT:    tail call void @exit(i32 0)<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call void @exit(i32 0)<br>
   unreachable<br>
 }<br>
@@ -165,10 +228,26 @@ define void @only_exit() local_unnamed_addr #0 {<br>
 ;     }<br>
 ;     return;<br>
 ; }<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @conditional_exit(i32 %0, i32* nocapture readonly %1) local_unnamed_addr<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @conditional_exit(i32 %0, i32* nocapture readonly %1) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@conditional_exit<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32* nocapture readonly [[TMP1:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    tail call void @exit(i32 0)<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = load i32, i32* [[TMP1]], align 4<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i32 [[TMP6]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP7]], label [[TMP9:%.*]], label [[TMP8:%.*]]<br>
+; CHECK:       8:<br>
+; CHECK-NEXT:    tail call void @exit(i32 1)<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       9:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
   %3 = icmp eq i32 %0, 0<br>
   br i1 %3, label %5, label %4<br>
<br>
@@ -191,77 +270,100 @@ define void @conditional_exit(i32 %0, i32* nocapture readonly %1) local_unnamed_<br>
<br>
 ; TEST 6 (positive case)<br>
 ; Call intrinsic function<br>
-; ATTRIBUTOR: Function Attrs: nounwind readnone speculatable willreturn<br>
-; ATTRIBUTOR-NEXT: declare float @llvm.floor.f32(float)<br>
+; CHECK: Function Attrs: nounwind readnone speculatable willreturn<br>
+; CHECK-NEXT: declare float @llvm.floor.f32(float)<br>
 declare float @llvm.floor.f32(float)<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC:  Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT:   define void @call_floor(float %a)<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
+; CHECK_CGSCC:  Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
 define void @call_floor(float %a) #0 {<br>
-    tail call float @llvm.floor.f32(float %a)<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_floor<br>
+; CHECK-SAME: (float [[A:%.*]])<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call float @llvm.floor.f32(float %a)<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define float @call_floor2(float %a)<br>
+; CHECK: Function Attrs: noinline nosync nounwind readnone uwtable willreturn<br>
 define float @call_floor2(float %a) #0 {<br>
-    %c = tail call float @llvm.floor.f32(float %a)<br>
-    ret float %c<br>
+; CHECK-LABEL: define {{[^@]+}}@call_floor2<br>
+; CHECK-SAME: (float [[A:%.*]])<br>
+; CHECK-NEXT:    [[C:%.*]] = tail call float @llvm.floor.f32(float [[A]])<br>
+; CHECK-NEXT:    ret float [[C]]<br>
+;<br>
+  %c = tail call float @llvm.floor.f32(float %a)<br>
+  ret float %c<br>
 }<br>
<br>
<br>
 ; TEST 7 (negative case)<br>
 ; Call function declaration without willreturn<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: declare void @maybe_noreturn()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
+; CHECK-NEXT: declare void @maybe_noreturn()<br>
 declare void @maybe_noreturn() #0<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @call_maybe_noreturn()<br>
+; CHECK: Function Attrs: noinline nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @call_maybe_noreturn() #0 {<br>
-    tail call void @maybe_noreturn()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@call_maybe_noreturn()<br>
+; CHECK-NEXT:    tail call void @maybe_noreturn()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @maybe_noreturn()<br>
+  ret void<br>
 }<br>
<br>
<br>
 ; TEST 8 (positive case)<br>
 ; Check propagation.<br>
<br>
-; ATTRIBUTOR: Function Attrs: norecurse willreturn<br>
-; ATTRIBUTOR-NEXT: declare void @will_return()<br>
+; CHECK: Function Attrs: norecurse willreturn<br>
+; CHECK-NEXT: declare void @will_return()<br>
 declare void @will_return() willreturn norecurse<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: noinline nounwind uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define void @f1()<br>
+; CHECK_MODULE: Function Attrs: noinline nounwind uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
 define void @f1() #0 {<br>
-    tail call void @will_return()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@f1()<br>
+; CHECK-NEXT:    tail call void @will_return()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @will_return()<br>
+  ret void<br>
 }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: noinline nounwind uwtable<br>
+; CHECK_MODULE: Function Attrs: noinline nounwind uwtable<br>
 ; FIXME: Because we do not derive norecurse in the module run anymore, willreturn is missing as well.<br>
-; ATTRIBUTOR_MODULE-NOT: willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define void @f2()<br>
+; CHECK_MODULE-NOT: willreturn<br>
+; CHECK_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
 define void @f2() #0 {<br>
-    tail call void @f1()<br>
-    ret void<br>
+; CHECK-LABEL: define {{[^@]+}}@f2()<br>
+; CHECK-NEXT:    tail call void @f1()<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
+  tail call void @f1()<br>
+  ret void<br>
 }<br>
<br>
<br>
 ; TEST 9 (negative case)<br>
 ; call willreturn function in endless loop.<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: noinline noreturn nounwind uwtable<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: noinline norecurse noreturn nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @call_will_return_but_has_loop()<br>
+; CHECK_MODULE: Function Attrs: noinline noreturn nounwind uwtable<br>
+; CHECK_CGSCC: Function Attrs: noinline norecurse noreturn nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @call_will_return_but_has_loop() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@call_will_return_but_has_loop()<br>
+; CHECK-NEXT:    br label [[LABEL1:%.*]]<br>
+; CHECK:       label1:<br>
+; CHECK-NEXT:    tail call void @will_return()<br>
+; CHECK-NEXT:    br label [[LABEL2:%.*]]<br>
+; CHECK:       label2:<br>
+; CHECK-NEXT:    br label [[LABEL1]]<br>
+;<br>
   br label %label1<br>
 label1:<br>
   tail call void @will_return()<br>
@@ -274,21 +376,40 @@ label2:<br>
 ; TEST 10 (positive case)<br>
 ; invoke a function with willreturn<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: declare i1 @maybe_raise_exception()<br>
+; CHECK: Function Attrs: noinline uwtable willreturn<br>
+; CHECK-NEXT: declare i1 @maybe_raise_exception()<br>
 declare i1 @maybe_raise_exception() #1 willreturn<br>
<br>
-; ATTRIBUTOR: Function Attrs: nounwind willreturn<br>
-; ATTRIBUTOR-NEXT: define void @invoke_test()<br>
+; CHECK: Function Attrs: nounwind willreturn<br>
 define void @invoke_test() personality i32 (...)* @__gxx_personality_v0 {<br>
+; IS__TUNIT____-LABEL: define {{[^@]+}}@invoke_test() #12 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__TUNIT____-NEXT:    [[TMP1:%.*]] = invoke i1 @maybe_raise_exception()<br>
+; IS__TUNIT____-NEXT:    to label [[N:%.*]] unwind label [[F:%.*]]<br>
+; IS__TUNIT____:       N:<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+; IS__TUNIT____:       F:<br>
+; IS__TUNIT____-NEXT:    [[VAL:%.*]] = landingpad { i8*, i32 }<br>
+; IS__TUNIT____-NEXT:    catch i8* null<br>
+; IS__TUNIT____-NEXT:    ret void<br>
+;<br>
+; IS__CGSCC____-LABEL: define {{[^@]+}}@invoke_test() #14 personality i32 (...)* @__gxx_personality_v0<br>
+; IS__CGSCC____-NEXT:    [[TMP1:%.*]] = invoke i1 @maybe_raise_exception()<br>
+; IS__CGSCC____-NEXT:    to label [[N:%.*]] unwind label [[F:%.*]]<br>
+; IS__CGSCC____:       N:<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+; IS__CGSCC____:       F:<br>
+; IS__CGSCC____-NEXT:    [[VAL:%.*]] = landingpad { i8*, i32 }<br>
+; IS__CGSCC____-NEXT:    catch i8* null<br>
+; IS__CGSCC____-NEXT:    ret void<br>
+;<br>
   invoke i1 @maybe_raise_exception()<br>
-      to label %N unwind label %F<br>
+  to label %N unwind label %F<br>
   N:<br>
-    ret void<br>
+  ret void<br>
   F:<br>
-    %val = landingpad { i8*, i32 }<br>
-                  catch i8* null<br>
-    ret void<br>
+  %val = landingpad { i8*, i32 }<br>
+  catch i8* null<br>
+  ret void<br>
 }<br>
<br>
 declare i32 @__gxx_personality_v0(...)<br>
@@ -304,10 +425,24 @@ declare i32 @__gxx_personality_v0(...)<br>
 ;    return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @loop_constant_trip_count(i32* nocapture nofree readonly %0)<br>
+; CHECK_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable willreturn<br>
 define i32 @loop_constant_trip_count(i32* nocapture readonly %0) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@loop_constant_trip_count<br>
+; CHECK-SAME: (i32* nocapture nofree readonly [[TMP0:%.*]])<br>
+; CHECK-NEXT:    br label [[TMP3:%.*]]<br>
+; CHECK:       2:<br>
+; CHECK-NEXT:    ret i32 [[TMP8:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = phi i64 [ 0, [[TMP1:%.*]] ], [ [[TMP9:%.*]], [[TMP3]] ]<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = phi i32 [ 0, [[TMP1]] ], [ [[TMP8]], [[TMP3]] ]<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i64 [[TMP4]]<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = load i32, i32* [[TMP6]], align 4<br>
+; CHECK-NEXT:    [[TMP8]] = add nsw i32 [[TMP7]], [[TMP5]]<br>
+; CHECK-NEXT:    [[TMP9]] = add nuw nsw i64 [[TMP4]], 1<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[TMP9]], 10<br>
+; CHECK-NEXT:    br i1 [[TMP10]], label [[TMP2:%.*]], label [[TMP3]]<br>
+;<br>
   br label %3<br>
<br>
 ; <label>:2:                                      ; preds = %3<br>
@@ -335,12 +470,28 @@ define i32 @loop_constant_trip_count(i32* nocapture readonly %0) #0 {<br>
 ;     }<br>
 ;     return ans;<br>
 ; }<br>
-; FNATTR-NEXT: define i32 @loop_trip_count_unbound(i32 %0, i32 %1, i32* nocapture readonly %2, i32 %3) local_unnamed_addr<br>
-; ATTRIBUTOR_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @loop_trip_count_unbound(i32 %0, i32 %1, i32* nocapture nofree readonly %2, i32 %3) local_unnamed_addr<br>
+; CHECK_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable<br>
+; CHECK_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable<br>
+; CHECK-NOT: willreturn<br>
 define i32 @loop_trip_count_unbound(i32 %0, i32 %1, i32* nocapture readonly %2, i32 %3) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@loop_trip_count_unbound<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]], i32* nocapture nofree readonly [[TMP2:%.*]], i32 [[TMP3:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[TMP0]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP8:%.*]]<br>
+; CHECK:       6:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ 0, [[TMP4:%.*]] ], [ [[TMP14:%.*]], [[TMP8]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP7]]<br>
+; CHECK:       8:<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = phi i32 [ [[TMP15:%.*]], [[TMP8]] ], [ [[TMP0]], [[TMP4]] ]<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP14]], [[TMP8]] ], [ 0, [[TMP4]] ]<br>
+; CHECK-NEXT:    [[TMP11:%.*]] = zext i32 [[TMP9]] to i64<br>
+; CHECK-NEXT:    [[TMP12:%.*]] = getelementptr inbounds i32, i32* [[TMP2]], i64 [[TMP11]]<br>
+; CHECK-NEXT:    [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4<br>
+; CHECK-NEXT:    [[TMP14]] = add nsw i32 [[TMP13]], [[TMP10]]<br>
+; CHECK-NEXT:    [[TMP15]] = add i32 [[TMP9]], [[TMP3]]<br>
+; CHECK-NEXT:    [[TMP16:%.*]] = icmp eq i32 [[TMP15]], [[TMP1]]<br>
+; CHECK-NEXT:    br i1 [[TMP16]], label [[TMP6]], label [[TMP8]]<br>
+;<br>
   %5 = icmp eq i32 %0, %1<br>
   br i1 %5, label %6, label %8<br>
<br>
@@ -372,11 +523,30 @@ define i32 @loop_trip_count_unbound(i32 %0, i32 %1, i32* nocapture readonly %2,<br>
 ;  }<br>
<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @loop_trip_dec(i32 %0, i32* nocapture nofree readonly %1) local_unnamed_addr<br>
+; CHECK_MODULE: Function Attrs: argmemonly nofree noinline nosync nounwind readonly uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: argmemonly nofree noinline norecurse nosync nounwind readonly uwtable willreturn<br>
<br>
 define i32 @loop_trip_dec(i32 %0, i32* nocapture readonly %1) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@loop_trip_dec<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]], i32* nocapture nofree readonly [[TMP1:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], -1<br>
+; CHECK-NEXT:    br i1 [[TMP3]], label [[TMP4:%.*]], label [[TMP14:%.*]]<br>
+; CHECK:       4:<br>
+; CHECK-NEXT:    [[TMP5:%.*]] = sext i32 [[TMP0]] to i64<br>
+; CHECK-NEXT:    br label [[TMP6:%.*]]<br>
+; CHECK:       6:<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i64 [ [[TMP5]], [[TMP4]] ], [ [[TMP12:%.*]], [[TMP6]] ]<br>
+; CHECK-NEXT:    [[TMP8:%.*]] = phi i32 [ 0, [[TMP4]] ], [ [[TMP11:%.*]], [[TMP6]] ]<br>
+; CHECK-NEXT:    [[TMP9:%.*]] = getelementptr inbounds i32, i32* [[TMP1]], i64 [[TMP7]]<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4<br>
+; CHECK-NEXT:    [[TMP11]] = add nsw i32 [[TMP10]], [[TMP8]]<br>
+; CHECK-NEXT:    [[TMP12]] = add nsw i64 [[TMP7]], -1<br>
+; CHECK-NEXT:    [[TMP13:%.*]] = icmp sgt i64 [[TMP7]], 0<br>
+; CHECK-NEXT:    br i1 [[TMP13]], label [[TMP6]], label [[TMP14]]<br>
+; CHECK:       14:<br>
+; CHECK-NEXT:    [[TMP15:%.*]] = phi i32 [ 0, [[TMP2:%.*]] ], [ [[TMP11]], [[TMP6]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP15]]<br>
+;<br>
   %3 = icmp sgt i32 %0, -1<br>
   br i1 %3, label %4, label %14<br>
<br>
@@ -402,10 +572,18 @@ define i32 @loop_trip_dec(i32 %0, i32* nocapture readonly %1) local_unnamed_addr<br>
 ; TEST 14 (positive case)<br>
 ; multiple return<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @multiple_return(i32 %a)<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
 define i32 @multiple_return(i32 %a) #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@multiple_return<br>
+; CHECK-SAME: (i32 [[A:%.*]])<br>
+; CHECK-NEXT:    [[B:%.*]] = icmp eq i32 [[A]], 0<br>
+; CHECK-NEXT:    br i1 [[B]], label [[T:%.*]], label [[F:%.*]]<br>
+; CHECK:       t:<br>
+; CHECK-NEXT:    ret i32 1<br>
+; CHECK:       f:<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
   %b =  icmp eq i32 %a, 0<br>
   br i1 %b, label %t, label %f<br>
<br>
@@ -419,10 +597,15 @@ f:<br>
 ; unreachable exit<br>
<br>
 ; 15.1 (positive case)<br>
-; ATTRIBUTOR_MODULE: Function Attrs: noinline nounwind uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define void @unreachable_exit_positive1()<br>
+; CHECK_MODULE: Function Attrs: noinline nounwind uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: noinline norecurse nounwind uwtable willreturn<br>
 define void @unreachable_exit_positive1() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@unreachable_exit_positive1()<br>
+; CHECK-NEXT:    tail call void @will_return()<br>
+; CHECK-NEXT:    ret void<br>
+; CHECK:       unreachable_label:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call void @will_return()<br>
   ret void<br>
<br>
@@ -431,10 +614,26 @@ unreachable_label:<br>
   unreachable<br>
 }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @unreachable_exit_positive2(i32 %0)<br>
+; CHECK_MODULE: Function Attrs: nofree noinline nosync nounwind readnone uwtable willreturn<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn<br>
 define i32 @unreachable_exit_positive2(i32) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@unreachable_exit_positive2<br>
+; CHECK-SAME: (i32 [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt i32 [[TMP0]], 1<br>
+; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]<br>
+; CHECK:       3:<br>
+; CHECK-NEXT:    [[TMP4:%.*]] = phi i32 [ 1, [[TMP1:%.*]] ], [ [[TMP8:%.*]], [[TMP5]] ]<br>
+; CHECK-NEXT:    ret i32 [[TMP4]]<br>
+; CHECK:       5:<br>
+; CHECK-NEXT:    [[TMP6:%.*]] = phi i32 [ [[TMP9:%.*]], [[TMP5]] ], [ 1, [[TMP1]] ]<br>
+; CHECK-NEXT:    [[TMP7:%.*]] = phi i32 [ [[TMP8]], [[TMP5]] ], [ 1, [[TMP1]] ]<br>
+; CHECK-NEXT:    [[TMP8]] = mul nsw i32 [[TMP6]], [[TMP7]]<br>
+; CHECK-NEXT:    [[TMP9]] = add nuw nsw i32 [[TMP6]], 1<br>
+; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP6]], [[TMP0]]<br>
+; CHECK-NEXT:    br i1 [[TMP10]], label [[TMP3]], label [[TMP5]]<br>
+; CHECK:       unreachable_label:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   %2 = icmp slt i32 %0, 1<br>
   br i1 %2, label %3, label %5<br>
<br>
@@ -458,10 +657,15 @@ unreachable_label:<br>
<br>
 ;15.2<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline noreturn nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @unreachable_exit_negative1()<br>
+; CHECK: Function Attrs: noinline noreturn nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @unreachable_exit_negative1() #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@unreachable_exit_negative1()<br>
+; CHECK-NEXT:    tail call void @exit(i32 0)<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       unreachable_label:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call void @exit(i32 0)<br>
   ret void<br>
<br>
@@ -470,12 +674,19 @@ unreachable_label:<br>
   unreachable<br>
 }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @unreachable_exit_negative2()<br>
+; CHECK_MODULE: Function Attrs: nofree noinline noreturn nosync nounwind readnone uwtable<br>
+; CHECK_CGSCC: Function Attrs: nofree noinline norecurse noreturn nosync nounwind readnone uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @unreachable_exit_negative2() #0 {<br>
-<br>
+; CHECK-LABEL: define {{[^@]+}}@unreachable_exit_negative2()<br>
+; CHECK-NEXT:    br label [[L1:%.*]]<br>
+; CHECK:       L1:<br>
+; CHECK-NEXT:    br label [[L2:%.*]]<br>
+; CHECK:       L2:<br>
+; CHECK-NEXT:    br label [[L1]]<br>
+; CHECK:       unreachable_label:<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   br label %L1<br>
 L1:<br>
   br label %L2<br>
@@ -487,20 +698,24 @@ unreachable_label:<br>
   unreachable<br>
 }<br>
<br>
-; ATTRIBUTOR: Function Attrs: noreturn nounwind<br>
-; ATTRIBUTOR-NEXT: declare void @llvm.eh.sjlj.longjmp(i8*)<br>
+; CHECK: Function Attrs: noreturn nounwind<br>
+; CHECK-NEXT: declare void @llvm.eh.sjlj.longjmp(i8*)<br>
 declare void @llvm.eh.sjlj.longjmp(i8*)<br>
<br>
-; ATTRIBUTOR: Function Attrs: noinline noreturn nounwind uwtable<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @call_longjmp(i8* nocapture readnone %0) local_unnamed_addr<br>
+; CHECK: Function Attrs: noinline noreturn nounwind uwtable<br>
+; CHECK-NOT: willreturn<br>
 define void @call_longjmp(i8* nocapture readnone %0) local_unnamed_addr #0 {<br>
+; CHECK-LABEL: define {{[^@]+}}@call_longjmp<br>
+; CHECK-SAME: (i8* nocapture readnone [[TMP0:%.*]]) local_unnamed_addr<br>
+; CHECK-NEXT:    tail call void @llvm.eh.sjlj.longjmp(i8* noalias readnone [[TMP0]])<br>
+; CHECK-NEXT:    unreachable<br>
+;<br>
   tail call void @llvm.eh.sjlj.longjmp(i8* %0)<br>
   ret void<br>
 }<br>
<br>
<br>
-; TEST 16 (negative case) <br>
+; TEST 16 (negative case)<br>
 ; int infinite_loop_inside_bounded_loop(int n) {<br>
 ;   int ans = 0;<br>
 ;   for (int i = 0; i < n; i++) {<br>
@@ -510,11 +725,30 @@ define void @call_longjmp(i8* nocapture readnone %0) local_unnamed_addr #0 {<br>
 ;   return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @infinite_loop_inside_bounded_loop(i32 %n)<br>
+; CHECK_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
+; CHECK_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
+; CHECK-NOT: willreturn<br>
 define i32 @infinite_loop_inside_bounded_loop(i32 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@infinite_loop_inside_bounded_loop<br>
+; CHECK-SAME: (i32 [[N:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]<br>
+; CHECK:       for.cond:<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[N]], 0<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    br label [[FOR_END:%.*]]<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    br label [[WHILE_COND:%.*]]<br>
+; CHECK:       while.cond:<br>
+; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_COND]]<br>
+; CHECK:       for.inc:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       for.end:<br>
+; CHECK-NEXT:    ret i32 0<br>
+;<br>
 entry:<br>
   br label %for.cond<br>
<br>
@@ -554,10 +788,37 @@ for.end:                                          ; preds = %for.cond.cleanup<br>
 ;   return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs:  nofree nosync nounwind readnone willreturn<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @bounded_nested_loops(i32 %n)<br>
+; CHECK_MODULE: Function Attrs:  nofree nosync nounwind readnone willreturn<br>
+; CHECK_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone willreturn<br>
 define i32 @bounded_nested_loops(i32 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@bounded_nested_loops<br>
+; CHECK-SAME: (i32 [[N:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]<br>
+; CHECK:       for.cond:<br>
+; CHECK-NEXT:    [[I_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC1:%.*]], [[FOR_INC:%.*]] ]<br>
+; CHECK-NEXT:    [[ANS_0:%.*]] = phi i32 [ 0, [[ENTRY]] ], [ [[TMP:%.*]], [[FOR_INC]] ]<br>
+; CHECK-NEXT:    [[N_ADDR_0:%.*]] = phi i32 [ [[N]], [[ENTRY]] ], [ -1, [[FOR_INC]] ]<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i32 [[I_0]], [[N_ADDR_0]]<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_COND_CLEANUP:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    [[ANS_0_LCSSA:%.*]] = phi i32 [ [[ANS_0]], [[FOR_COND]] ]<br>
+; CHECK-NEXT:    br label [[FOR_END:%.*]]<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    br label [[WHILE_COND:%.*]]<br>
+; CHECK:       while.cond:<br>
+; CHECK-NEXT:    br i1 true, label [[WHILE_END:%.*]], label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       while.end:<br>
+; CHECK-NEXT:    [[TMP]] = add i32 [[N_ADDR_0]], [[ANS_0]]<br>
+; CHECK-NEXT:    br label [[FOR_INC]]<br>
+; CHECK:       for.inc:<br>
+; CHECK-NEXT:    [[INC1]] = add nuw nsw i32 [[I_0]], 1<br>
+; CHECK-NEXT:    br label [[FOR_COND]]<br>
+; CHECK:       for.end:<br>
+; CHECK-NEXT:    ret i32 [[ANS_0_LCSSA]]<br>
+;<br>
 entry:<br>
   br label %for.cond<br>
<br>
@@ -605,11 +866,40 @@ for.end:                                          ; preds = %for.cond.cleanup<br>
 ;   return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @bounded_loop_inside_unbounded_loop(i32 %n)<br>
+; CHECK_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
+; CHECK_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
+; CHECK-NOT: willreturn<br>
 define i32 @bounded_loop_inside_unbounded_loop(i32 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@bounded_loop_inside_unbounded_loop<br>
+; CHECK-SAME: (i32 [[N:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_COND:%.*]]<br>
+; CHECK:       while.cond:<br>
+; CHECK-NEXT:    [[ANS_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP2:%.*]], [[FOR_END:%.*]] ]<br>
+; CHECK-NEXT:    [[N_ADDR_0:%.*]] = phi i32 [ [[N]], [[ENTRY]] ], [ [[INC:%.*]], [[FOR_END]] ]<br>
+; CHECK-NEXT:    [[TMP:%.*]] = icmp sgt i32 [[N_ADDR_0]], -1<br>
+; CHECK-NEXT:    [[SMAX:%.*]] = select i1 [[TMP]], i32 [[N_ADDR_0]], i32 -1<br>
+; CHECK-NEXT:    [[INC]] = add nsw i32 [[N_ADDR_0]], 1<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[N_ADDR_0]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[WHILE_END:%.*]], label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    [[TMP1:%.*]] = add i32 [[ANS_0]], 1<br>
+; CHECK-NEXT:    br label [[FOR_COND:%.*]]<br>
+; CHECK:       for.cond:<br>
+; CHECK-NEXT:    br i1 true, label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY:%.*]]<br>
+; CHECK:       for.cond.cleanup:<br>
+; CHECK-NEXT:    [[TMP2]] = add i32 [[TMP1]], [[SMAX]]<br>
+; CHECK-NEXT:    br label [[FOR_END]]<br>
+; CHECK:       for.body:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       for.inc:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       for.end:<br>
+; CHECK-NEXT:    br label [[WHILE_COND]]<br>
+; CHECK:       while.end:<br>
+; CHECK-NEXT:    [[ANS_0_LCSSA:%.*]] = phi i32 [ [[ANS_0]], [[WHILE_COND]] ]<br>
+; CHECK-NEXT:    ret i32 [[ANS_0_LCSSA]]<br>
+;<br>
 entry:<br>
   br label %while.cond<br>
<br>
@@ -662,11 +952,39 @@ while.end:                                        ; preds = %while.cond<br>
 ;   return ans;<br>
 ; }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define i32 @nested_unbounded_loops(i32 %n)<br>
+; CHECK_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
+; CHECK_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
+; CHECK-NOT: willreturn<br>
 define i32 @nested_unbounded_loops(i32 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@nested_unbounded_loops<br>
+; CHECK-SAME: (i32 [[N:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    br label [[WHILE_COND:%.*]]<br>
+; CHECK:       while.cond:<br>
+; CHECK-NEXT:    [[ANS_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[TMP1:%.*]], [[WHILE_END10:%.*]] ]<br>
+; CHECK-NEXT:    [[N_ADDR_0:%.*]] = phi i32 [ [[N]], [[ENTRY]] ], [ -1, [[WHILE_END10]] ]<br>
+; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 [[N_ADDR_0]], 0<br>
+; CHECK-NEXT:    br i1 [[TOBOOL]], label [[WHILE_END11:%.*]], label [[WHILE_BODY:%.*]]<br>
+; CHECK:       while.body:<br>
+; CHECK-NEXT:    br label [[WHILE_COND1:%.*]]<br>
+; CHECK:       while.cond1:<br>
+; CHECK-NEXT:    br i1 true, label [[WHILE_END:%.*]], label [[WHILE_BODY4:%.*]]<br>
+; CHECK:       while.body4:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       while.end:<br>
+; CHECK-NEXT:    [[TMP:%.*]] = add i32 [[N_ADDR_0]], -2<br>
+; CHECK-NEXT:    br label [[WHILE_COND5:%.*]]<br>
+; CHECK:       while.cond5:<br>
+; CHECK-NEXT:    br i1 true, label [[WHILE_END10]], label [[WHILE_BODY8:%.*]]<br>
+; CHECK:       while.body8:<br>
+; CHECK-NEXT:    unreachable<br>
+; CHECK:       while.end10:<br>
+; CHECK-NEXT:    [[TMP1]] = add i32 [[TMP]], [[ANS_0]]<br>
+; CHECK-NEXT:    br label [[WHILE_COND]]<br>
+; CHECK:       while.end11:<br>
+; CHECK-NEXT:    [[ANS_0_LCSSA:%.*]] = phi i32 [ [[ANS_0]], [[WHILE_COND]] ]<br>
+; CHECK-NEXT:    ret i32 [[ANS_0_LCSSA]]<br>
+;<br>
 entry:<br>
   br label %while.cond<br>
<br>
@@ -726,11 +1044,39 @@ while.end11:                                      ; preds = %while.cond<br>
 ;      return;<br>
 ;    }<br>
<br>
-; ATTRIBUTOR_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
-; ATTRIBUTOR_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
-; ATTRIBUTOR-NOT: willreturn<br>
-; ATTRIBUTOR-NEXT: define void @non_loop_cycle(i32 %n)<br>
+; CHECK_MODULE: Function Attrs:  nofree nosync nounwind readnone<br>
+; CHECK_CGSCC: Function Attrs: nofree norecurse nosync nounwind readnone<br>
+; CHECK-NOT: willreturn<br>
 define void @non_loop_cycle(i32 %n) {<br>
+; CHECK-LABEL: define {{[^@]+}}@non_loop_cycle<br>
+; CHECK-SAME: (i32 [[N:%.*]])<br>
+; CHECK-NEXT:  entry:<br>
+; CHECK-NEXT:    [[CALL:%.*]] = call i32 @fact_loop(i32 [[N]])<br>
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[CALL]], 5<br>
+; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]<br>
+; CHECK:       if.then:<br>
+; CHECK-NEXT:    br label [[ENTRY1:%.*]]<br>
+; CHECK:       if.else:<br>
+; CHECK-NEXT:    br label [[ENTRY2:%.*]]<br>
+; CHECK:       entry1:<br>
+; CHECK-NEXT:    [[CALL1:%.*]] = call i32 @fact_loop(i32 [[N]])<br>
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i32 [[CALL1]], 5<br>
+; CHECK-NEXT:    br i1 [[CMP2]], label [[IF_THEN3:%.*]], label [[IF_ELSE4:%.*]]<br>
+; CHECK:       if.then3:<br>
+; CHECK-NEXT:    br label [[EXIT:%.*]]<br>
+; CHECK:       if.else4:<br>
+; CHECK-NEXT:    br label [[ENTRY2]]<br>
+; CHECK:       entry2:<br>
+; CHECK-NEXT:    [[CALL5:%.*]] = call i32 @fact_loop(i32 [[N]])<br>
+; CHECK-NEXT:    [[CMP6:%.*]] = icmp sgt i32 [[CALL5]], 5<br>
+; CHECK-NEXT:    br i1 [[CMP6]], label [[IF_THEN7:%.*]], label [[IF_ELSE8:%.*]]<br>
+; CHECK:       if.then7:<br>
+; CHECK-NEXT:    br label [[EXIT]]<br>
+; CHECK:       if.else8:<br>
+; CHECK-NEXT:    br label [[ENTRY1]]<br>
+; CHECK:       exit:<br>
+; CHECK-NEXT:    ret void<br>
+;<br>
 entry:<br>
   %call = call i32 @fact_loop(i32 %n)<br>
   %cmp = icmp sgt i32 %call, 5<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>