[llvm] [NFC] Regenerate LoopFusion tests using UTC (PR #146902)

Madhur Amilkanthwar via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 3 07:23:32 PDT 2025


https://github.com/madhur13490 created https://github.com/llvm/llvm-project/pull/146902

None

>From 078012f8265eed03f31258e179293b9d42c8d6f4 Mon Sep 17 00:00:00 2001
From: Madhur Amilkanthwar <madhura at nvidia.com>
Date: Wed, 2 Jul 2025 09:15:35 -0700
Subject: [PATCH] [NFC] Regenerate LoopFusion tests using UTC

---
 .../test/Transforms/LoopFusion/cannot_fuse.ll |  43 +-----
 .../LoopFusion/diagnostics_analysis.ll        |   3 +
 .../LoopFusion/diagnostics_missed.ll          |   3 +
 .../double_loop_nest_inner_guard.ll           |  66 ++++++---
 llvm/test/Transforms/LoopFusion/four_loops.ll |  85 +++++++++--
 .../Transforms/LoopFusion/guarded_peel.ll     |  93 ++++++++----
 .../LoopFusion/guarded_unsafeblock_peel.ll    |  55 +++++---
 llvm/test/Transforms/LoopFusion/hoist_load.ll |  20 +--
 .../Transforms/LoopFusion/hoist_preheader.ll  |  25 +++-
 .../test/Transforms/LoopFusion/hoist_store.ll |  20 +--
 .../test/Transforms/LoopFusion/inner_loops.ll |  72 +++++++---
 llvm/test/Transforms/LoopFusion/loop_nest.ll  |  68 ++++++---
 .../Transforms/LoopFusion/no_sink_hoist.ll    |  33 +++--
 .../LoopFusion/no_sink_hoist_atomic.ll        |  32 +++--
 .../LoopFusion/no_sink_hoist_inner_barrier.ll |  41 +++---
 .../LoopFusion/no_sink_hoist_load.ll          |  35 +++--
 .../LoopFusion/no_sink_hoist_store.ll         |  35 +++--
 .../no_sink_hoist_unknown_function.ll         |  30 ++--
 .../LoopFusion/no_sink_hoist_volatile.ll      |  32 +++--
 .../Transforms/LoopFusion/nonadjacent_peel.ll |  67 ++++++---
 llvm/test/Transforms/LoopFusion/peel.ll       | 132 +++++++++++++-----
 .../Transforms/LoopFusion/sink_preheader.ll   |  20 +--
 llvm/test/Transforms/LoopFusion/sink_store.ll |  20 +--
 .../triple_loop_nest_inner_guard.ll           |  90 ++++++++----
 24 files changed, 770 insertions(+), 350 deletions(-)

diff --git a/llvm/test/Transforms/LoopFusion/cannot_fuse.ll b/llvm/test/Transforms/LoopFusion/cannot_fuse.ll
index 6819ec377ab17..9685eaca71451 100644
--- a/llvm/test/Transforms/LoopFusion/cannot_fuse.ll
+++ b/llvm/test/Transforms/LoopFusion/cannot_fuse.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion -disable-output < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 
@@ -82,14 +83,6 @@ bb33:                                             ; preds = %bb33.loopexit, %bb1
 ; CHECK: Performing Loop Fusion on function non_adjacent
 ; CHECK: Fusion Candidates:
 ; CHECK: *** Fusion Candidate Set ***
-; CHECK-NEXT: [[LOOP1PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: [[LOOP2PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: ****************************
-; CHECK: Attempting fusion on Candidate Set:
-; CHECK-NEXT: [[LOOP1PREHEADER]]
-; CHECK-NEXT: [[LOOP2PREHEADER]]
-; CHECK: Fusion candidates are not adjacent. Not fusing.
-; CHECK: Loop Fusion complete
 define void @non_adjacent(ptr noalias %arg) {
 bb:
   br label %bb5
@@ -144,14 +137,6 @@ bb25:                                             ; preds = %bb15
 ; CHECK: Performing Loop Fusion on function different_bounds
 ; CHECK: Fusion Candidates:
 ; CHECK: *** Fusion Candidate Set ***
-; CHECK-NEXT: [[LOOP1PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: [[LOOP2PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: ****************************
-; CHECK: Attempting fusion on Candidate Set:
-; CHECK-NEXT: [[LOOP1PREHEADER]]
-; CHECK-NEXT: [[LOOP2PREHEADER]]
-; CHECK: Fusion candidates do not have identical trip counts. Not fusing.
-; CHECK: Loop Fusion complete
 define void @different_bounds(ptr noalias %arg) {
 bb:
   br label %bb5
@@ -207,14 +192,6 @@ bb25:                                             ; preds = %bb15
 ; CHECK: Performing Loop Fusion on function negative_dependence
 ; CHECK: Fusion Candidates:
 ; CHECK: *** Fusion Candidate Set ***
-; CHECK-NEXT: [[LOOP1PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: [[LOOP2PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: ****************************
-; CHECK: Attempting fusion on Candidate Set:
-; CHECK-NEXT: [[LOOP1PREHEADER]]
-; CHECK-NEXT: [[LOOP2PREHEADER]]
-; CHECK: Memory dependencies do not allow fusion!
-; CHECK: Loop Fusion complete
 define void @negative_dependence(ptr noalias %arg) {
 bb:
   br label %bb7
@@ -261,14 +238,6 @@ bb19:                                             ; preds = %bb18
 ; CHECK: Performing Loop Fusion on function sumTest
 ; CHECK: Fusion Candidates:
 ; CHECK: *** Fusion Candidate Set ***
-; CHECK-NEXT: [[LOOP1PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: [[LOOP2PREHEADER:bb[0-9]*]]
-; CHECK-NEXT: ****************************
-; CHECK: Attempting fusion on Candidate Set:
-; CHECK-NEXT: [[LOOP1PREHEADER]]
-; CHECK-NEXT: [[LOOP2PREHEADER]]
-; CHECK: Memory dependencies do not allow fusion!
-; CHECK: Loop Fusion complete
 define i32 @sumTest(ptr noalias %arg) {
 bb:
   br label %bb9
@@ -315,14 +284,6 @@ bb21:                                             ; preds = %bb14
 ; CHECK: Performing Loop Fusion on function test
 ; CHECK: Fusion Candidates:
 ; CHECK: *** Fusion Candidate Set ***
-; CHECK-NEXT: [[LOOP1PREHEADER:for.body[0-9]*.preheader]]
-; CHECK-NEXT: [[LOOP2PREHEADER:for.body[0-9]*.preheader]]
-; CHECK-NEXT: ****************************
-; CHECK: Attempting fusion on Candidate Set:
-; CHECK-NEXT: [[LOOP1PREHEADER]]
-; CHECK-NEXT: [[LOOP2PREHEADER]]
-; CHECK: Memory dependencies do not allow fusion!
-; CHECK: Loop Fusion complete
 define float @test(ptr nocapture %a, i32 %n) {
 entry:
   %conv = zext i32 %n to i64
@@ -414,3 +375,5 @@ bb27:                                             ; preds = %bb19
 bb29:                                             ; preds = %bb18
   ret void
 }
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
diff --git a/llvm/test/Transforms/LoopFusion/diagnostics_analysis.ll b/llvm/test/Transforms/LoopFusion/diagnostics_analysis.ll
index 92ca2c10ab0c8..0cf72b32adab7 100644
--- a/llvm/test/Transforms/LoopFusion/diagnostics_analysis.ll
+++ b/llvm/test/Transforms/LoopFusion/diagnostics_analysis.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -pass-remarks-analysis=loop-fusion -disable-output < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 
@@ -125,3 +126,5 @@ for.end14:                                        ; preds = %for.cond.cleanup4
 !67 = distinct !{!67, !58, !68}
 !68 = !DILocation(line: 12, column: 3, scope: !26)
 !69 = !DILocation(line: 13, column: 1, scope: !15)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
diff --git a/llvm/test/Transforms/LoopFusion/diagnostics_missed.ll b/llvm/test/Transforms/LoopFusion/diagnostics_missed.ll
index f30a070153742..ad649c9442319 100644
--- a/llvm/test/Transforms/LoopFusion/diagnostics_missed.ll
+++ b/llvm/test/Transforms/LoopFusion/diagnostics_missed.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -pass-remarks-missed=loop-fusion -disable-output < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 
@@ -395,3 +396,5 @@ attributes #0 = { nounwind readnone speculatable willreturn }
 !84 = distinct !DISubprogram(name: "unsafe_guardblock", scope: !3, file: !3, line: 70, type: !15, scopeLine: 60, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !78)
 !85 = distinct !DILexicalBlock(scope: !84, file: !3, line: 3, column: 5)
 !86 = !DILocation(line: 72, column: 3, scope: !85)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; CHECK: {{.*}}
diff --git a/llvm/test/Transforms/LoopFusion/double_loop_nest_inner_guard.ll b/llvm/test/Transforms/LoopFusion/double_loop_nest_inner_guard.ll
index f6eab83b5d154..658e60f5c0032 100644
--- a/llvm/test/Transforms/LoopFusion/double_loop_nest_inner_guard.ll
+++ b/llvm/test/Transforms/LoopFusion/double_loop_nest_inner_guard.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
 
 ; Verify that LoopFusion can fuse two double-loop nests with guarded inner
@@ -7,19 +8,10 @@
 @b = common global [10 x [10 x i32]] zeroinitializer
 @c = common global [10 x [10 x i32]] zeroinitializer
 
-; CHECK-LABEL: @double_loop_nest_inner_guard
-; CHECK: br i1 %{{.*}}, label %[[OUTER_PH:outer1.ph]], label %[[FUNC_EXIT:func_exit]]
 
-; CHECK: [[OUTER_PH]]:
-; CHECK: br label %[[OUTER_BODY_INNER_GUARD:outer1.body.inner.guard]]
 
-; CHECK: [[OUTER_BODY_INNER_GUARD]]:
-; CHECK: br i1 %{{.*}}, label %[[INNER_PH:inner1.ph]], label %[[OUTER_LATCH:outer2.latch]]
 
-; CHECK: [[INNER_PH]]:
-; CHECK-NEXT: br label %[[INNER_BODY:inner1.body]]
 
-; CHECK: [[INNER_BODY]]:
 ; First loop body.
 ; CHECK: load
 ; CHECK: add
@@ -28,21 +20,59 @@
 ; CHECK: load
 ; CHECK: mul
 ; CHECK: store
-; CHECK: br i1 %{{.*}}, label %[[INNER_EXIT:inner2.exit]], label %[[INNER_BODY:inner1.body]]
 
-; CHECK: [[INNER_EXIT]]:
-; CHECK-NEXT: br label %[[OUTER_LATCH:outer2.latch]]
 
-; CHECK: [[OUTER_LATCH]]:
-; CHECK: br i1 %{{.*}}, label %[[OUTER_EXIT:outer2.exit]], label %[[OUTER_BODY_INNER_GUARD]]
 
-; CHECK: [[OUTER_EXIT]]:
-; CHECK-NEXT: br label %[[FUNC_EXIT:func_exit]]
 
-; CHECK: [[FUNC_EXIT]]:
-; CHECK-NEXT: ret
 
 define i32 @double_loop_nest_inner_guard(i32 %m, i32 %n, i32 %M, i32 %N) {
+; CHECK-LABEL: define i32 @double_loop_nest_inner_guard(
+; CHECK-SAME: i32 [[M:%.*]], i32 [[N:%.*]], i32 [[M:%.*]], i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[CMP63:%.*]] = icmp sgt i32 [[M]], 0
+; CHECK-NEXT:    br i1 [[CMP63]], label %[[OUTER1_PH:.*]], label %[[FUNC_EXIT:.*]]
+; CHECK:       [[OUTER1_PH]]:
+; CHECK-NEXT:    [[CMP261:%.*]] = icmp sgt i32 [[N]], 0
+; CHECK-NEXT:    [[WIDE_TRIP_COUNT76:%.*]] = zext i32 [[M]] to i64
+; CHECK-NEXT:    [[WIDE_TRIP_COUNT72:%.*]] = zext i32 [[N]] to i64
+; CHECK-NEXT:    br label %[[OUTER1_BODY_INNER_GUARD:.*]]
+; CHECK:       [[OUTER1_BODY_INNER_GUARD]]:
+; CHECK-NEXT:    [[IV74:%.*]] = phi i64 [ 0, %[[OUTER1_PH]] ], [ [[IV_NEXT75:%.*]], %[[OUTER2_LATCH:.*]] ]
+; CHECK-NEXT:    [[IV66:%.*]] = phi i64 [ [[IV_NEXT67:%.*]], %[[OUTER2_LATCH]] ], [ 0, %[[OUTER1_PH]] ]
+; CHECK-NEXT:    br i1 [[CMP261]], label %[[INNER1_PH:.*]], label %[[OUTER2_LATCH]]
+; CHECK:       [[INNER1_PH]]:
+; CHECK-NEXT:    br label %[[INNER1_BODY:.*]]
+; CHECK:       [[INNER1_BODY]]:
+; CHECK-NEXT:    [[IV70:%.*]] = phi i64 [ [[IV_NEXT71:%.*]], %[[INNER1_BODY]] ], [ 0, %[[INNER1_PH]] ]
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[INNER1_BODY]] ], [ 0, %[[INNER1_PH]] ]
+; CHECK-NEXT:    [[IDX6:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr @a, i64 0, i64 [[IV74]], i64 [[IV70]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[IDX6]], align 4
+; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], 2
+; CHECK-NEXT:    [[IDX10:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr @b, i64 0, i64 [[IV74]], i64 [[IV70]]
+; CHECK-NEXT:    store i32 [[ADD]], ptr [[IDX10]], align 4
+; CHECK-NEXT:    [[IV_NEXT71]] = add nuw nsw i64 [[IV70]], 1
+; CHECK-NEXT:    [[EXITCOND73:%.*]] = icmp eq i64 [[IV_NEXT71]], [[WIDE_TRIP_COUNT72]]
+; CHECK-NEXT:    [[IDX27:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr @a, i64 0, i64 [[IV66]], i64 [[IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[IDX27]], align 4
+; CHECK-NEXT:    [[MUL:%.*]] = shl nsw i32 [[TMP1]], 1
+; CHECK-NEXT:    [[IDX31:%.*]] = getelementptr inbounds [10 x [10 x i32]], ptr @c, i64 0, i64 [[IV66]], i64 [[IV]]
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[IDX31]], align 4
+; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[WIDE_TRIP_COUNT72]]
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[INNER2_EXIT:.*]], label %[[INNER1_BODY]]
+; CHECK:       [[INNER2_EXIT]]:
+; CHECK-NEXT:    br label %[[OUTER2_LATCH]]
+; CHECK:       [[OUTER2_LATCH]]:
+; CHECK-NEXT:    [[IV_NEXT75]] = add nuw nsw i64 [[IV74]], 1
+; CHECK-NEXT:    [[EXITCOND77:%.*]] = icmp eq i64 [[IV_NEXT75]], [[WIDE_TRIP_COUNT76]]
+; CHECK-NEXT:    [[IV_NEXT67]] = add nuw nsw i64 [[IV66]], 1
+; CHECK-NEXT:    [[EXITCOND69:%.*]] = icmp eq i64 [[IV_NEXT67]], [[WIDE_TRIP_COUNT76]]
+; CHECK-NEXT:    br i1 [[EXITCOND69]], label %[[OUTER2_EXIT:.*]], label %[[OUTER1_BODY_INNER_GUARD]]
+; CHECK:       [[OUTER2_EXIT]]:
+; CHECK-NEXT:    br label %[[FUNC_EXIT]]
+; CHECK:       [[FUNC_EXIT]]:
+; CHECK-NEXT:    ret i32 undef
+;
 entry:
   %cmp63 = icmp sgt i32 %m, 0
   br i1 %cmp63, label %outer1.ph, label %func_exit
diff --git a/llvm/test/Transforms/LoopFusion/four_loops.ll b/llvm/test/Transforms/LoopFusion/four_loops.ll
index 7f7f0f19b59ba..1728686ebc15c 100644
--- a/llvm/test/Transforms/LoopFusion/four_loops.ll
+++ b/llvm/test/Transforms/LoopFusion/four_loops.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
 
 @A = common global [1024 x i32] zeroinitializer, align 16
@@ -5,21 +6,77 @@
 @C = common global [1024 x i32] zeroinitializer, align 16
 @D = common global [1024 x i32] zeroinitializer, align 16
 
-; CHECK: void @dep_free
-; CHECK-NEXT: bb:
-; CHECK-NEXT: br label %[[LOOP1HEADER:bb[0-9]+]]
-; CHECK: [[LOOP1HEADER]]
-; CHECK: br label %[[LOOP2BODY:bb[0-9]+]]
-; CHECK: [[LOOP2BODY]]
-; CHECK: br label %[[LOOP3BODY:bb[0-9]+]]
-; CHECK: [[LOOP3BODY]]
-; CHECK: br label %[[LOOP4BODY:bb[0-9]+]]
-; CHECK: [[LOOP4BODY]]
-; CHECK: br label %[[LOOP1LATCH:bb[0-9]+]]
-; CHECK: [[LOOP1LATCH]]
-; CHECK: br i1 %{{.*}}, label %[[LOOP1HEADER]], label %[[LOOPEXIT:bb[0-9]+]]
-; CHECK: ret void
 define void @dep_free() {
+; CHECK-LABEL: define void @dep_free() {
+; CHECK-NEXT:  [[BB:.*]]:
+; CHECK-NEXT:    br label %[[BB15:.*]]
+; CHECK:       [[BB15]]:
+; CHECK-NEXT:    [[DOT08:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP23:%.*]], %[[BB61:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV107:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT11:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[DOT016:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP36:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[INDVARS_IV75:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT8:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[DOT024:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP49:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[INDVARS_IV43:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT5:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[DOT032:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP62:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[INDVARS_IV1:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[BB61]] ]
+; CHECK-NEXT:    [[TMP:%.*]] = add nsw i32 [[DOT08]], -3
+; CHECK-NEXT:    [[TMP16:%.*]] = add nuw nsw i64 [[INDVARS_IV107]], 3
+; CHECK-NEXT:    [[TMP17:%.*]] = trunc i64 [[TMP16]] to i32
+; CHECK-NEXT:    [[TMP18:%.*]] = mul nsw i32 [[TMP]], [[TMP17]]
+; CHECK-NEXT:    [[TMP19:%.*]] = trunc i64 [[INDVARS_IV107]] to i32
+; CHECK-NEXT:    [[TMP20:%.*]] = srem i32 [[TMP18]], [[TMP19]]
+; CHECK-NEXT:    [[TMP21:%.*]] = getelementptr inbounds [1024 x i32], ptr @A, i64 0, i64 [[INDVARS_IV107]]
+; CHECK-NEXT:    store i32 [[TMP20]], ptr [[TMP21]], align 4
+; CHECK-NEXT:    br label %[[BB22:.*]]
+; CHECK:       [[BB22]]:
+; CHECK-NEXT:    [[TMP28:%.*]] = add nsw i32 [[DOT016]], -3
+; CHECK-NEXT:    [[TMP29:%.*]] = add nuw nsw i64 [[INDVARS_IV75]], 3
+; CHECK-NEXT:    [[TMP30:%.*]] = trunc i64 [[TMP29]] to i32
+; CHECK-NEXT:    [[TMP31:%.*]] = mul nsw i32 [[TMP28]], [[TMP30]]
+; CHECK-NEXT:    [[TMP32:%.*]] = trunc i64 [[INDVARS_IV75]] to i32
+; CHECK-NEXT:    [[TMP33:%.*]] = srem i32 [[TMP31]], [[TMP32]]
+; CHECK-NEXT:    [[TMP34:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[INDVARS_IV75]]
+; CHECK-NEXT:    store i32 [[TMP33]], ptr [[TMP34]], align 4
+; CHECK-NEXT:    br label %[[BB35:.*]]
+; CHECK:       [[BB35]]:
+; CHECK-NEXT:    [[TMP41:%.*]] = add nsw i32 [[DOT024]], -3
+; CHECK-NEXT:    [[TMP42:%.*]] = add nuw nsw i64 [[INDVARS_IV43]], 3
+; CHECK-NEXT:    [[TMP43:%.*]] = trunc i64 [[TMP42]] to i32
+; CHECK-NEXT:    [[TMP44:%.*]] = mul nsw i32 [[TMP41]], [[TMP43]]
+; CHECK-NEXT:    [[TMP45:%.*]] = trunc i64 [[INDVARS_IV43]] to i32
+; CHECK-NEXT:    [[TMP46:%.*]] = srem i32 [[TMP44]], [[TMP45]]
+; CHECK-NEXT:    [[TMP47:%.*]] = getelementptr inbounds [1024 x i32], ptr @C, i64 0, i64 [[INDVARS_IV43]]
+; CHECK-NEXT:    store i32 [[TMP46]], ptr [[TMP47]], align 4
+; CHECK-NEXT:    br label %[[BB48:.*]]
+; CHECK:       [[BB48]]:
+; CHECK-NEXT:    [[TMP54:%.*]] = add nsw i32 [[DOT032]], -3
+; CHECK-NEXT:    [[TMP55:%.*]] = add nuw nsw i64 [[INDVARS_IV1]], 3
+; CHECK-NEXT:    [[TMP56:%.*]] = trunc i64 [[TMP55]] to i32
+; CHECK-NEXT:    [[TMP57:%.*]] = mul nsw i32 [[TMP54]], [[TMP56]]
+; CHECK-NEXT:    [[TMP58:%.*]] = trunc i64 [[INDVARS_IV1]] to i32
+; CHECK-NEXT:    [[TMP59:%.*]] = srem i32 [[TMP57]], [[TMP58]]
+; CHECK-NEXT:    [[TMP60:%.*]] = getelementptr inbounds [1024 x i32], ptr @D, i64 0, i64 [[INDVARS_IV1]]
+; CHECK-NEXT:    store i32 [[TMP59]], ptr [[TMP60]], align 4
+; CHECK-NEXT:    br label %[[BB61]]
+; CHECK:       [[BB52:.*]]:
+; CHECK-NEXT:    br label %[[BB63:.*]]
+; CHECK:       [[BB61]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT11]] = add nuw nsw i64 [[INDVARS_IV107]], 1
+; CHECK-NEXT:    [[TMP23]] = add nuw nsw i32 [[DOT08]], 1
+; CHECK-NEXT:    [[EXITCOND12:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT11]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT8]] = add nuw nsw i64 [[INDVARS_IV75]], 1
+; CHECK-NEXT:    [[TMP36]] = add nuw nsw i32 [[DOT016]], 1
+; CHECK-NEXT:    [[EXITCOND9:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT8]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT5]] = add nuw nsw i64 [[INDVARS_IV43]], 1
+; CHECK-NEXT:    [[TMP49]] = add nuw nsw i32 [[DOT024]], 1
+; CHECK-NEXT:    [[EXITCOND6:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT5]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV1]], 1
+; CHECK-NEXT:    [[TMP62]] = add nuw nsw i32 [[DOT032]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[BB15]], label %[[BB52]]
+; CHECK:       [[BB63]]:
+; CHECK-NEXT:    ret void
+;
 bb:
   br label %bb15
 
diff --git a/llvm/test/Transforms/LoopFusion/guarded_peel.ll b/llvm/test/Transforms/LoopFusion/guarded_peel.ll
index c45772b0b0293..c26935908d4d6 100644
--- a/llvm/test/Transforms/LoopFusion/guarded_peel.ll
+++ b/llvm/test/Transforms/LoopFusion/guarded_peel.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
 
 ; Tests if we are able to fuse two guarded loops which have constant but
@@ -6,33 +7,75 @@
 
 @B = common global [1024 x i32] zeroinitializer, align 16
 
-; CHECK-LABEL: void @main(ptr noalias %A)
-; CHECK-NEXT:  entry:
-; CHECK:         br i1 %cmp4, label %for.first.entry, label %for.end
-; CHECK:       for.first.entry
-; CHECK-NEXT:    br label %for.first.peel.begin
-; CHECK:       for.first.peel.begin:
-; CHECK-NEXT:    br label %for.first.peel
-; CHECK:       for.first.peel:
-; CHECK:         br label %for.first.peel.next
-; CHECK:       for.first.peel.next:
-; CHECK-NEXT:    br label %for.first.peel2
-; CHECK:       for.first.peel2:
-; CHECK:         br label %for.first.peel.next1
-; CHECK:       for.first.peel.next1:
-; CHECK-NEXT:    br label %for.first.peel.next11
-; CHECK:       for.first.peel.next11:
-; CHECK-NEXT:    br label %for.first.entry.peel.newph
-; CHECK:       for.first.entry.peel.newph:
-; CHECK:         br label %for.first
-; CHECK:       for.first:
-; CHECK:         br i1 %cmp3, label %for.first, label %for.second.exit
-; CHECK:       for.second.exit:
-; CHECK:         br label %for.end
-; CHECK:       for.end:
-; CHECK-NEXT:    ret void
 
 define void @main(ptr noalias %A) {
+; CHECK-LABEL: define void @main(
+; CHECK-SAME: ptr noalias [[A:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[CMP4:%.*]] = icmp slt i64 0, 45
+; CHECK-NEXT:    [[CMP31:%.*]] = icmp slt i64 2, 45
+; CHECK-NEXT:    br i1 [[CMP4]], label %[[FOR_FIRST_ENTRY:.*]], label %[[FOR_END:.*]]
+; CHECK:       [[FOR_FIRST_ENTRY]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_BEGIN:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_BEGIN]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL:.*]]
+; CHECK:       [[FOR_FIRST_PEEL]]:
+; CHECK-NEXT:    [[SUB_PEEL:%.*]] = sub nsw i64 0, 3
+; CHECK-NEXT:    [[ADD_PEEL:%.*]] = add nsw i64 0, 3
+; CHECK-NEXT:    [[MUL_PEEL:%.*]] = mul nsw i64 [[SUB_PEEL]], [[ADD_PEEL]]
+; CHECK-NEXT:    [[REM_PEEL:%.*]] = srem i64 [[MUL_PEEL]], 0
+; CHECK-NEXT:    [[CONV_PEEL:%.*]] = trunc i64 [[REM_PEEL]] to i32
+; CHECK-NEXT:    [[ARRAYIDX_PEEL:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 0
+; CHECK-NEXT:    store i32 [[CONV_PEEL]], ptr [[ARRAYIDX_PEEL]], align 4
+; CHECK-NEXT:    [[INC_PEEL:%.*]] = add nsw i64 0, 1
+; CHECK-NEXT:    [[CMP_PEEL:%.*]] = icmp slt i64 [[INC_PEEL]], 45
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL2:.*]]
+; CHECK:       [[FOR_FIRST_PEEL2]]:
+; CHECK-NEXT:    [[SUB_PEEL3:%.*]] = sub nsw i64 [[INC_PEEL]], 3
+; CHECK-NEXT:    [[ADD_PEEL4:%.*]] = add nsw i64 [[INC_PEEL]], 3
+; CHECK-NEXT:    [[MUL_PEEL5:%.*]] = mul nsw i64 [[SUB_PEEL3]], [[ADD_PEEL4]]
+; CHECK-NEXT:    [[REM_PEEL6:%.*]] = srem i64 [[MUL_PEEL5]], [[INC_PEEL]]
+; CHECK-NEXT:    [[CONV_PEEL7:%.*]] = trunc i64 [[REM_PEEL6]] to i32
+; CHECK-NEXT:    [[ARRAYIDX_PEEL8:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[INC_PEEL]]
+; CHECK-NEXT:    store i32 [[CONV_PEEL7]], ptr [[ARRAYIDX_PEEL8]], align 4
+; CHECK-NEXT:    [[INC_PEEL9:%.*]] = add nsw i64 [[INC_PEEL]], 1
+; CHECK-NEXT:    [[CMP_PEEL10:%.*]] = icmp slt i64 [[INC_PEEL9]], 45
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT1:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT1]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT11:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT11]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_ENTRY_PEEL_NEWPH:.*]]
+; CHECK:       [[FOR_FIRST_ENTRY_PEEL_NEWPH]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST:.*]]
+; CHECK:       [[FOR_FIRST]]:
+; CHECK-NEXT:    [[I_05:%.*]] = phi i64 [ [[INC:%.*]], %[[FOR_FIRST]] ], [ [[INC_PEEL9]], %[[FOR_FIRST_ENTRY_PEEL_NEWPH]] ]
+; CHECK-NEXT:    [[I1_02:%.*]] = phi i64 [ [[INC14:%.*]], %[[FOR_FIRST]] ], [ 2, %[[FOR_FIRST_ENTRY_PEEL_NEWPH]] ]
+; CHECK-NEXT:    [[SUB:%.*]] = sub nsw i64 [[I_05]], 3
+; CHECK-NEXT:    [[ADD:%.*]] = add nsw i64 [[I_05]], 3
+; CHECK-NEXT:    [[MUL:%.*]] = mul nsw i64 [[SUB]], [[ADD]]
+; CHECK-NEXT:    [[REM:%.*]] = srem i64 [[MUL]], [[I_05]]
+; CHECK-NEXT:    [[CONV:%.*]] = trunc i64 [[REM]] to i32
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[I_05]]
+; CHECK-NEXT:    store i32 [[CONV]], ptr [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[INC]] = add nsw i64 [[I_05]], 1
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[INC]], 45
+; CHECK-NEXT:    [[SUB7:%.*]] = sub nsw i64 [[I1_02]], 3
+; CHECK-NEXT:    [[ADD8:%.*]] = add nsw i64 [[I1_02]], 3
+; CHECK-NEXT:    [[MUL9:%.*]] = mul nsw i64 [[SUB7]], [[ADD8]]
+; CHECK-NEXT:    [[REM10:%.*]] = srem i64 [[MUL9]], [[I1_02]]
+; CHECK-NEXT:    [[CONV11:%.*]] = trunc i64 [[REM10]] to i32
+; CHECK-NEXT:    [[ARRAYIDX12:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[I1_02]]
+; CHECK-NEXT:    store i32 [[CONV11]], ptr [[ARRAYIDX12]], align 4
+; CHECK-NEXT:    [[INC14]] = add nsw i64 [[I1_02]], 1
+; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i64 [[INC14]], 45
+; CHECK-NEXT:    br i1 [[CMP3]], label %[[FOR_FIRST]], label %[[FOR_SECOND_EXIT:.*]]
+; CHECK:       [[FOR_SECOND_EXIT]]:
+; CHECK-NEXT:    br label %[[FOR_END]]
+; CHECK:       [[FOR_END]]:
+; CHECK-NEXT:    ret void
+;
 entry:
   %cmp4 = icmp slt i64 0, 45
   br i1 %cmp4, label %for.first.entry, label %for.second.guard
diff --git a/llvm/test/Transforms/LoopFusion/guarded_unsafeblock_peel.ll b/llvm/test/Transforms/LoopFusion/guarded_unsafeblock_peel.ll
index 1ab9e538a3dcb..add32738bc5a7 100644
--- a/llvm/test/Transforms/LoopFusion/guarded_unsafeblock_peel.ll
+++ b/llvm/test/Transforms/LoopFusion/guarded_unsafeblock_peel.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
 
 ; Tests that we do not fuse two guarded loops together.
@@ -6,28 +7,42 @@
 ; loops unsafe to fuse together.
 ; The expected output of this test is the function as below.
 
-; CHECK-LABEL: void @unsafe_exitblock(ptr noalias %A, ptr noalias %B)
-; CHECK:       for.first.guard
-; CHECK:         br i1 %cmp3, label %for.first.preheader, label %for.second.guard
-; CHECK:       for.first.preheader:
-; CHECK-NEXT:    br label %for.first
-; CHECK:       for.first:
-; CHECK:         br i1 %cmp, label %for.first, label %for.first.exit
-; CHECK:       for.first.exit:
-; CHECK-NEXT:    call void @bar()
-; CHECK-NEXT:    br label %for.second.guard
-; CHECK:       for.second.guard:
-; CHECK:         br i1 %cmp21, label %for.second.preheader, label %for.end
-; CHECK:       for.second.preheader:
-; CHECK-NEXT:    br label %for.second
-; CHECK:       for.second:
-; CHECK:         br i1 %cmp2, label %for.second, label %for.second.exit
-; CHECK:       for.second.exit:
-; CHECK-NEXT:    br label %for.end
-; CHECK:       for.end:
-; CHECK-NEXT:    ret void
 
 define void @unsafe_exitblock(ptr noalias %A, ptr noalias %B) {
+; CHECK-LABEL: define void @unsafe_exitblock(
+; CHECK-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {
+; CHECK-NEXT:  [[FOR_FIRST_GUARD:.*:]]
+; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i64 0, 45
+; CHECK-NEXT:    br i1 [[CMP3]], label %[[FOR_FIRST_PREHEADER:.*]], label %[[FOR_SECOND_GUARD:.*]]
+; CHECK:       [[FOR_FIRST_PREHEADER]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST:.*]]
+; CHECK:       [[FOR_FIRST]]:
+; CHECK-NEXT:    [[I_04:%.*]] = phi i64 [ [[INC:%.*]], %[[FOR_FIRST]] ], [ 0, %[[FOR_FIRST_PREHEADER]] ]
+; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[I_04]]
+; CHECK-NEXT:    store i32 0, ptr [[ARRAYIDX]], align 4
+; CHECK-NEXT:    [[INC]] = add nsw i64 [[I_04]], 1
+; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[INC]], 45
+; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_FIRST]], label %[[FOR_FIRST_EXIT:.*]]
+; CHECK:       [[FOR_FIRST_EXIT]]:
+; CHECK-NEXT:    call void @bar()
+; CHECK-NEXT:    br label %[[FOR_SECOND_GUARD]]
+; CHECK:       [[FOR_SECOND_GUARD]]:
+; CHECK-NEXT:    [[CMP21:%.*]] = icmp slt i64 2, 45
+; CHECK-NEXT:    br i1 [[CMP21]], label %[[FOR_SECOND_PREHEADER:.*]], label %[[FOR_END:.*]]
+; CHECK:       [[FOR_SECOND_PREHEADER]]:
+; CHECK-NEXT:    br label %[[FOR_SECOND:.*]]
+; CHECK:       [[FOR_SECOND]]:
+; CHECK-NEXT:    [[J_02:%.*]] = phi i64 [ [[INC6:%.*]], %[[FOR_SECOND]] ], [ 2, %[[FOR_SECOND_PREHEADER]] ]
+; CHECK-NEXT:    [[ARRAYIDX4:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[J_02]]
+; CHECK-NEXT:    store i32 0, ptr [[ARRAYIDX4]], align 4
+; CHECK-NEXT:    [[INC6]] = add nsw i64 [[J_02]], 1
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i64 [[INC6]], 45
+; CHECK-NEXT:    br i1 [[CMP2]], label %[[FOR_SECOND]], label %[[FOR_SECOND_EXIT:.*]]
+; CHECK:       [[FOR_SECOND_EXIT]]:
+; CHECK-NEXT:    br label %[[FOR_END]]
+; CHECK:       [[FOR_END]]:
+; CHECK-NEXT:    ret void
+;
 for.first.guard:
   %cmp3 = icmp slt i64 0, 45
   br i1 %cmp3, label %for.first.preheader, label %for.second.guard
diff --git a/llvm/test/Transforms/LoopFusion/hoist_load.ll b/llvm/test/Transforms/LoopFusion/hoist_load.ll
index b399b011fdfc9..af9a5a202e6e3 100644
--- a/llvm/test/Transforms/LoopFusion/hoist_load.ll
+++ b/llvm/test/Transforms/LoopFusion/hoist_load.ll
@@ -1,23 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Safe to hoist.
 
 @A = common global [100 x i32] zeroinitializer, align 16
 define void @hoist_preheader(i32 %N) {
-; CHECK-LABEL: @hoist_preheader(
-; CHECK-NEXT:  pre1:
+; CHECK-LABEL: define void @hoist_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
 ; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
 ; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[PTR]], align 4
-; CHECK-NEXT:    br label [[BODY1:%.*]]
-; CHECK:       body1:
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[BODY1]] ], [ 0, [[PRE1:%.*]] ]
-; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], [[BODY1]] ], [ 0, [[PRE1]] ]
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
 ; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
-; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N:%.*]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
 ; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
 ; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
-; CHECK-NEXT:    br i1 [[COND2]], label [[BODY1]], label [[EXIT:%.*]]
-; CHECK:       exit:
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
 ; CHECK-NEXT:    ret void
 ;
 pre1:
diff --git a/llvm/test/Transforms/LoopFusion/hoist_preheader.ll b/llvm/test/Transforms/LoopFusion/hoist_preheader.ll
index 433090fbd994d..89698f5cc8060 100644
--- a/llvm/test/Transforms/LoopFusion/hoist_preheader.ll
+++ b/llvm/test/Transforms/LoopFusion/hoist_preheader.ll
@@ -1,16 +1,27 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
 
 define void @hoist_preheader(i32 %N) {
-
-; CHECK:pre1:
-; CHECK-NEXT:  %hoistme = add i32 1, %N
-; CHECK-NEXT:  %hoistme2 = add i32 1, %hoistme
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @hoist_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    [[HOISTME:%.*]] = add i32 1, [[N]]
+; CHECK-NEXT:    [[HOISTME2:%.*]] = add i32 1, [[HOISTME]]
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   br label %body1
 
-; CHECK: body1:
-; CHECK-NOT:  %hoistme
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
diff --git a/llvm/test/Transforms/LoopFusion/hoist_store.ll b/llvm/test/Transforms/LoopFusion/hoist_store.ll
index c5c88de55e5b1..b9b5400a76987 100644
--- a/llvm/test/Transforms/LoopFusion/hoist_store.ll
+++ b/llvm/test/Transforms/LoopFusion/hoist_store.ll
@@ -1,23 +1,25 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Safe to hoist.
 
 @A = common global [100 x i32] zeroinitializer, align 16
 define void @hoist_preheader(i32 %N) {
-; CHECK-LABEL: @hoist_preheader(
-; CHECK-NEXT:  pre1:
+; CHECK-LABEL: define void @hoist_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
 ; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
 ; CHECK-NEXT:    store i32 3, ptr [[PTR]], align 4
-; CHECK-NEXT:    br label [[BODY1:%.*]]
-; CHECK:       body1:
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[BODY1]] ], [ 0, [[PRE1:%.*]] ]
-; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], [[BODY1]] ], [ 0, [[PRE1]] ]
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
 ; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
-; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N:%.*]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
 ; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
 ; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
-; CHECK-NEXT:    br i1 [[COND2]], label [[BODY1]], label [[EXIT:%.*]]
-; CHECK:       exit:
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
 ; CHECK-NEXT:    ret void
 ;
 pre1:
diff --git a/llvm/test/Transforms/LoopFusion/inner_loops.ll b/llvm/test/Transforms/LoopFusion/inner_loops.ll
index 3c90905339fa7..88ac6621baff2 100644
--- a/llvm/test/Transforms/LoopFusion/inner_loops.ll
+++ b/llvm/test/Transforms/LoopFusion/inner_loops.ll
@@ -1,26 +1,66 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
 
 @A = common global [1024 x [1024 x i32]] zeroinitializer, align 16
 @B = common global [1024 x [1024 x i32]] zeroinitializer, align 16
 
-; CHECK: void @dep_free
-; CHECK-NEXT: bb:
-; CHECK-NEXT: br label %[[LOOP1HEADER:bb[0-9]*]]
-; CHECK: [[LOOP1HEADER]]
-; CHECK: br i1 %{{.*}}, label %[[LOOP1BODY:bb[0-9]*]], label %[[LOOP2PREHEADER:bb[0-9]+]]
-; CHECK: [[LOOP1BODY]]
-; CHECK: br label %[[LOOP1LATCH:bb[0-9]*]]
-; CHECK: [[LOOP1LATCH]]
-; CHECK: br label %[[LOOP2PREHEADER:bb[0-9]+]]
-; CHECK: [[LOOP2PREHEADER]]
-; CHECK: br i1 %{{.*}}, label %[[LOOP2BODY:bb[0-9]*]], label %[[LOOP2EXIT:bb[0-9]*]]
-; CHECK: [[LOOP2BODY]]
-; CHECK: br label %[[LOOP2LATCH:bb[0-9]+]]
-; CHECK: [[LOOP2LATCH]]
-; CHECK: br label %[[LOOP1HEADER]]
-; CHECK: ret void
 
 define void @dep_free() {
+; CHECK-LABEL: define void @dep_free() {
+; CHECK-NEXT:  [[BB:.*]]:
+; CHECK-NEXT:    br label %[[BB9:.*]]
+; CHECK:       [[BB9]]:
+; CHECK-NEXT:    [[INDVARS_IV6:%.*]] = phi i64 [ [[INDVARS_IV_NEXT7:%.*]], %[[BB35:.*]] ], [ 0, %[[BB]] ]
+; CHECK-NEXT:    [[DOT0:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP36:%.*]], %[[BB35]] ]
+; CHECK-NEXT:    [[EXITCOND8:%.*]] = icmp ne i64 [[INDVARS_IV6]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND8]], label %[[BB11:.*]], label %[[BB10:.*]]
+; CHECK:       [[BB10]]:
+; CHECK-NEXT:    br label %[[BB37:.*]]
+; CHECK:       [[BB11]]:
+; CHECK-NEXT:    br label %[[BB12:.*]]
+; CHECK:       [[BB12]]:
+; CHECK-NEXT:    [[INDVARS_IV:%.*]] = phi i64 [ [[INDVARS_IV_NEXT:%.*]], %[[BB21:.*]] ], [ 0, %[[BB11]] ]
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[BB14:.*]], label %[[BB23_PREHEADER:.*]]
+; CHECK:       [[BB23_PREHEADER]]:
+; CHECK-NEXT:    br label %[[BB23:.*]]
+; CHECK:       [[BB14]]:
+; CHECK-NEXT:    [[TMP:%.*]] = add nsw i32 [[DOT0]], -3
+; CHECK-NEXT:    [[TMP15:%.*]] = add nuw nsw i64 [[INDVARS_IV6]], 3
+; CHECK-NEXT:    [[TMP16:%.*]] = trunc i64 [[TMP15]] to i32
+; CHECK-NEXT:    [[TMP17:%.*]] = mul nsw i32 [[TMP]], [[TMP16]]
+; CHECK-NEXT:    [[TMP18:%.*]] = trunc i64 [[INDVARS_IV6]] to i32
+; CHECK-NEXT:    [[TMP19:%.*]] = srem i32 [[TMP17]], [[TMP18]]
+; CHECK-NEXT:    [[TMP20:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @A, i64 0, i64 [[INDVARS_IV6]], i64 [[INDVARS_IV]]
+; CHECK-NEXT:    store i32 [[TMP19]], ptr [[TMP20]], align 4
+; CHECK-NEXT:    br label %[[BB21]]
+; CHECK:       [[BB21]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV]], 1
+; CHECK-NEXT:    br label %[[BB12]]
+; CHECK:       [[BB23]]:
+; CHECK-NEXT:    [[INDVARS_IV3:%.*]] = phi i64 [ [[INDVARS_IV_NEXT4:%.*]], %[[BB33:.*]] ], [ 0, %[[BB23_PREHEADER]] ]
+; CHECK-NEXT:    [[EXITCOND5:%.*]] = icmp ne i64 [[INDVARS_IV3]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND5]], label %[[BB25:.*]], label %[[BB35]]
+; CHECK:       [[BB25]]:
+; CHECK-NEXT:    [[TMP26:%.*]] = add nsw i32 [[DOT0]], -3
+; CHECK-NEXT:    [[TMP27:%.*]] = add nuw nsw i64 [[INDVARS_IV6]], 3
+; CHECK-NEXT:    [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32
+; CHECK-NEXT:    [[TMP29:%.*]] = mul nsw i32 [[TMP26]], [[TMP28]]
+; CHECK-NEXT:    [[TMP30:%.*]] = trunc i64 [[INDVARS_IV6]] to i32
+; CHECK-NEXT:    [[TMP31:%.*]] = srem i32 [[TMP29]], [[TMP30]]
+; CHECK-NEXT:    [[TMP32:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @B, i64 0, i64 [[INDVARS_IV6]], i64 [[INDVARS_IV3]]
+; CHECK-NEXT:    store i32 [[TMP31]], ptr [[TMP32]], align 4
+; CHECK-NEXT:    br label %[[BB33]]
+; CHECK:       [[BB33]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT4]] = add nuw nsw i64 [[INDVARS_IV3]], 1
+; CHECK-NEXT:    br label %[[BB23]]
+; CHECK:       [[BB35]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT7]] = add nuw nsw i64 [[INDVARS_IV6]], 1
+; CHECK-NEXT:    [[TMP36]] = add nuw nsw i32 [[DOT0]], 1
+; CHECK-NEXT:    br label %[[BB9]]
+; CHECK:       [[BB37]]:
+; CHECK-NEXT:    ret void
+;
 bb:
   br label %bb9
 
diff --git a/llvm/test/Transforms/LoopFusion/loop_nest.ll b/llvm/test/Transforms/LoopFusion/loop_nest.ll
index 260e7c86eeed0..39dcd19fb05ab 100644
--- a/llvm/test/Transforms/LoopFusion/loop_nest.ll
+++ b/llvm/test/Transforms/LoopFusion/loop_nest.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
 ;
 ;    int A[1024][1024];
@@ -19,28 +20,61 @@
 @A = common global [1024 x [1024 x i32]] zeroinitializer, align 16
 @B = common global [1024 x [1024 x i32]] zeroinitializer, align 16
 
-; CHECK: void @dep_free
-; CHECK-NEXT: bb:
-; CHECK-NEXT: br label %[[LOOP1HEADER:bb[0-9]+]]
-; CHECK: [[LOOP1HEADER]]
-; CHECK: br label %[[LOOP3HEADER:bb[0-9]+]]
-; CHECK: [[LOOP3HEADER]]
-; CHECK: br label %[[LOOP2HEADER:bb[0-9]+]]
-; CHECK: [[LOOP2HEADER]]
-; CHECK: br label %[[LOOP4HEADER:bb[0-9]+]]
-; CHECK: [[LOOP4HEADER]]
-; CHECK: br i1 %{{.*}}, label %[[LOOP3HEADER]], label %[[LOOP1LATCH:bb[0-9]+]]
-; CHECK: [[LOOP1LATCH]]
-; CHECK-NEXT: %inc.outer.fc0 = add nuw nsw i64 %indvars.iv105, 1
-; CHECK-NEXT: %add.outer.fc0 = add nuw nsw i32 %.06, 1
-; CHECK-NEXT: %cmp.outer.fc0 = icmp ne i64 %inc.outer.fc0, 100
-; CHECK: br i1 %{{.*}}, label %[[LOOP1HEADER]], label %[[LOOP1EXIT:bb[0-9]*]]
-; CHECK: ret void
 
 ; TODO: The current version of loop fusion does not allow the inner loops to be
 ; fused because they are not control flow equivalent and adjacent. These are
 ; limitations that can be addressed in future improvements to fusion.
 define void @dep_free() {
+; CHECK-LABEL: define void @dep_free() {
+; CHECK-NEXT:  [[BB:.*]]:
+; CHECK-NEXT:    br label %[[BB16:.*]]
+; CHECK:       [[BB16]]:
+; CHECK-NEXT:    [[DOT06:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[ADD_OUTER_FC0:%.*]], %[[BB45:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV105:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INC_OUTER_FC0:%.*]], %[[BB45]] ]
+; CHECK-NEXT:    [[DOT023:%.*]] = phi i32 [ 0, %[[BB]] ], [ [[TMP46:%.*]], %[[BB45]] ]
+; CHECK-NEXT:    [[INDVARS_IV42:%.*]] = phi i64 [ 0, %[[BB]] ], [ [[INDVARS_IV_NEXT5:%.*]], %[[BB45]] ]
+; CHECK-NEXT:    br label %[[BB18:.*]]
+; CHECK:       [[BB18]]:
+; CHECK-NEXT:    [[INDVARS_IV74:%.*]] = phi i64 [ 0, %[[BB16]] ], [ [[INDVARS_IV_NEXT8:%.*]], %[[BB43:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV1:%.*]] = phi i64 [ 0, %[[BB16]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[BB43]] ]
+; CHECK-NEXT:    [[TMP:%.*]] = add nsw i32 [[DOT06]], -3
+; CHECK-NEXT:    [[TMP19:%.*]] = add nuw nsw i64 [[INDVARS_IV105]], 3
+; CHECK-NEXT:    [[TMP20:%.*]] = trunc i64 [[TMP19]] to i32
+; CHECK-NEXT:    [[TMP21:%.*]] = mul nsw i32 [[TMP]], [[TMP20]]
+; CHECK-NEXT:    [[TMP22:%.*]] = trunc i64 [[INDVARS_IV105]] to i32
+; CHECK-NEXT:    [[TMP23:%.*]] = srem i32 [[TMP21]], [[TMP22]]
+; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @A, i64 0, i64 [[INDVARS_IV105]], i64 [[INDVARS_IV74]]
+; CHECK-NEXT:    store i32 [[TMP23]], ptr [[TMP24]], align 4
+; CHECK-NEXT:    br label %[[BB25:.*]]
+; CHECK:       [[BB25]]:
+; CHECK-NEXT:    [[TMP36:%.*]] = add nsw i32 [[DOT023]], -3
+; CHECK-NEXT:    [[TMP37:%.*]] = add nuw nsw i64 [[INDVARS_IV42]], 3
+; CHECK-NEXT:    [[TMP38:%.*]] = trunc i64 [[TMP37]] to i32
+; CHECK-NEXT:    [[TMP39:%.*]] = mul nsw i32 [[TMP36]], [[TMP38]]
+; CHECK-NEXT:    [[TMP40:%.*]] = trunc i64 [[INDVARS_IV42]] to i32
+; CHECK-NEXT:    [[TMP41:%.*]] = srem i32 [[TMP39]], [[TMP40]]
+; CHECK-NEXT:    [[TMP42:%.*]] = getelementptr inbounds [1024 x [1024 x i32]], ptr @B, i64 0, i64 [[INDVARS_IV42]], i64 [[INDVARS_IV1]]
+; CHECK-NEXT:    store i32 [[TMP41]], ptr [[TMP42]], align 4
+; CHECK-NEXT:    br label %[[BB43]]
+; CHECK:       [[BB31:.*]]:
+; CHECK-NEXT:    br label %[[BB47:.*]]
+; CHECK:       [[BB43]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT8]] = add nuw nsw i64 [[INDVARS_IV74]], 1
+; CHECK-NEXT:    [[EXITCOND9:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT8]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV1]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[BB18]], label %[[BB45]]
+; CHECK:       [[BB45]]:
+; CHECK-NEXT:    [[INC_OUTER_FC0]] = add nuw nsw i64 [[INDVARS_IV105]], 1
+; CHECK-NEXT:    [[ADD_OUTER_FC0]] = add nuw nsw i32 [[DOT06]], 1
+; CHECK-NEXT:    [[CMP_OUTER_FC0:%.*]] = icmp ne i64 [[INC_OUTER_FC0]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT5]] = add nuw nsw i64 [[INDVARS_IV42]], 1
+; CHECK-NEXT:    [[TMP46]] = add nuw nsw i32 [[DOT023]], 1
+; CHECK-NEXT:    [[EXITCOND6:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT5]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND6]], label %[[BB16]], label %[[BB31]]
+; CHECK:       [[BB47]]:
+; CHECK-NEXT:    ret void
+;
 bb:
   br label %bb16
 
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist.ll
index ae833464922c1..1bf8541b836fa 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist.ll
@@ -1,15 +1,34 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
 
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    [[BARRIER:%.*]] = add i32 1, [[N]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    [[STAY:%.*]] = add i32 1, [[BARRIER]]
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    [[BARRIER2:%.*]] = add i32 1, [[STAY]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT:  %stay =
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
@@ -17,14 +36,10 @@ body1:  ; preds = %pre1, %body1
   %barrier = add i32 1, %N
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK: %stay =
 pre2:
   %stay = add i32 1, %barrier
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: %stay =
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
@@ -32,8 +47,6 @@ body2:  ; preds = %pre2, %body2
   %barrier2 = add i32 1, %stay
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
-; CHECK-NOT: %stay =
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_atomic.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_atomic.ll
index fdc771495c850..446e0dde96e21 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_atomic.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_atomic.ll
@@ -1,38 +1,50 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
 
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:   %ptr = alloca i32
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    store atomic i32 3, ptr [[PTR]] seq_cst, align 4
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   %ptr = alloca i32
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT: store atomic i32 3, ptr %ptr seq_cst, align 4
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
   %cond = icmp ne i32 %i, %N
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK-NEXT: store atomic i32 3, ptr %ptr seq_cst, align 4
 pre2:
   store atomic i32 3, ptr %ptr seq_cst, align 4
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT:  store atomic i32 3, ptr %ptr seq_cst, align 4
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
   %cond2 = icmp ne i32 %i2, %N
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_inner_barrier.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_inner_barrier.ll
index 9dc07364fa437..c02e757a789c4 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_inner_barrier.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_inner_barrier.ll
@@ -1,18 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 
 ; CHECK: Could not hoist/sink all instructions
 
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    [[BARRIER:%.*]] = add i32 1, [[N]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    [[NO_HOIST:%.*]] = add i32 1, [[BARRIER]]
+; CHECK-NEXT:    [[NO_HOIST_SINK:%.*]] = add i32 1, [[NO_HOIST]]
+; CHECK-NEXT:    [[NO_SINK:%.*]] = add i32 1, [[NO_HOIST_SINK]]
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    [[BARRIER2:%.*]] = add i32 1, [[NO_SINK]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT: %no_hoist =
-; CHECK-NOT: %no_hoist_sink =
-; CHECK-NOT: %no_sink =
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
@@ -20,20 +39,12 @@ body1:  ; preds = %pre1, %body1
   %barrier = add i32 1, %N
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK: %no_hoist =
-; CHECK: %no_hoist_sink =
-; CHECK: %no_sink =
 pre2:
   %no_hoist = add i32 1, %barrier
   %no_hoist_sink = add i32 1, %no_hoist
   %no_sink = add i32 1, %no_hoist_sink
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: %no_hoist =
-; CHECK-NOT: %no_hoist_sink =
-; CHECK-NOT: %no_sink =
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
@@ -41,8 +52,6 @@ body2:  ; preds = %pre2, %body2
   %barrier2 = add i32 1, %no_sink
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
-; CHECK-NOT: %stay =
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_load.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_load.ll
index 8497c8bdcc941..ec279ae5dabd7 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_load.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_load.ll
@@ -1,18 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
 
 @A = common global [100 x i32] zeroinitializer, align 16
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  %ptr = alloca i32, align 4
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    store i32 3, ptr [[PTR]], align 4
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    [[STAY:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    store i32 3, ptr [[PTR]], align 4
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   %ptr = alloca i32, align 4
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT:  %stay =
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
@@ -20,14 +39,10 @@ body1:  ; preds = %pre1, %body1
   store i32 3, ptr %ptr
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK-NEXT: %stay = load i32, ptr %ptr
 pre2:
   %stay = load i32, ptr %ptr
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: %stay =
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
@@ -35,8 +50,6 @@ body2:  ; preds = %pre2, %body2
   store i32 3, ptr %ptr
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
-; CHECK-NOT: %stay =
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_store.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_store.ll
index 5779658187119..1a03260ec95be 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_store.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_store.ll
@@ -1,18 +1,37 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
 
 @A = common global [100 x i32] zeroinitializer, align 16
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  %ptr = alloca i32, align 4
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    store i32 3, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   %ptr = alloca i32, align 4
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT:  store i32 3, ptr %ptr
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
@@ -20,14 +39,10 @@ body1:  ; preds = %pre1, %body1
   %load1 = load i32, ptr %ptr
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK-NEXT: store i32 3, ptr %ptr
 pre2:
   store i32 3, ptr %ptr
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: store i32 3, ptr %ptr
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
@@ -35,8 +50,6 @@ body2:  ; preds = %pre2, %body2
   %load2 = load i32, ptr %ptr
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
-; CHECK-NOT: store i32 3, ptr %ptr
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_unknown_function.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_unknown_function.ll
index 621119df10077..9d44062a3b7b0 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_unknown_function.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_unknown_function.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
@@ -5,34 +6,45 @@
 declare void @unknown_func()
 
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    call void @unknown_func()
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT: call void @unknown_func()
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
   %cond = icmp ne i32 %i, %N
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK-NEXT: call void @unknown_func()
 pre2:
   call void @unknown_func()
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: call void @unknown_func()
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
   %cond2 = icmp ne i32 %i2, %N
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/no_sink_hoist_volatile.ll b/llvm/test/Transforms/LoopFusion/no_sink_hoist_volatile.ll
index 2cba4302c1eb8..c40bd18c8b7d7 100644
--- a/llvm/test/Transforms/LoopFusion/no_sink_hoist_volatile.ll
+++ b/llvm/test/Transforms/LoopFusion/no_sink_hoist_volatile.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 ; CHECK: Could not hoist/sink all instructions
@@ -5,36 +6,47 @@
 declare void @unknown_func()
 
 define void @sink_preheader(i32 %N) {
-; CHECK:pre1:
-; CHECK-NEXT:  %ptr = alloca i32
-; CHECK-NEXT:  br label %body1
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
+; CHECK-NEXT:    br i1 [[COND]], label %[[BODY1]], label %[[PRE2:.*]]
+; CHECK:       [[PRE2]]:
+; CHECK-NEXT:    store volatile i32 3, ptr [[PTR]], align 4
+; CHECK-NEXT:    br label %[[BODY2:.*]]
+; CHECK:       [[BODY2]]:
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY2]] ], [ 0, %[[PRE2]] ]
+; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
+; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY2]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
+; CHECK-NEXT:    ret void
+;
 pre1:
   %ptr = alloca i32
   br label %body1
 
-; CHECK:body1:
-; CHECK-NOT: store volatile i32 3, ptr %ptr
 body1:  ; preds = %pre1, %body1
   %i = phi i32 [%i_next, %body1], [0, %pre1]
   %i_next = add i32 1, %i
   %cond = icmp ne i32 %i, %N
   br i1 %cond, label %body1, label %pre2
 
-; CHECK:pre2:
-; CHECK-NEXT: store volatile i32 3, ptr %ptr
 pre2:
   store volatile i32 3, ptr %ptr
   br label %body2
 
-; CHECK: body2:
-; CHECK-NOT: store volatile i32 3, ptr %ptr
 body2:  ; preds = %pre2, %body2
   %i2 = phi i32 [%i_next2, %body2], [0, %pre2]
   %i_next2 = add i32 1, %i2
   %cond2 = icmp ne i32 %i2, %N
   br i1 %cond2, label %body2, label %exit
 
-; CHECK: exit:
 exit:
   ret void
 }
diff --git a/llvm/test/Transforms/LoopFusion/nonadjacent_peel.ll b/llvm/test/Transforms/LoopFusion/nonadjacent_peel.ll
index 1bc70ef4f3aaf..c9e57b671a5a9 100644
--- a/llvm/test/Transforms/LoopFusion/nonadjacent_peel.ll
+++ b/llvm/test/Transforms/LoopFusion/nonadjacent_peel.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
 
 ; Tests that we do not fuse these two loops together. These loops do not have
@@ -6,29 +7,57 @@
 ; peeling).
 ; The expected output of this test is the function below.
 
-; CHECK-LABEL: void @function(ptr noalias %arg)
-; CHECK-NEXT:  for.first.preheader:
-; CHECK-NEXT:    br label %for.first
-; CHECK:       for.first:
-; CHECK:         br label %for.first.latch
-; CHECK:       for.first.latch:
-; CHECK:         br i1 %exitcond4, label %for.first, label %for.first.exit
-; CHECK:       for.first.exit:
-; CHECK-NEXT:    br label %for.next
-; CHECK:       for.next:
-; CHECK-NEXT:    br label %for.second.preheader
-; CHECK:       for.second.preheader:
-; CHECK:         br label %for.second
-; CHECK:       for.second:
-; CHECK:         br label %for.second.latch
-; CHECK:       for.second.latch:
-; CHECK:         br i1 %exitcond, label %for.second, label %for.end
-; CHECK:       for.end:
-; CHECK-NEXT:    ret void
 
 @B = common global [1024 x i32] zeroinitializer, align 16
 
 define void @function(ptr noalias %arg) {
+; CHECK-LABEL: define void @function(
+; CHECK-SAME: ptr noalias [[ARG:%.*]]) {
+; CHECK-NEXT:  [[FOR_FIRST_PREHEADER:.*]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST:.*]]
+; CHECK:       [[FOR_FIRST]]:
+; CHECK-NEXT:    [[DOT014:%.*]] = phi i32 [ 0, %[[FOR_FIRST_PREHEADER]] ], [ [[TMP15:%.*]], %[[FOR_FIRST_LATCH:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV23:%.*]] = phi i64 [ 0, %[[FOR_FIRST_PREHEADER]] ], [ [[INDVARS_IV_NEXT3:%.*]], %[[FOR_FIRST_LATCH]] ]
+; CHECK-NEXT:    [[TMP:%.*]] = add nsw i32 [[DOT014]], -3
+; CHECK-NEXT:    [[TMP8:%.*]] = add nuw nsw i64 [[INDVARS_IV23]], 3
+; CHECK-NEXT:    [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
+; CHECK-NEXT:    [[TMP10:%.*]] = mul nsw i32 [[TMP]], [[TMP9]]
+; CHECK-NEXT:    [[TMP11:%.*]] = trunc i64 [[INDVARS_IV23]] to i32
+; CHECK-NEXT:    [[TMP12:%.*]] = srem i32 [[TMP10]], [[TMP11]]
+; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 [[INDVARS_IV23]]
+; CHECK-NEXT:    store i32 [[TMP12]], ptr [[TMP13]], align 4
+; CHECK-NEXT:    br label %[[FOR_FIRST_LATCH]]
+; CHECK:       [[FOR_FIRST_LATCH]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT3]] = add nuw nsw i64 [[INDVARS_IV23]], 1
+; CHECK-NEXT:    [[TMP15]] = add nuw nsw i32 [[DOT014]], 1
+; CHECK-NEXT:    [[EXITCOND4:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND4]], label %[[FOR_FIRST]], label %[[FOR_FIRST_EXIT:.*]]
+; CHECK:       [[FOR_FIRST_EXIT]]:
+; CHECK-NEXT:    br label %[[FOR_NEXT:.*]]
+; CHECK:       [[FOR_NEXT]]:
+; CHECK-NEXT:    br label %[[FOR_SECOND_PREHEADER:.*]]
+; CHECK:       [[FOR_SECOND_PREHEADER]]:
+; CHECK-NEXT:    br label %[[FOR_SECOND:.*]]
+; CHECK:       [[FOR_SECOND]]:
+; CHECK-NEXT:    [[DOT02:%.*]] = phi i32 [ 0, %[[FOR_SECOND_PREHEADER]] ], [ [[TMP28:%.*]], %[[FOR_SECOND_LATCH:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV1:%.*]] = phi i64 [ 3, %[[FOR_SECOND_PREHEADER]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[FOR_SECOND_LATCH]] ]
+; CHECK-NEXT:    [[TMP20:%.*]] = add nsw i32 [[DOT02]], -3
+; CHECK-NEXT:    [[TMP21:%.*]] = add nuw nsw i64 [[INDVARS_IV1]], 3
+; CHECK-NEXT:    [[TMP22:%.*]] = trunc i64 [[TMP21]] to i32
+; CHECK-NEXT:    [[TMP23:%.*]] = mul nsw i32 [[TMP20]], [[TMP22]]
+; CHECK-NEXT:    [[TMP24:%.*]] = trunc i64 [[INDVARS_IV1]] to i32
+; CHECK-NEXT:    [[TMP25:%.*]] = srem i32 [[TMP23]], [[TMP24]]
+; CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[INDVARS_IV1]]
+; CHECK-NEXT:    store i32 [[TMP25]], ptr [[TMP26]], align 4
+; CHECK-NEXT:    br label %[[FOR_SECOND_LATCH]]
+; CHECK:       [[FOR_SECOND_LATCH]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV1]], 1
+; CHECK-NEXT:    [[TMP28]] = add nuw nsw i32 [[DOT02]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[FOR_SECOND]], label %[[FOR_END:.*]]
+; CHECK:       [[FOR_END]]:
+; CHECK-NEXT:    ret void
+;
 for.first.preheader:
   br label %for.first
 
diff --git a/llvm/test/Transforms/LoopFusion/peel.ll b/llvm/test/Transforms/LoopFusion/peel.ll
index 0ee3a3b068037..e8a4817f4c064 100644
--- a/llvm/test/Transforms/LoopFusion/peel.ll
+++ b/llvm/test/Transforms/LoopFusion/peel.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion -loop-fusion-peel-max-count=3 < %s | FileCheck %s
 
 ; Tests whether we can fuse two loops together if they have constant but a
@@ -17,45 +18,106 @@
 ;     B[i] = ((i-6)*(i+3)) % i;
 ; }
 
-; CHECK-LABEL: void @function(ptr noalias %arg)
-; CHECK-NEXT:  for.first.preheader:
-; CHECK-NEXT:    br label %for.first.peel.begin
-; CHECK:       for.first.peel.begin:
-; CHECK-NEXT:    br label %for.first.peel
-; CHECK:       for.first.peel:
-; CHECK:         br label %for.first.latch.peel
-; CHECK:       for.first.latch.peel:
-; CHECK:         br label %for.first.peel.next
-; CHECK:       for.first.peel.next:
-; CHECK-NEXT:    br label %for.first.peel2
-; CHECK:       for.first.peel2:
-; CHECK:         br label %for.first.latch.peel10
-; CHECK:       for.first.latch.peel10:
-; CHECK:         br label %for.first.peel.next1
-; CHECK:       for.first.peel.next1:
-; CHECK-NEXT:    br label %for.first.peel15
-; CHECK:       for.first.peel15:
-; CHECK:         br label %for.first.latch.peel23
-; CHECK:       for.first.latch.peel23:
-; CHECK:         br label %for.first.peel.next14
-; CHECK:       for.first.peel.next14:
-; CHECK-NEXT:    br label %for.first.peel.next27
-; CHECK:       for.first.peel.next27:
-; CHECK-NEXT:    br label %for.first.preheader.peel.newph
-; CHECK:       for.first.preheader.peel.newph:
-; CHECK-NEXT:    br label %for.first
-; CHECK:       for.first:
-; CHECK:         br label %for.first.latch
-; CHECK:       for.first.latch:
-; CHECK:         br label %for.second.latch
-; CHECK:       for.second.latch:
-; CHECK:         br i1 %exitcond, label %for.first, label %for.end
-; CHECK:       for.end:
-; CHECK-NEXT:    ret void
 
 @B = common global [1024 x i32] zeroinitializer, align 16
 
 define void @function(ptr noalias %arg) {
+; CHECK-LABEL: define void @function(
+; CHECK-SAME: ptr noalias [[ARG:%.*]]) {
+; CHECK-NEXT:  [[FOR_FIRST_PREHEADER:.*:]]
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_BEGIN:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_BEGIN]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL:.*]]
+; CHECK:       [[FOR_FIRST_PEEL]]:
+; CHECK-NEXT:    [[TMP_PEEL:%.*]] = add nsw i32 0, -3
+; CHECK-NEXT:    [[TMP8_PEEL:%.*]] = add nuw nsw i64 0, 3
+; CHECK-NEXT:    [[TMP9_PEEL:%.*]] = trunc i64 [[TMP8_PEEL]] to i32
+; CHECK-NEXT:    [[TMP10_PEEL:%.*]] = mul nsw i32 [[TMP_PEEL]], [[TMP9_PEEL]]
+; CHECK-NEXT:    [[TMP11_PEEL:%.*]] = trunc i64 0 to i32
+; CHECK-NEXT:    [[TMP12_PEEL:%.*]] = srem i32 [[TMP10_PEEL]], [[TMP11_PEEL]]
+; CHECK-NEXT:    [[TMP13_PEEL:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 0
+; CHECK-NEXT:    store i32 [[TMP12_PEEL]], ptr [[TMP13_PEEL]], align 4
+; CHECK-NEXT:    br label %[[FOR_FIRST_LATCH_PEEL:.*]]
+; CHECK:       [[FOR_FIRST_LATCH_PEEL]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT3_PEEL:%.*]] = add nuw nsw i64 0, 1
+; CHECK-NEXT:    [[TMP15_PEEL:%.*]] = add nuw nsw i32 0, 1
+; CHECK-NEXT:    [[EXITCOND4_PEEL:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3_PEEL]], 100
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL2:.*]]
+; CHECK:       [[FOR_FIRST_PEEL2]]:
+; CHECK-NEXT:    [[TMP_PEEL3:%.*]] = add nsw i32 [[TMP15_PEEL]], -3
+; CHECK-NEXT:    [[TMP8_PEEL4:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT3_PEEL]], 3
+; CHECK-NEXT:    [[TMP9_PEEL5:%.*]] = trunc i64 [[TMP8_PEEL4]] to i32
+; CHECK-NEXT:    [[TMP10_PEEL6:%.*]] = mul nsw i32 [[TMP_PEEL3]], [[TMP9_PEEL5]]
+; CHECK-NEXT:    [[TMP11_PEEL7:%.*]] = trunc i64 [[INDVARS_IV_NEXT3_PEEL]] to i32
+; CHECK-NEXT:    [[TMP12_PEEL8:%.*]] = srem i32 [[TMP10_PEEL6]], [[TMP11_PEEL7]]
+; CHECK-NEXT:    [[TMP13_PEEL9:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 [[INDVARS_IV_NEXT3_PEEL]]
+; CHECK-NEXT:    store i32 [[TMP12_PEEL8]], ptr [[TMP13_PEEL9]], align 4
+; CHECK-NEXT:    br label %[[FOR_FIRST_LATCH_PEEL10:.*]]
+; CHECK:       [[FOR_FIRST_LATCH_PEEL10]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT3_PEEL11:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT3_PEEL]], 1
+; CHECK-NEXT:    [[TMP15_PEEL12:%.*]] = add nuw nsw i32 [[TMP15_PEEL]], 1
+; CHECK-NEXT:    [[EXITCOND4_PEEL13:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3_PEEL11]], 100
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT1:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT1]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL15:.*]]
+; CHECK:       [[FOR_FIRST_PEEL15]]:
+; CHECK-NEXT:    [[TMP_PEEL16:%.*]] = add nsw i32 [[TMP15_PEEL12]], -3
+; CHECK-NEXT:    [[TMP8_PEEL17:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT3_PEEL11]], 3
+; CHECK-NEXT:    [[TMP9_PEEL18:%.*]] = trunc i64 [[TMP8_PEEL17]] to i32
+; CHECK-NEXT:    [[TMP10_PEEL19:%.*]] = mul nsw i32 [[TMP_PEEL16]], [[TMP9_PEEL18]]
+; CHECK-NEXT:    [[TMP11_PEEL20:%.*]] = trunc i64 [[INDVARS_IV_NEXT3_PEEL11]] to i32
+; CHECK-NEXT:    [[TMP12_PEEL21:%.*]] = srem i32 [[TMP10_PEEL19]], [[TMP11_PEEL20]]
+; CHECK-NEXT:    [[TMP13_PEEL22:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 [[INDVARS_IV_NEXT3_PEEL11]]
+; CHECK-NEXT:    store i32 [[TMP12_PEEL21]], ptr [[TMP13_PEEL22]], align 4
+; CHECK-NEXT:    br label %[[FOR_FIRST_LATCH_PEEL23:.*]]
+; CHECK:       [[FOR_FIRST_LATCH_PEEL23]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT3_PEEL24:%.*]] = add nuw nsw i64 [[INDVARS_IV_NEXT3_PEEL11]], 1
+; CHECK-NEXT:    [[TMP15_PEEL25:%.*]] = add nuw nsw i32 [[TMP15_PEEL12]], 1
+; CHECK-NEXT:    [[EXITCOND4_PEEL26:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3_PEEL24]], 100
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT14:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT14]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PEEL_NEXT27:.*]]
+; CHECK:       [[FOR_FIRST_PEEL_NEXT27]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST_PREHEADER_PEEL_NEWPH:.*]]
+; CHECK:       [[FOR_FIRST_PREHEADER_PEEL_NEWPH]]:
+; CHECK-NEXT:    br label %[[FOR_FIRST:.*]]
+; CHECK:       [[FOR_FIRST]]:
+; CHECK-NEXT:    [[DOT014:%.*]] = phi i32 [ [[TMP15_PEEL25]], %[[FOR_FIRST_PREHEADER_PEEL_NEWPH]] ], [ [[TMP15:%.*]], %[[FOR_SECOND_LATCH:.*]] ]
+; CHECK-NEXT:    [[INDVARS_IV23:%.*]] = phi i64 [ [[INDVARS_IV_NEXT3_PEEL24]], %[[FOR_FIRST_PREHEADER_PEEL_NEWPH]] ], [ [[INDVARS_IV_NEXT3:%.*]], %[[FOR_SECOND_LATCH]] ]
+; CHECK-NEXT:    [[DOT02:%.*]] = phi i32 [ 0, %[[FOR_FIRST_PREHEADER_PEEL_NEWPH]] ], [ [[TMP28:%.*]], %[[FOR_SECOND_LATCH]] ]
+; CHECK-NEXT:    [[INDVARS_IV1:%.*]] = phi i64 [ 3, %[[FOR_FIRST_PREHEADER_PEEL_NEWPH]] ], [ [[INDVARS_IV_NEXT:%.*]], %[[FOR_SECOND_LATCH]] ]
+; CHECK-NEXT:    [[TMP:%.*]] = add nsw i32 [[DOT014]], -3
+; CHECK-NEXT:    [[TMP8:%.*]] = add nuw nsw i64 [[INDVARS_IV23]], 3
+; CHECK-NEXT:    [[TMP9:%.*]] = trunc i64 [[TMP8]] to i32
+; CHECK-NEXT:    [[TMP10:%.*]] = mul nsw i32 [[TMP]], [[TMP9]]
+; CHECK-NEXT:    [[TMP11:%.*]] = trunc i64 [[INDVARS_IV23]] to i32
+; CHECK-NEXT:    [[TMP12:%.*]] = srem i32 [[TMP10]], [[TMP11]]
+; CHECK-NEXT:    [[TMP13:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 [[INDVARS_IV23]]
+; CHECK-NEXT:    store i32 [[TMP12]], ptr [[TMP13]], align 4
+; CHECK-NEXT:    br label %[[FOR_FIRST_LATCH:.*]]
+; CHECK:       [[FOR_FIRST_LATCH]]:
+; CHECK-NEXT:    [[TMP20:%.*]] = add nsw i32 [[DOT02]], -3
+; CHECK-NEXT:    [[TMP21:%.*]] = add nuw nsw i64 [[INDVARS_IV1]], 3
+; CHECK-NEXT:    [[TMP22:%.*]] = trunc i64 [[TMP21]] to i32
+; CHECK-NEXT:    [[TMP23:%.*]] = mul nsw i32 [[TMP20]], [[TMP22]]
+; CHECK-NEXT:    [[TMP24:%.*]] = trunc i64 [[INDVARS_IV1]] to i32
+; CHECK-NEXT:    [[TMP25:%.*]] = srem i32 [[TMP23]], [[TMP24]]
+; CHECK-NEXT:    [[TMP26:%.*]] = getelementptr inbounds [1024 x i32], ptr @B, i64 0, i64 [[INDVARS_IV1]]
+; CHECK-NEXT:    store i32 [[TMP25]], ptr [[TMP26]], align 4
+; CHECK-NEXT:    br label %[[FOR_SECOND_LATCH]]
+; CHECK:       [[FOR_SECOND_LATCH]]:
+; CHECK-NEXT:    [[INDVARS_IV_NEXT3]] = add nuw nsw i64 [[INDVARS_IV23]], 1
+; CHECK-NEXT:    [[TMP15]] = add nuw nsw i32 [[DOT014]], 1
+; CHECK-NEXT:    [[EXITCOND4:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT3]], 100
+; CHECK-NEXT:    [[INDVARS_IV_NEXT]] = add nuw nsw i64 [[INDVARS_IV1]], 1
+; CHECK-NEXT:    [[TMP28]] = add nuw nsw i32 [[DOT02]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i64 [[INDVARS_IV_NEXT]], 100
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[FOR_FIRST]], label %[[FOR_END:.*]]
+; CHECK:       [[FOR_END]]:
+; CHECK-NEXT:    ret void
+;
 for.first.preheader:
   br label %for.first
 
diff --git a/llvm/test/Transforms/LoopFusion/sink_preheader.ll b/llvm/test/Transforms/LoopFusion/sink_preheader.ll
index 7e4559cfc85e3..be416db30da6e 100644
--- a/llvm/test/Transforms/LoopFusion/sink_preheader.ll
+++ b/llvm/test/Transforms/LoopFusion/sink_preheader.ll
@@ -1,19 +1,21 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s | FileCheck %s
 
 define void @sink_preheader(i32 %N) {
-; CHECK-LABEL: @sink_preheader(
-; CHECK-NEXT:  pre1:
-; CHECK-NEXT:    br label [[BODY1:%.*]]
-; CHECK:       body1:
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[BODY1]] ], [ 0, [[PRE1:%.*]] ]
-; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], [[BODY1]] ], [ 0, [[PRE1]] ]
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
 ; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
-; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N:%.*]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
 ; CHECK-NEXT:    [[BARRIER:%.*]] = add i32 1, [[N]]
 ; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
 ; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
-; CHECK-NEXT:    br i1 [[COND2]], label [[BODY1]], label [[EXIT:%.*]]
-; CHECK:       exit:
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
 ; CHECK-NEXT:    [[SINKME:%.*]] = add i32 1, [[BARRIER]]
 ; CHECK-NEXT:    [[SINKME2:%.*]] = add i32 1, [[BARRIER]]
 ; CHECK-NEXT:    [[SINKME3:%.*]] = add i32 1, [[SINKME2]]
diff --git a/llvm/test/Transforms/LoopFusion/sink_store.ll b/llvm/test/Transforms/LoopFusion/sink_store.ll
index 38575c448a7da..f572f72dd3f98 100644
--- a/llvm/test/Transforms/LoopFusion/sink_store.ll
+++ b/llvm/test/Transforms/LoopFusion/sink_store.ll
@@ -1,22 +1,24 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-simplify,loop-fusion -debug-only=loop-fusion < %s 2>&1 | FileCheck %s
 ; REQUIRES: asserts
 
 @A = common global [100 x i32] zeroinitializer, align 16
 define void @sink_preheader(i32 %N) {
-; CHECK-LABEL: @sink_preheader(
-; CHECK-NEXT:  pre1:
+; CHECK-LABEL: define void @sink_preheader(
+; CHECK-SAME: i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[PRE1:.*]]:
 ; CHECK-NEXT:    [[PTR:%.*]] = alloca i32, align 4
-; CHECK-NEXT:    br label [[BODY1:%.*]]
-; CHECK:       body1:
-; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], [[BODY1]] ], [ 0, [[PRE1:%.*]] ]
-; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], [[BODY1]] ], [ 0, [[PRE1]] ]
+; CHECK-NEXT:    br label %[[BODY1:.*]]
+; CHECK:       [[BODY1]]:
+; CHECK-NEXT:    [[I:%.*]] = phi i32 [ [[I_NEXT:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
+; CHECK-NEXT:    [[I2:%.*]] = phi i32 [ [[I_NEXT2:%.*]], %[[BODY1]] ], [ 0, %[[PRE1]] ]
 ; CHECK-NEXT:    [[I_NEXT]] = add i32 1, [[I]]
-; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N:%.*]]
+; CHECK-NEXT:    [[COND:%.*]] = icmp ne i32 [[I]], [[N]]
 ; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[PTR]], align 4
 ; CHECK-NEXT:    [[I_NEXT2]] = add i32 1, [[I2]]
 ; CHECK-NEXT:    [[COND2:%.*]] = icmp ne i32 [[I2]], [[N]]
-; CHECK-NEXT:    br i1 [[COND2]], label [[BODY1]], label [[EXIT:%.*]]
-; CHECK:       exit:
+; CHECK-NEXT:    br i1 [[COND2]], label %[[BODY1]], label %[[EXIT:.*]]
+; CHECK:       [[EXIT]]:
 ; CHECK-NEXT:    store i32 3, ptr [[PTR]], align 4
 ; CHECK-NEXT:    ret void
 ;
diff --git a/llvm/test/Transforms/LoopFusion/triple_loop_nest_inner_guard.ll b/llvm/test/Transforms/LoopFusion/triple_loop_nest_inner_guard.ll
index 2ad211685aa47..b2bcdf1679979 100644
--- a/llvm/test/Transforms/LoopFusion/triple_loop_nest_inner_guard.ll
+++ b/llvm/test/Transforms/LoopFusion/triple_loop_nest_inner_guard.ll
@@ -1,3 +1,4 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
 ; RUN: opt -S -passes=loop-fusion < %s 2>&1 | FileCheck %s
 
 ; Verify that LoopFusion can fuse two triple-loop nests with guarded inner
@@ -7,25 +8,12 @@
 @b = common global [10 x [10 x [10 x i32]]] zeroinitializer
 @c = common global [10 x [10 x [10 x i32]]] zeroinitializer
 
-; CHECK-LABEL: @triple_loop_nest_inner_guard
-; CHECK: br i1 %{{.*}}, label %[[OUTER_PH:outer1.ph]], label %[[FUNC_EXIT:func_exit]]
 
-; CHECK: [[OUTER_PH]]:
-; CHECK: br label %[[OUTER_BODY_MIDDLE_GUARD:outer1.body.middle1.guard]]
 
-; CHECK: [[OUTER_BODY_MIDDLE_GUARD]]:
-; CHECK: br i1 %{{.*}}, label %[[MIDDLE_PH:middle1.ph]], label %[[OUTER_LATCH:outer2.latch]]
 
-; CHECK: [[MIDDLE_PH]]:
-; CHECK-NEXT: br label %[[MIDDLE_BODY_INNER_GUARD:middle1.body.inner1.guard]]
 
-; CHECK: [[MIDDLE_BODY_INNER_GUARD]]:
-; CHECK: br i1 %{{.*}}, label %[[INNER_PH:inner1.ph]], label %[[MIDDLE_LATCH:middle2.latch]]
 
-; CHECK: [[INNER_PH]]:
-; CHECK-NEXT: br label %[[INNER_BODY:inner1.body]]
 
-; CHECK: [[INNER_BODY]]:
 ; First loop body.
 ; CHECK: load
 ; CHECK: add
@@ -34,27 +22,77 @@
 ; CHECK: load
 ; CHECK: mul
 ; CHECK: store
-; CHECK: br i1 %{{.*}}, label %[[INNER_EXIT:inner2.exit]], label %[[INNER_BODY:inner1.body]]
 
-; CHECK: [[INNER_EXIT]]:
-; CHECK-NEXT: br label %[[MIDDLE_LATCH:middle2.latch]]
 
-; CHECK: [[MIDDLE_LATCH]]:
-; CHECK: br i1 %{{.*}}, label %[[MIDDLE_EXIT:middle2.exit]], label %[[MIDDLE_BODY_INNER_GUARD]]
 
-; CHECK: [[MIDDLE_EXIT]]:
-; CHECK-NEXT: br label %[[OUTER_LATCH:outer2.latch]]
 
-; CHECK: [[OUTER_LATCH]]:
-; CHECK: br i1 %{{.*}}, label %[[OUTER_EXIT:outer2.exit]], label %[[OUTER_BODY_MIDDLE_GUARD]]
 
-; CHECK: [[OUTER_EXIT]]:
-; CHECK-NEXT: br label %[[FUNC_EXIT:func_exit]]
 
-; CHECK: [[FUNC_EXIT]]:
-; CHECK-NEXT: ret
 
 define i32 @triple_loop_nest_inner_guard(i32 %m, i32 %n, i32 %M, i32 %N) {
+; CHECK-LABEL: define i32 @triple_loop_nest_inner_guard(
+; CHECK-SAME: i32 [[M:%.*]], i32 [[N:%.*]], i32 [[M:%.*]], i32 [[N:%.*]]) {
+; CHECK-NEXT:  [[ENTRY:.*:]]
+; CHECK-NEXT:    [[CMP101:%.*]] = icmp sgt i32 [[M]], 0
+; CHECK-NEXT:    br i1 [[CMP101]], label %[[OUTER1_PH:.*]], label %[[FUNC_EXIT:.*]]
+; CHECK:       [[OUTER1_PH]]:
+; CHECK-NEXT:    [[CMP298:%.*]] = icmp sgt i32 [[N]], 0
+; CHECK-NEXT:    [[CMP696:%.*]] = icmp sgt i32 [[M]], 0
+; CHECK-NEXT:    [[WIDE_TRIP_COUNT122:%.*]] = zext i32 [[M]] to i64
+; CHECK-NEXT:    [[WIDE_TRIP_COUNT118:%.*]] = zext i32 [[N]] to i64
+; CHECK-NEXT:    [[WIDE_TRIP_COUNT114:%.*]] = zext i32 [[M]] to i64
+; CHECK-NEXT:    br label %[[OUTER1_BODY_MIDDLE1_GUARD:.*]]
+; CHECK:       [[OUTER1_BODY_MIDDLE1_GUARD]]:
+; CHECK-NEXT:    [[IV120:%.*]] = phi i64 [ 0, %[[OUTER1_PH]] ], [ [[IV_NEXT121:%.*]], %[[OUTER2_LATCH:.*]] ]
+; CHECK-NEXT:    [[IV108:%.*]] = phi i64 [ [[IV_NEXT109:%.*]], %[[OUTER2_LATCH]] ], [ 0, %[[OUTER1_PH]] ]
+; CHECK-NEXT:    br i1 [[CMP298]], label %[[MIDDLE1_PH:.*]], label %[[OUTER2_LATCH]]
+; CHECK:       [[MIDDLE1_PH]]:
+; CHECK-NEXT:    br label %[[MIDDLE1_BODY_INNER1_GUARD:.*]]
+; CHECK:       [[MIDDLE1_BODY_INNER1_GUARD]]:
+; CHECK-NEXT:    [[IV116:%.*]] = phi i64 [ [[IV_NEXT117:%.*]], %[[MIDDLE2_LATCH:.*]] ], [ 0, %[[MIDDLE1_PH]] ]
+; CHECK-NEXT:    [[IV104:%.*]] = phi i64 [ [[IV_NEXT105:%.*]], %[[MIDDLE2_LATCH]] ], [ 0, %[[MIDDLE1_PH]] ]
+; CHECK-NEXT:    br i1 [[CMP696]], label %[[INNER1_PH:.*]], label %[[MIDDLE2_LATCH]]
+; CHECK:       [[INNER1_PH]]:
+; CHECK-NEXT:    br label %[[INNER1_BODY:.*]]
+; CHECK:       [[INNER1_BODY]]:
+; CHECK-NEXT:    [[IV112:%.*]] = phi i64 [ [[IV_NEXT113:%.*]], %[[INNER1_BODY]] ], [ 0, %[[INNER1_PH]] ]
+; CHECK-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[INNER1_BODY]] ], [ 0, %[[INNER1_PH]] ]
+; CHECK-NEXT:    [[IDX12:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @a, i64 0, i64 [[IV120]], i64 [[IV116]], i64 [[IV112]]
+; CHECK-NEXT:    [[TMP0:%.*]] = load i32, ptr [[IDX12]], align 4
+; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 [[TMP0]], 2
+; CHECK-NEXT:    [[IDX18:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @b, i64 0, i64 [[IV120]], i64 [[IV116]], i64 [[IV112]]
+; CHECK-NEXT:    store i32 [[ADD]], ptr [[IDX18]], align 4
+; CHECK-NEXT:    [[IV_NEXT113]] = add nuw nsw i64 [[IV112]], 1
+; CHECK-NEXT:    [[EXITCOND115:%.*]] = icmp eq i64 [[IV_NEXT113]], [[WIDE_TRIP_COUNT114]]
+; CHECK-NEXT:    [[IDX45:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @a, i64 0, i64 [[IV108]], i64 [[IV104]], i64 [[IV]]
+; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[IDX45]], align 4
+; CHECK-NEXT:    [[MUL:%.*]] = shl nsw i32 [[TMP1]], 1
+; CHECK-NEXT:    [[IDX51:%.*]] = getelementptr inbounds [10 x [10 x [10 x i32]]], ptr @c, i64 0, i64 [[IV108]], i64 [[IV104]], i64 [[IV]]
+; CHECK-NEXT:    store i32 [[MUL]], ptr [[IDX51]], align 4
+; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
+; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i64 [[IV_NEXT]], [[WIDE_TRIP_COUNT114]]
+; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[INNER2_EXIT:.*]], label %[[INNER1_BODY]]
+; CHECK:       [[INNER2_EXIT]]:
+; CHECK-NEXT:    br label %[[MIDDLE2_LATCH]]
+; CHECK:       [[MIDDLE2_LATCH]]:
+; CHECK-NEXT:    [[IV_NEXT117]] = add nuw nsw i64 [[IV116]], 1
+; CHECK-NEXT:    [[EXITCOND119:%.*]] = icmp eq i64 [[IV_NEXT117]], [[WIDE_TRIP_COUNT118]]
+; CHECK-NEXT:    [[IV_NEXT105]] = add nuw nsw i64 [[IV104]], 1
+; CHECK-NEXT:    [[EXITCOND107:%.*]] = icmp eq i64 [[IV_NEXT105]], [[WIDE_TRIP_COUNT118]]
+; CHECK-NEXT:    br i1 [[EXITCOND107]], label %[[MIDDLE2_EXIT:.*]], label %[[MIDDLE1_BODY_INNER1_GUARD]]
+; CHECK:       [[MIDDLE2_EXIT]]:
+; CHECK-NEXT:    br label %[[OUTER2_LATCH]]
+; CHECK:       [[OUTER2_LATCH]]:
+; CHECK-NEXT:    [[IV_NEXT121]] = add nuw nsw i64 [[IV120]], 1
+; CHECK-NEXT:    [[EXITCOND123:%.*]] = icmp eq i64 [[IV_NEXT121]], [[WIDE_TRIP_COUNT122]]
+; CHECK-NEXT:    [[IV_NEXT109]] = add nuw nsw i64 [[IV108]], 1
+; CHECK-NEXT:    [[EXITCOND111:%.*]] = icmp eq i64 [[IV_NEXT109]], [[WIDE_TRIP_COUNT122]]
+; CHECK-NEXT:    br i1 [[EXITCOND111]], label %[[OUTER2_EXIT:.*]], label %[[OUTER1_BODY_MIDDLE1_GUARD]]
+; CHECK:       [[OUTER2_EXIT]]:
+; CHECK-NEXT:    br label %[[FUNC_EXIT]]
+; CHECK:       [[FUNC_EXIT]]:
+; CHECK-NEXT:    ret i32 undef
+;
 entry:
   %cmp101 = icmp sgt i32 %m, 0
   br i1 %cmp101, label %outer1.ph, label %func_exit



More information about the llvm-commits mailing list