[llvm] [EarlyIfConversion] Extend data dependent analysis across multiple blocks (PR #180623)

Jonathan Cohen via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 4 12:52:50 PDT 2026


https://github.com/jcohen-apple updated https://github.com/llvm/llvm-project/pull/180623

>From bbad62e632bd5ebbe1eced9b4ec556299c7ff6a2 Mon Sep 17 00:00:00 2001
From: Jonathan Cohen <joncoh at apple.com>
Date: Sun, 8 Feb 2026 21:17:56 +0200
Subject: [PATCH 1/4] Unit tests demonstrating current behavior

---
 .../AArch64/early-ifcvt-load-to-cond-br.mir   | 378 ++++++++++++++++++
 1 file changed, 378 insertions(+)

diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
index ba37de47e6b64..04c3bc03cbbdb 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
@@ -48,6 +48,21 @@
   define i32 @call_between_load_and_branch(ptr %p, i32 %x, i32 %y) {
     ret i32 0
   }
+  define i32 @load_cond_and_branch_pred_bb(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_cond_and_branch_pred_bb_with_call(ptr %p, i32%x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_pred_call_in_head(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_loop_not_immediate_pred(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_loop_call_in_intermediate_block(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
   declare void @foo()
 ...
 ---
@@ -981,3 +996,366 @@ body:             |
     %7:gpr32 = PHI %1, %bb.0, %6, %bb.1
     $w0 = COPY %7
     RET_ReallyLR implicit $w0
+...
+---
+name:            load_cond_and_branch_pred_bb
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_cond_and_branch_pred_bb
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.3, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr1]], %bb.2
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.3, implicit $nzcv
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    %5:gpr32 = MADDWrrr %1, %2, $wzr
+    %6:gpr32 = MADDWrrr %5, %1, $wzr
+
+  bb.3:
+    %7:gpr32 = PHI %1, %bb.1, %6, %bb.2
+    $w0 = COPY %7
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_cond_and_branch_pred_bb_with_call
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_cond_and_branch_pred_bb_with_call
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.3, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr1]], %bb.2
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    BL @foo, implicit-def $lr
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.3, implicit $nzcv
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    %5:gpr32 = MADDWrrr %1, %2, $wzr
+    %6:gpr32 = MADDWrrr %5, %1, $wzr
+
+  bb.3:
+    %7:gpr32 = PHI %1, %bb.1, %6, %bb.2
+    $w0 = COPY %7
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_pred_call_in_head
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_in_pred_call_in_head
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.3, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr1]], %bb.2
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    BL @foo, implicit-def $lr
+    %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.3, implicit $nzcv
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    %5:gpr32 = MADDWrrr %1, %2, $wzr
+    %6:gpr32 = MADDWrrr %5, %1, $wzr
+
+  bb.3:
+    %7:gpr32 = PHI %1, %bb.1, %6, %bb.2
+    $w0 = COPY %7
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_loop_not_immediate_pred
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_in_loop_not_immediate_pred
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.3
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.5
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.2:
+    successors: %bb.3(0x40000000), %bb.4(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.4, implicit $nzcv
+    B %bb.3
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.4:
+    successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+
+    %8:gpr32sp = PHI %1, %bb.2, %7, %bb.3
+    %9:gpr32 = SUBSWri %8, 0, 0, implicit-def $nzcv
+    Bcc 12, %bb.1, implicit $nzcv
+    B %bb.5
+
+  bb.5:
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_loop_call_in_intermediate_block
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_in_loop_call_in_intermediate_block
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x7c000000), %bb.6(0x04000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.6
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    BL @foo, implicit-def $lr
+    %4:gpr32common = ADDWri %3, 1, 0
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.5:
+    successors: %bb.1(0x7c000000), %bb.6(0x04000000)
+
+    %8:gpr32sp = PHI %1, %bb.3, %7, %bb.4
+    %9:gpr32 = SUBSWri %8, 0, 0, implicit-def $nzcv
+    Bcc 12, %bb.1, implicit $nzcv
+    B %bb.6
+
+  bb.6:
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0

>From 50d6a73b1e3458edc560624316bc52a7436d2399 Mon Sep 17 00:00:00 2001
From: Jonathan Cohen <joncoh at apple.com>
Date: Mon, 16 Mar 2026 10:20:08 +0200
Subject: [PATCH 2/4] [EarlyIfConversion] Extend data dependent analysis to
 multiple blocks

---
 llvm/lib/CodeGen/EarlyIfConversion.cpp        | 132 +++++--
 .../AArch64/early-ifcvt-load-to-cond-br.mir   | 360 +++++++++++++-----
 2 files changed, 365 insertions(+), 127 deletions(-)

diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp
index c1e82ec4e9569..b0a6bb87bac30 100644
--- a/llvm/lib/CodeGen/EarlyIfConversion.cpp
+++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp
@@ -23,6 +23,7 @@
 #include "llvm/ADT/SparseSet.h"
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
+#include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
 #include "llvm/CodeGen/MachineDominators.h"
 #include "llvm/CodeGen/MachineFunction.h"
@@ -43,6 +44,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/raw_ostream.h"
+#include <cstddef>
 
 using namespace llvm;
 
@@ -830,6 +832,9 @@ class EarlyIfConverter {
   MachineBranchProbabilityInfo *MBPI = nullptr;
   SSAIfConv IfConv;
 
+  /// Cache of basic blocks verified to contain no call instructions.
+  SmallPtrSet<const MachineBasicBlock *, 16> NoCallBlocksCache;
+
 public:
   EarlyIfConverter(MachineDominatorTree &DT, MachineLoopInfo &LI,
                    MachineTraceMetrics &MTM, MachineBranchProbabilityInfo *MBPI)
@@ -843,7 +848,11 @@ class EarlyIfConverter {
   void invalidateTraces();
   bool shouldConvertIf();
   bool isConditionDataDependent();
-  bool doOperandsComeFromMemory(Register Reg);
+  bool doOperandsComeFromMemory(Register Reg, const MachineInstr *ConditionDef);
+  bool callInPath(
+      const MachineInstr *From, const MachineInstr *To,
+      const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks,
+      unsigned MaxInstructions = 64);
 };
 
 class EarlyIfConverterLegacy : public MachineFunctionPass {
@@ -925,15 +934,62 @@ static bool isConstantPoolLoad(const MachineInstr *MI) {
          });
 }
 
-/// Check if there are any calls in the range (From, To].
-static bool callInRange(const MachineInstr *From, const MachineInstr *To) {
-  constexpr int MaxInstructionsToCheck = 64;
-  int Count = 0;
-  auto InstrRange =
-      make_range(std::next(From->getIterator()), To->getIterator());
-  return any_of(InstrRange, [&](const MachineInstr &MI) {
-    return ++Count > MaxInstructionsToCheck || MI.isCall();
-  });
+/// Check if there are any calls in the path from From to To, potentially
+/// spanning multiple basic blocks. The IntermediateBlocks set contains
+/// blocks that are between From's block and To's block in the control flow.
+///
+/// Checks:
+/// - If same block: (From, To)
+/// - If different blocks:
+///   - (From, end of From's block]
+///   - All instructions in IntermediateBlocks
+///   - [start of To's block, To)
+///
+/// Returns true if a call is found or if the path exceeds MaxInstructions.
+/// Uses NoCallBlocksCache to skip blocks already verified to have no calls.
+bool EarlyIfConverter::callInPath(
+    const MachineInstr *From, const MachineInstr *To,
+    const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks,
+    unsigned MaxInstructions /* = 64 */) {
+  if (From == To)
+    return false;
+
+  unsigned Count = 0;
+  const MachineBasicBlock *FromBB = From->getParent();
+  const MachineBasicBlock *ToBB = To->getParent();
+
+  // Helper to check if instruction limit exceeded or call found.
+  auto CheckInstrIsCall = [&](const MachineInstr &MI) {
+    return ++Count > MaxInstructions || MI.isCall();
+  };
+
+  // If From and To are in the same block, just check (From, To).
+  if (FromBB == ToBB)
+    return llvm::any_of(
+        llvm::make_range(std::next(From->getIterator()), To->getIterator()),
+        CheckInstrIsCall);
+
+  // Check (From, end of From's block].
+  if (any_of(
+          llvm::make_range(std::next(From->getIterator()), FromBB->instr_end()),
+          CheckInstrIsCall))
+    return true;
+
+  // Check all intermediate blocks entirely.
+  // Use cache to skip blocks already verified to have no calls.
+  for (const MachineBasicBlock *BB : IntermediateBlocks) {
+    if (BB == FromBB || BB == ToBB)
+      continue;
+    if (NoCallBlocksCache.contains(BB))
+      continue;
+    if (any_of(*BB, CheckInstrIsCall))
+      return true;
+    NoCallBlocksCache.insert(BB);
+  }
+
+  // Check [start of To's block, To).
+  return any_of(llvm::make_range(ToBB->instr_begin(), To->getIterator()),
+                CheckInstrIsCall);
 }
 
 /// Check if a register's value comes from a memory load by walking the
@@ -942,14 +998,22 @@ static bool callInRange(const MachineInstr *From, const MachineInstr *To) {
 /// or come from a constant pool). Only consider loads that are in the
 /// same basic block as the branch to ensure the load is "immediately"
 /// before the branch in program time.
-bool EarlyIfConverter::doOperandsComeFromMemory(Register Reg) {
+bool EarlyIfConverter::doOperandsComeFromMemory(
+    Register Reg, const MachineInstr *ConditionDef) {
   if (!Reg.isVirtual())
     return false;
 
+  LLVM_DEBUG(dbgs() << "  doOperandsComeFromMemory starting from reg "
+                    << printReg(Reg) << "\n");
+
+  // The condition is consumed by the branch terminating Head, so this is the
+  // end of the interval a load has to survive without a call in between.
+  const MachineInstr *Br = &*IfConv.Head->getFirstTerminator();
+
   // Walk the def-use chain.
   SmallPtrSet<const MachineInstr *, 8> VisitedInstrs;
+  SmallPtrSet<const MachineBasicBlock *, 8> VisitedBlocks;
   SmallVector<const MachineInstr *> Worklist;
-  SmallVector<Register, 16> VisitedRegs;
 
   MachineInstr *DefMI = MRI->getVRegDef(Reg);
   // The operand is defined outside of the function - it does not
@@ -958,24 +1022,46 @@ bool EarlyIfConverter::doOperandsComeFromMemory(Register Reg) {
     return false;
 
   Worklist.push_back(DefMI);
-  VisitedRegs.push_back(Reg);
 
   while (!Worklist.empty() && VisitedInstrs.size() < MaxNumSteps) {
     const MachineInstr *MI = Worklist.pop_back_val();
     if (!VisitedInstrs.insert(MI).second)
       continue;
 
-    // Stop walking if we encounter an instruction outside the head block.
-    if (MI->getParent() != IfConv.Head)
-      break;
+    // Don't walk through PHIs: a value arriving on a back edge is loaded in a
+    // previous iteration, so the interval between the load and the branch is
+    // not the one callInPath measures.
+    if (MI->isPHI())
+      continue;
+
+    // Stop walking if we encounter an instruction outside the loop.
+    // For blocks in the same loop, we continue to walk the def-use chain
+    // to find loads, regardless of whether they're immediate predecessors.
+    const MachineBasicBlock *Parent = MI->getParent();
+    MachineLoop *IfConvLoop = Loops->getLoopFor(IfConv.Head);
+    MachineLoop *ParentLoop = Loops->getLoopFor(Parent);
+
+    // If the instruction is outside the loop, skip it (loop-invariant).
+    if (IfConvLoop && ParentLoop != IfConvLoop)
+      continue;
+
+    // Track visited blocks for call checking later.
+    VisitedBlocks.insert(Parent);
 
     // Check if this instruction is a load, and there are no calls between
-    // the load and the branch (which would break the "close in time"
+    // the load and the condition (which would break the "close in time"
     // assumption).
     if (MI->mayLoad() && !isConstantPoolLoad(MI) &&
-        !MI->isDereferenceableInvariantLoad() &&
-        !callInRange(MI, &*IfConv.Head->getFirstTerminator()))
+        !MI->isDereferenceableInvariantLoad()) {
+      // If the load doesn't dominate the condition (e.g., comes after it in
+      // the same block via a loop back-edge), it can't affect this iteration.
+      // If not - check if there is a call between the load instruction and
+      // ConditionDef.
+      if (!DomTree->dominates(MI, Br) || callInPath(MI, Br, VisitedBlocks))
+        continue;
+
       return true;
+    }
 
     // Walk through all register use operands and find their definitions.
     for (const MachineOperand &MO : MI->operands()) {
@@ -988,7 +1074,6 @@ bool EarlyIfConverter::doOperandsComeFromMemory(Register Reg) {
       if (MachineInstr *UseDef = MRI->getVRegDef(UseReg)) {
         if (!VisitedInstrs.count(UseDef)) {
           Worklist.push_back(UseDef);
-          VisitedRegs.push_back(UseReg);
         }
       }
     }
@@ -1019,7 +1104,8 @@ bool EarlyIfConverter::isConditionDataDependent() {
   // Check if operands used to compute the branch condition were loaded recently
   // from memory, starting by the ConditionDef itself and walking up the use-def
   // chain.
-  if (doOperandsComeFromMemory(MBP.ConditionDef->getOperand(0).getReg())) {
+  if (doOperandsComeFromMemory(MBP.ConditionDef->getOperand(0).getReg(),
+                               MBP.ConditionDef)) {
     ++NumDataDependant;
     return true;
   }
@@ -1270,8 +1356,10 @@ bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
     Changed = true;
     updateDomTree(DomTree, IfConv, RemoveBlocks);
     updateLoops(Loops, RemoveBlocks);
-    for (MachineBasicBlock *MBB : RemoveBlocks)
+    for (MachineBasicBlock *MBB : RemoveBlocks) {
+      NoCallBlocksCache.erase(MBB);
       MBB->eraseFromParent();
+    }
   }
   return Changed;
 }
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
index 04c3bc03cbbdb..cd29ca1b12010 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
@@ -63,6 +63,9 @@
   define i32 @load_in_loop_call_in_intermediate_block(ptr %p, i32 %x, i32 %y) {
     ret i32 0
   }
+  define i32 @load_to_cond_in_backedge(ptr %p) {
+    ret i32 0
+  }
   declare void @foo()
 ...
 ---
@@ -868,44 +871,73 @@ name:            load_branch_separate_bbs_in_loop
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-COMMON-LABEL: name: load_branch_separate_bbs_in_loop
-  ; CHECK-COMMON: bb.0:
-  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.1:
-  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.2:
-  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
-  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.4, implicit $nzcv
-  ; CHECK-COMMON-NEXT:   B %bb.3
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.3:
-  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.4:
-  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
-  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
-  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.1, implicit $nzcv
-  ; CHECK-COMMON-NEXT:   B %bb.5
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.5:
-  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DEFAULT-LABEL: name: load_branch_separate_bbs_in_loop
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.5
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_branch_separate_bbs_in_loop
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32common = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[CSELWr]], 0, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.5
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -1002,34 +1034,53 @@ name:            load_cond_and_branch_pred_bb
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-COMMON-LABEL: name: load_cond_and_branch_pred_bb
-  ; CHECK-COMMON: bb.0:
-  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT:   B %bb.1
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.1:
-  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
-  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.3, implicit $nzcv
-  ; CHECK-COMMON-NEXT:   B %bb.2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.2:
-  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.3:
-  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr1]], %bb.2
-  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DEFAULT-LABEL: name: load_cond_and_branch_pred_bb
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   B %bb.1
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.3, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr1]], %bb.2
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_cond_and_branch_pred_bb
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.1
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -1189,45 +1240,75 @@ name:            load_in_loop_not_immediate_pred
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-COMMON-LABEL: name: load_in_loop_not_immediate_pred
-  ; CHECK-COMMON: bb.0:
-  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.1:
-  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.2:
-  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.4, implicit $nzcv
-  ; CHECK-COMMON-NEXT:   B %bb.3
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.3:
-  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.4:
-  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
-  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
-  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.1, implicit $nzcv
-  ; CHECK-COMMON-NEXT:   B %bb.5
-  ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT: bb.5:
-  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DEFAULT-LABEL: name: load_in_loop_not_immediate_pred
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.5
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_loop_not_immediate_pred
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x7c000000), %bb.5(0x04000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32common = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[CSELWr]], 0, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.5
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -1359,3 +1440,72 @@ body:             |
   bb.6:
     $w0 = COPY %8
     RET_ReallyLR implicit $w0
+...
+---
+name:            load_to_cond_in_backedge
+alignment:       4
+tracksRegLiveness: true
+registers:
+  - { id: 0, class: gpr64sp }
+  - { id: 1, class: gpr32 }
+  - { id: 2, class: gpr32 }
+  - { id: 3, class: gpr64 }
+  - { id: 4, class: gpr32 }
+  - { id: 5, class: gpr32all }
+  - { id: 6, class: gpr32 }
+body:             |
+  ; CHECK-COMMON-LABEL: name: load_to_cond_in_backedge
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[DEF:%[0-9]+]]:gpr32 = IMPLICIT_DEF
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x04000000), %bb.1(0x7c000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI undef [[DEF]], %bb.0, %5, %bb.1
+  ; CHECK-COMMON-NEXT:   [[LDRHHroW:%[0-9]+]]:gpr32 = LDRHHroW undef [[COPY]], undef [[PHI]], 0, 1 :: (load (s16))
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32all = COPY [[LDRHHroW]]
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY [[COPY1]]
+  ; CHECK-COMMON-NEXT:   Bcc 1, %bb.1, implicit undef $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.5
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0
+
+    %0:gpr64sp = COPY $x0
+    %1:gpr32 = IMPLICIT_DEF
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %2:gpr32 = PHI undef %1, %bb.0, %5, %bb.4
+    %4:gpr32 = LDRHHroW undef %0, undef %2, 0, 1 :: (load (s16))
+    %5:gpr32all = COPY %4
+    TBNZW undef %2, 0, %bb.3
+    B %bb.2
+
+  bb.2:
+    successors: %bb.4(0x80000000)
+
+    B %bb.4
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+  bb.4:
+    successors: %bb.5(0x04000000), %bb.1(0x7c000000)
+
+    %6:gpr32 = PHI undef %5, %bb.3, undef %5, %bb.2
+    Bcc 1, %bb.1, implicit undef $nzcv
+    B %bb.5
+
+  bb.5:
+    RET_ReallyLR

>From e7fd9a55b3e81562357596d10799ee67ecfaec4c Mon Sep 17 00:00:00 2001
From: Jonathan Cohen <joncoh at apple.com>
Date: Tue, 4 Aug 2026 09:38:58 +0300
Subject: [PATCH 3/4] [EarlyIfConversion] Add additional tests for calls
 between a load and its branch

All of these tests convert with the current analysis, but they shouldn't. The existing `callInRange` check only checked blocks that contain the use-def chain leading to the condition, but nothing else.

The following commit fixes the analysis, which will then prevent conversion of these cases, while keeping those which we do care about.
---
 llvm/lib/CodeGen/EarlyIfConversion.cpp        |   17 +-
 .../early-ifcvt-load-to-cond-br-limit.mir     |  191 +++
 .../AArch64/early-ifcvt-load-to-cond-br.mir   | 1305 ++++++++++++++++-
 3 files changed, 1505 insertions(+), 8 deletions(-)
 create mode 100644 llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir

diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp
index b0a6bb87bac30..378e2a0bc6534 100644
--- a/llvm/lib/CodeGen/EarlyIfConversion.cpp
+++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp
@@ -72,6 +72,13 @@ static cl::opt<unsigned>
                 cl::desc("Limit the number of steps taken when searching for a "
                          "recently loaded value"));
 
+// Limit the work done when looking for calls between a load and the condition
+// it feeds.
+static cl::opt<unsigned> MaxRegionInstrs(
+    "early-ifcvt-max-region-instrs", cl::Hidden, cl::init(64),
+    cl::desc("Limit the number of blocks and instructions examined when "
+             "searching for calls between a load and the condition it feeds"));
+
 STATISTIC(NumDiamondsSeen,  "Number of diamonds");
 STATISTIC(NumDiamondsConv,  "Number of diamonds converted");
 STATISTIC(NumTrianglesSeen, "Number of triangles");
@@ -851,8 +858,7 @@ class EarlyIfConverter {
   bool doOperandsComeFromMemory(Register Reg, const MachineInstr *ConditionDef);
   bool callInPath(
       const MachineInstr *From, const MachineInstr *To,
-      const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks,
-      unsigned MaxInstructions = 64);
+      const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks);
 };
 
 class EarlyIfConverterLegacy : public MachineFunctionPass {
@@ -945,12 +951,11 @@ static bool isConstantPoolLoad(const MachineInstr *MI) {
 ///   - All instructions in IntermediateBlocks
 ///   - [start of To's block, To)
 ///
-/// Returns true if a call is found or if the path exceeds MaxInstructions.
+/// Returns true if a call is found or if the path exceeds MaxRegionInstrs.
 /// Uses NoCallBlocksCache to skip blocks already verified to have no calls.
 bool EarlyIfConverter::callInPath(
     const MachineInstr *From, const MachineInstr *To,
-    const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks,
-    unsigned MaxInstructions /* = 64 */) {
+    const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks) {
   if (From == To)
     return false;
 
@@ -960,7 +965,7 @@ bool EarlyIfConverter::callInPath(
 
   // Helper to check if instruction limit exceeded or call found.
   auto CheckInstrIsCall = [&](const MachineInstr &MI) {
-    return ++Count > MaxInstructions || MI.isCall();
+    return ++Count > MaxRegionInstrs || MI.isCall();
   };
 
   // If From and To are in the same block, just check (From, To).
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
new file mode 100644
index 0000000000000..7fa516fe918c3
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
@@ -0,0 +1,191 @@
+# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
+# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -verify-machine-dom-info -o - %s | FileCheck %s --check-prefix=CHECK-DEFAULT
+# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -early-ifcvt-max-region-instrs=3 -verify-machine-dom-info -o - %s | FileCheck %s --check-prefix=CHECK-SMALL-BUDGET
+# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -verify-machine-dom-info -o - %s | FileCheck %s --check-prefix=CHECK-LARGE-BUDGET
+
+--- |
+  define i32 @load_in_pred_region_over_instruction_budget(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+...
+---
+name:            load_in_pred_region_over_instruction_budget
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_region_over_instruction_budget
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 0 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 1 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 2 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 3 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 4 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   STRWui $wzr, [[COPY]], 5 :: (store (s32))
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-SMALL-BUDGET-LABEL: name: load_in_pred_region_over_instruction_budget
+  ; CHECK-SMALL-BUDGET: bb.0:
+  ; CHECK-SMALL-BUDGET-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-SMALL-BUDGET-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-SMALL-BUDGET-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-SMALL-BUDGET-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT: bb.1:
+  ; CHECK-SMALL-BUDGET-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-SMALL-BUDGET-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-SMALL-BUDGET-NEXT:   B %bb.3
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT: bb.2:
+  ; CHECK-SMALL-BUDGET-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 0 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 1 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 2 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 3 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 4 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 5 :: (store (s32))
+  ; CHECK-SMALL-BUDGET-NEXT:   B %bb.3
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT: bb.3:
+  ; CHECK-SMALL-BUDGET-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-SMALL-BUDGET-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-SMALL-BUDGET-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-SMALL-BUDGET-NEXT:   B %bb.4
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT: bb.4:
+  ; CHECK-SMALL-BUDGET-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-SMALL-BUDGET-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-SMALL-BUDGET-NEXT: {{  $}}
+  ; CHECK-SMALL-BUDGET-NEXT: bb.5:
+  ; CHECK-SMALL-BUDGET-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-SMALL-BUDGET-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-SMALL-BUDGET-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-LARGE-BUDGET-LABEL: name: load_in_pred_region_over_instruction_budget
+  ; CHECK-LARGE-BUDGET: bb.0:
+  ; CHECK-LARGE-BUDGET-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-LARGE-BUDGET-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-LARGE-BUDGET-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-LARGE-BUDGET-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT: bb.1:
+  ; CHECK-LARGE-BUDGET-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-LARGE-BUDGET-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-LARGE-BUDGET-NEXT:   B %bb.3
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT: bb.2:
+  ; CHECK-LARGE-BUDGET-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 0 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 1 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 2 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 3 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 4 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   STRWui $wzr, [[COPY]], 5 :: (store (s32))
+  ; CHECK-LARGE-BUDGET-NEXT:   B %bb.3
+  ; CHECK-LARGE-BUDGET-NEXT: {{  $}}
+  ; CHECK-LARGE-BUDGET-NEXT: bb.3:
+  ; CHECK-LARGE-BUDGET-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-LARGE-BUDGET-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-LARGE-BUDGET-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-LARGE-BUDGET-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-LARGE-BUDGET-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-LARGE-BUDGET-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-LARGE-BUDGET-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %9:gpr32 = SUBSWri %3, 0, 0, implicit-def $nzcv
+    Bcc 0, %bb.2, implicit $nzcv
+    B %bb.3
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    STRWui $wzr, %0, 0 :: (store (s32))
+    STRWui $wzr, %0, 1 :: (store (s32))
+    STRWui $wzr, %0, 2 :: (store (s32))
+    STRWui $wzr, %0, 3 :: (store (s32))
+    STRWui $wzr, %0, 4 :: (store (s32))
+    STRWui $wzr, %0, 5 :: (store (s32))
+    B %bb.3
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.5:
+    %8:gpr32 = PHI %1, %bb.3, %7, %bb.4
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
index cd29ca1b12010..d2698f75c64c9 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
@@ -1,6 +1,6 @@
 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
-# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DEFAULT
-# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DATA-DEPENDENT
+# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -verify-machine-dom-info -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DEFAULT
+# RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -verify-machine-dom-info -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DATA-DEPENDENT
 
 --- |
   define i32 @arg_to_cond_branch(i32 %val, i32 %x, i32 %y) {
@@ -66,6 +66,39 @@
   define i32 @load_to_cond_in_backedge(ptr %p) {
     ret i32 0
   }
+  define i32 @load_in_pred_call_in_empty_intermediate_block(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_pred_diamond_call_in_one_arm(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_pred_call_on_unreachable_path(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @call_in_block_with_early_exit_before_condition(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @call_in_block_before_load(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_pred_call_in_block_behind_load(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @load_in_pred_call_in_chained_diamond_arm(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @call_between_load_and_cbz(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @cbz_cond_def_in_pred_call_in_head(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @call_before_load_carried_by_phi(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
+  define i32 @two_regions_share_call_block(ptr %p, i32 %x, i32 %y) {
+    ret i32 0
+  }
   declare void @foo()
 ...
 ---
@@ -1509,3 +1542,1271 @@ body:             |
 
   bb.5:
     RET_ReallyLR
+...
+---
+name:            load_in_pred_call_in_empty_intermediate_block
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_empty_intermediate_block
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.6:
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_empty_intermediate_block
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32common = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.6:
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    BL @foo, implicit-def $lr
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.5:
+    successors: %bb.6(0x80000000)
+
+    %8:gpr32sp = PHI %1, %bb.3, %7, %bb.4
+
+  bb.6:
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_pred_diamond_call_in_one_arm
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_diamond_call_in_one_arm
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.6, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.5
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.6:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_diamond_call_in_one_arm
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %10:gpr32 = SUBSWri %3, 0, 0, implicit-def $nzcv
+    Bcc 0, %bb.2, implicit $nzcv
+    B %bb.3
+
+  bb.2:
+    successors: %bb.4(0x80000000)
+
+    BL @foo, implicit-def $lr
+    B %bb.4
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x40000000), %bb.6(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.6, implicit $nzcv
+    B %bb.5
+
+  bb.5:
+    successors: %bb.6(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.6:
+    %8:gpr32 = PHI %1, %bb.4, %7, %bb.5
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_pred_call_on_unreachable_path
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_on_unreachable_path
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors:
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   BRK 1
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_on_unreachable_path
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors:
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   BRK 1
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %10:gpr32 = SUBSWri %3, 0, 0, implicit-def $nzcv
+    Bcc 0, %bb.2, implicit $nzcv
+    B %bb.3
+
+  bb.2:
+    successors:
+
+    BL @foo, implicit-def $lr
+    BRK 1
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.5:
+    %8:gpr32 = PHI %1, %bb.3, %7, %bb.4
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            call_in_block_with_early_exit_before_condition
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: call_in_block_with_early_exit_before_condition
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[COPY1]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: call_in_block_with_early_exit_before_condition
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[COPY1]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    BL @foo, implicit-def $lr
+    %10:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
+    Bcc 0, %bb.2, implicit $nzcv
+    B %bb.3
+
+  bb.2:
+    $w0 = COPY %1
+    RET_ReallyLR implicit $w0
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.5:
+    %8:gpr32 = PHI %1, %bb.3, %7, %bb.4
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            call_in_block_before_load
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: call_in_block_before_load
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: call_in_block_before_load
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    BL @foo, implicit-def $lr
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.2:
+    successors: %bb.3(0x40000000), %bb.4(0x40000000)
+
+    %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.4, implicit $nzcv
+    B %bb.3
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+    %5:gpr32 = MADDWrrr %1, %2, $wzr
+    %6:gpr32 = MADDWrrr %5, %1, $wzr
+
+  bb.4:
+    %7:gpr32 = PHI %1, %bb.2, %6, %bb.3
+    $w0 = COPY %7
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_pred_call_in_block_behind_load
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_block_behind_load
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT:   B %bb.1
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   B %bb.2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.3, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   B %bb.1
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.6, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.5
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.6:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_block_behind_load
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.1
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.3, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.1
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x40000000), %bb.4(0x40000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %10:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
+    Bcc 0, %bb.3, implicit $nzcv
+    B %bb.4
+
+  bb.3:
+    successors: %bb.1(0x80000000)
+
+    BL @foo, implicit-def $lr
+    B %bb.1
+
+  bb.4:
+    successors: %bb.5(0x40000000), %bb.6(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.6, implicit $nzcv
+    B %bb.5
+
+  bb.5:
+    successors: %bb.6(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.6:
+    %8:gpr32 = PHI %1, %bb.4, %7, %bb.5
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            load_in_pred_call_in_chained_diamond_arm
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_chained_diamond_arm
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   B %bb.4
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.6
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   B %bb.7
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.6:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   B %bb.7
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.7:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.8(0x40000000), %bb.9(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.9, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.8
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.8:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.9(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.9:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.7, [[MADDWrrr1]], %bb.8
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_chained_diamond_arm
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.6
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.7
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.6:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.7
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.7:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %10:gpr32 = SUBSWri %3, 0, 0, implicit-def $nzcv
+    Bcc 0, %bb.2, implicit $nzcv
+    B %bb.3
+
+  bb.2:
+    successors: %bb.4(0x80000000)
+
+    B %bb.4
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x40000000), %bb.6(0x40000000)
+
+    %11:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
+    Bcc 0, %bb.5, implicit $nzcv
+    B %bb.6
+
+  bb.5:
+    successors: %bb.7(0x80000000)
+
+    BL @foo, implicit-def $lr
+    B %bb.7
+
+  bb.6:
+    successors: %bb.7(0x80000000)
+
+    B %bb.7
+
+  bb.7:
+    successors: %bb.8(0x40000000), %bb.9(0x40000000)
+
+    %4:gpr32common = ADDWri %3, 1, 0
+    %5:gpr32 = SUBSWri %4, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.9, implicit $nzcv
+    B %bb.8
+
+  bb.8:
+    successors: %bb.9(0x80000000)
+
+    %6:gpr32 = MADDWrrr %1, %2, $wzr
+    %7:gpr32 = MADDWrrr %6, %1, $wzr
+
+  bb.9:
+    %8:gpr32 = PHI %1, %bb.7, %7, %bb.8
+    $w0 = COPY %8
+    RET_ReallyLR implicit $w0
+...
+---
+name:            call_between_load_and_cbz
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: call_between_load_and_cbz
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32 = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   CBZW [[LDRWui]], %bb.2
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.0, [[MADDWrrr1]], %bb.1
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x40000000), %bb.2(0x40000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32 = LDRWui %0, 0 :: (load (s32))
+    BL @foo, implicit-def $lr
+    CBZW %3, %bb.2
+    B %bb.1
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %4:gpr32 = MADDWrrr %1, %2, $wzr
+    %5:gpr32 = MADDWrrr %4, %1, $wzr
+
+  bb.2:
+    %6:gpr32 = PHI %1, %bb.0, %5, %bb.1
+    $w0 = COPY %6
+    RET_ReallyLR implicit $w0
+...
+---
+name:            cbz_cond_def_in_pred_call_in_head
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: cbz_cond_def_in_pred_call_in_head
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32 = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[LDRWui]], [[LDRWui]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   CBZW [[MADDWrrr]], %bb.3
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr1]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.1, [[MADDWrrr2]], %bb.2
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32 = LDRWui %0, 0 :: (load (s32))
+    %4:gpr32 = MADDWrrr %3, %3, $wzr
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.3(0x40000000)
+
+    BL @foo, implicit-def $lr
+    CBZW %4, %bb.3
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    %5:gpr32 = MADDWrrr %1, %2, $wzr
+    %6:gpr32 = MADDWrrr %5, %1, $wzr
+
+  bb.3:
+    %7:gpr32 = PHI %1, %bb.1, %6, %bb.2
+    $w0 = COPY %7
+    RET_ReallyLR implicit $w0
+...
+---
+name:            call_before_load_carried_by_phi
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-COMMON-LABEL: name: call_before_load_carried_by_phi
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32common = PHI [[COPY1]], %bb.0, %4, %bb.5
+  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32common = MADDWrrr [[PHI]], [[PHI]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32common = MADDWrrr [[MADDWrrr]], [[MADDWrrr]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32common = MADDWrrr [[MADDWrrr1]], [[MADDWrrr1]], $wzr
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[MADDWrrr2]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr4:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr3]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x7c000000), %bb.6(0x04000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI1:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.3, [[MADDWrrr4]], %bb.4
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[PHI1]], 0, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.1, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.6
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI1]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+
+  bb.1:
+    successors: %bb.2(0x80000000)
+
+    %3:gpr32common = PHI %1, %bb.0, %4, %bb.5
+    BL @foo, implicit-def $lr
+
+  bb.2:
+    successors: %bb.3(0x80000000)
+
+    %4:gpr32common = LDRWui %0, 0 :: (load (s32))
+
+  bb.3:
+    successors: %bb.4(0x40000000), %bb.5(0x40000000)
+
+    %5:gpr32common = MADDWrrr %3, %3, $wzr
+    %6:gpr32common = MADDWrrr %5, %5, $wzr
+    %7:gpr32common = MADDWrrr %6, %6, $wzr
+    %8:gpr32 = SUBSWri %7, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.5, implicit $nzcv
+    B %bb.4
+
+  bb.4:
+    successors: %bb.5(0x80000000)
+
+    %9:gpr32 = MADDWrrr %1, %2, $wzr
+    %10:gpr32 = MADDWrrr %9, %1, $wzr
+
+  bb.5:
+    successors: %bb.1(0x7c000000), %bb.6(0x04000000)
+
+    %11:gpr32sp = PHI %1, %bb.3, %10, %bb.4
+    %12:gpr32 = SUBSWri %11, 0, 0, implicit-def $nzcv
+    Bcc 12, %bb.1, implicit $nzcv
+    B %bb.6
+
+  bb.6:
+    $w0 = COPY %11
+    RET_ReallyLR implicit $w0
+...
+---
+name:            two_regions_share_call_block
+alignment:       4
+tracksRegLiveness: true
+body:             |
+  ; CHECK-DEFAULT-LABEL: name: two_regions_share_call_block
+  ; CHECK-DEFAULT: bb.0:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT:   [[LDRWui1:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 1 :: (load (s32))
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.1:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.2
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.2:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.3
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.3:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.4:
+  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.5:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x40000000), %bb.7(0x40000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[ADDWri1:%[0-9]+]]:gpr32common = ADDWri [[LDRWui1]], 1, 0
+  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri1]], 100, 0, implicit-def $nzcv
+  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.7, implicit $nzcv
+  ; CHECK-DEFAULT-NEXT:   B %bb.6
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.6:
+  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr2]], [[COPY1]], $wzr
+  ; CHECK-DEFAULT-NEXT: {{  $}}
+  ; CHECK-DEFAULT-NEXT: bb.7:
+  ; CHECK-DEFAULT-NEXT:   [[PHI1:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.5, [[MADDWrrr3]], %bb.6
+  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI1]]
+  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
+  ;
+  ; CHECK-DATA-DEPENDENT-LABEL: name: two_regions_share_call_block
+  ; CHECK-DATA-DEPENDENT: bb.0:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui1:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 1 :: (load (s32))
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
+  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.2
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
+  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri1:%[0-9]+]]:gpr32common = ADDWri [[LDRWui1]], 1, 0
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri1]], 100, 0, implicit-def $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr2]], [[COPY1]], $wzr
+  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr1:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr3]], 12, implicit $nzcv
+  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr1]]
+  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  bb.0:
+    successors: %bb.1(0x80000000)
+    liveins: $x0, $w1, $w2
+
+    %0:gpr64common = COPY $x0
+    %1:gpr32 = COPY $w1
+    %2:gpr32 = COPY $w2
+    %3:gpr32common = LDRWui %0, 0 :: (load (s32))
+    %4:gpr32common = LDRWui %0, 1 :: (load (s32))
+
+  bb.1:
+    successors: %bb.2(0x40000000), %bb.5(0x40000000)
+
+    BL @foo, implicit-def $lr
+    %5:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
+    Bcc 0, %bb.5, implicit $nzcv
+    B %bb.2
+
+  bb.2:
+    successors: %bb.3(0x40000000), %bb.4(0x40000000)
+
+    %6:gpr32common = ADDWri %3, 1, 0
+    %7:gpr32 = SUBSWri %6, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.4, implicit $nzcv
+    B %bb.3
+
+  bb.3:
+    successors: %bb.4(0x80000000)
+
+    %8:gpr32 = MADDWrrr %1, %2, $wzr
+    %9:gpr32 = MADDWrrr %8, %1, $wzr
+
+  bb.4:
+    %10:gpr32 = PHI %1, %bb.2, %9, %bb.3
+    $w0 = COPY %10
+    RET_ReallyLR implicit $w0
+
+  bb.5:
+    successors: %bb.6(0x40000000), %bb.7(0x40000000)
+
+    %11:gpr32common = ADDWri %4, 1, 0
+    %12:gpr32 = SUBSWri %11, 100, 0, implicit-def $nzcv
+    Bcc 12, %bb.7, implicit $nzcv
+    B %bb.6
+
+  bb.6:
+    successors: %bb.7(0x80000000)
+
+    %13:gpr32 = MADDWrrr %1, %2, $wzr
+    %14:gpr32 = MADDWrrr %13, %1, $wzr
+
+  bb.7:
+    %15:gpr32 = PHI %1, %bb.5, %14, %bb.6
+    $w0 = COPY %15
+    RET_ReallyLR implicit $w0
+...

>From d2a71c99bae39a6ac11a5c35ba610569811f278a Mon Sep 17 00:00:00 2001
From: Jonathan Cohen <joncoh at apple.com>
Date: Tue, 4 Aug 2026 22:50:37 +0300
Subject: [PATCH 4/4] Address review comments

- Fix `callInRange` to check reachability correctly. The previous implementation would only examine blocks which contain instructions in the use-def chain between the load and condition, now we check all predecessor blocks that are dominated by the load and which reach the condition.
- Remove `Reg` argument from `doOperandsComeFromMemory`.
- Fix redundant indexing into callInPath cache
---
 llvm/lib/CodeGen/EarlyIfConversion.cpp        | 169 +--
 .../early-ifcvt-load-to-cond-br-limit.mir     |   5 -
 .../AArch64/early-ifcvt-load-to-cond-br.mir   | 966 ++++++------------
 3 files changed, 421 insertions(+), 719 deletions(-)

diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp
index 378e2a0bc6534..fb74896ff315c 100644
--- a/llvm/lib/CodeGen/EarlyIfConversion.cpp
+++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp
@@ -17,6 +17,7 @@
 
 #include "llvm/CodeGen/EarlyIfConversion.h"
 #include "llvm/ADT/BitVector.h"
+#include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseSet.h"
 #include "llvm/ADT/PostOrderIterator.h"
 #include "llvm/ADT/SmallPtrSet.h"
@@ -44,7 +45,6 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/raw_ostream.h"
-#include <cstddef>
 
 using namespace llvm;
 
@@ -839,8 +839,9 @@ class EarlyIfConverter {
   MachineBranchProbabilityInfo *MBPI = nullptr;
   SSAIfConv IfConv;
 
-  /// Cache of basic blocks verified to contain no call instructions.
-  SmallPtrSet<const MachineBasicBlock *, 16> NoCallBlocksCache;
+  /// Cache of basic blocks verified to contain no call instructions, mapping
+  /// each block to the number of instructions scanned in it.
+  DenseMap<const MachineBasicBlock *, unsigned> NoCallBlocksCache;
 
 public:
   EarlyIfConverter(MachineDominatorTree &DT, MachineLoopInfo &LI,
@@ -855,10 +856,8 @@ class EarlyIfConverter {
   void invalidateTraces();
   bool shouldConvertIf();
   bool isConditionDataDependent();
-  bool doOperandsComeFromMemory(Register Reg, const MachineInstr *ConditionDef);
-  bool callInPath(
-      const MachineInstr *From, const MachineInstr *To,
-      const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks);
+  bool doOperandsComeFromMemory(const MachineInstr *ConditionDef);
+  bool callInRange(const MachineInstr *From, const MachineInstr *To);
 };
 
 class EarlyIfConverterLegacy : public MachineFunctionPass {
@@ -940,71 +939,112 @@ static bool isConstantPoolLoad(const MachineInstr *MI) {
          });
 }
 
-/// Check if there are any calls in the path from From to To, potentially
-/// spanning multiple basic blocks. The IntermediateBlocks set contains
-/// blocks that are between From's block and To's block in the control flow.
-///
-/// Checks:
-/// - If same block: (From, To)
-/// - If different blocks:
-///   - (From, end of From's block]
-///   - All instructions in IntermediateBlocks
-///   - [start of To's block, To)
-///
-/// Returns true if a call is found or if the path exceeds MaxRegionInstrs.
-/// Uses NoCallBlocksCache to skip blocks already verified to have no calls.
-bool EarlyIfConverter::callInPath(
-    const MachineInstr *From, const MachineInstr *To,
-    const SmallPtrSetImpl<const MachineBasicBlock *> &IntermediateBlocks) {
+/// Check if a call can be executed between From (where a value is loaded) and
+/// To (the condition). This is done by first scanning the instructions within
+/// From and To MBBs. If no call is found, we then scan all blocks which are
+/// dominated by From (the load) and can reach To (the condition).
+bool EarlyIfConverter::callInRange(const MachineInstr *From,
+                                   const MachineInstr *To) {
   if (From == To)
     return false;
 
-  unsigned Count = 0;
+  assert(DomTree->dominates(From, To) && "From is expected to dominate To");
+
   const MachineBasicBlock *FromBB = From->getParent();
   const MachineBasicBlock *ToBB = To->getParent();
 
-  // Helper to check if instruction limit exceeded or call found.
-  auto CheckInstrIsCall = [&](const MachineInstr &MI) {
-    return ++Count > MaxRegionInstrs || MI.isCall();
+  unsigned NumScanned = 0;
+  auto UpdateSearchCount = [](unsigned &NumScanned, unsigned N) {
+    NumScanned += N;
+    if (NumScanned <= MaxRegionInstrs)
+      return false;
+    LLVM_DEBUG(dbgs() << "  callInRange scanned more than " << MaxRegionInstrs
+                      << " instructions\n");
+    return true;
+  };
+  auto IsCallOrHitSearchLimit = [&UpdateSearchCount](const MachineInstr &MI,
+                                                     unsigned &NumScanned) {
+    if (UpdateSearchCount(NumScanned, 1))
+      return true;
+    if (!MI.isCall())
+      return false;
+    LLVM_DEBUG(dbgs() << "  found a call before the condition: " << MI);
+    return true;
   };
 
   // If From and To are in the same block, just check (From, To).
-  if (FromBB == ToBB)
-    return llvm::any_of(
-        llvm::make_range(std::next(From->getIterator()), To->getIterator()),
-        CheckInstrIsCall);
-
-  // Check (From, end of From's block].
-  if (any_of(
-          llvm::make_range(std::next(From->getIterator()), FromBB->instr_end()),
-          CheckInstrIsCall))
-    return true;
+  if (FromBB == ToBB) {
+    for (const MachineInstr &MI :
+         make_range(std::next(From->getIterator()), To->getIterator()))
+      if (IsCallOrHitSearchLimit(MI, NumScanned))
+        return true;
+    return false;
+  }
 
-  // Check all intermediate blocks entirely.
-  // Use cache to skip blocks already verified to have no calls.
-  for (const MachineBasicBlock *BB : IntermediateBlocks) {
-    if (BB == FromBB || BB == ToBB)
-      continue;
-    if (NoCallBlocksCache.contains(BB))
-      continue;
-    if (any_of(*BB, CheckInstrIsCall))
+  // Check (From, end of From's block] and [start of To's block, To).
+  for (const MachineInstr &MI :
+       make_range(std::next(From->getIterator()), FromBB->instr_end()))
+    if (IsCallOrHitSearchLimit(MI, NumScanned))
+      return true;
+  for (const MachineInstr &MI :
+       make_range(ToBB->instr_begin(), To->getIterator()))
+    if (IsCallOrHitSearchLimit(MI, NumScanned))
+      return true;
+
+  // Enqueued guards the traversal: the endpoint blocks are traversed through
+  // but their instructions were already handled above.
+  SmallPtrSet<const MachineBasicBlock *, 16> Enqueued = {ToBB};
+  SmallVector<const MachineBasicBlock *, 16> Worklist;
+  auto Enqueue = [&](const MachineBasicBlock *BB) {
+    if (Enqueued.insert(BB).second)
+      Worklist.push_back(BB);
+  };
+
+  for (const MachineBasicBlock *Pred : ToBB->predecessors())
+    Enqueue(Pred);
+
+  while (!Worklist.empty()) {
+    // Count every block we visit towards the limit, even if
+    // this block is not dominated by From. On very wide CFG's this could
+    // potentially cause us to miss cases where the load is very close to the
+    // condition in terms of maximum instructions, but because we walk many
+    // short predecessor basic blocks we will bail out of the scan before
+    // hitting it.
+    if (UpdateSearchCount(NumScanned, 1))
       return true;
-    NoCallBlocksCache.insert(BB);
+    const MachineBasicBlock *BB = Worklist.pop_back_val();
+
+    if (BB != FromBB && DomTree->dominates(FromBB, BB)) {
+      auto [CacheIt, Inserted] = NoCallBlocksCache.try_emplace(BB, 0);
+      if (Inserted) {
+        if (UpdateSearchCount(NumScanned, BB->size()) ||
+            any_of(*BB, [](const MachineInstr &MI) { return MI.isCall(); })) {
+          NoCallBlocksCache.erase(BB);
+          return true;
+        }
+        CacheIt->second = BB->size();
+      } else {
+        if (UpdateSearchCount(NumScanned, CacheIt->second))
+          return true;
+      }
+    }
+
+    for (const MachineBasicBlock *Pred : BB->predecessors())
+      Enqueue(Pred);
   }
 
-  // Check [start of To's block, To).
-  return any_of(llvm::make_range(ToBB->instr_begin(), To->getIterator()),
-                CheckInstrIsCall);
+  return false;
 }
 
 /// Check if a register's value comes from a memory load by walking the
 /// def-use chain. We want to prioritize converting branches which
 /// depend on values loaded from memory (unless they are loop invariant,
-/// or come from a constant pool). Only consider loads that are in the
-/// same basic block as the branch to ensure the load is "immediately"
-/// before the branch in program time.
+/// or come from a constant pool). The walk starts from the definition of
+/// ConditionDef's first operand, which is not ConditionDef itself for
+/// instructions such as FCMPSrr, where that operand is a use.
 bool EarlyIfConverter::doOperandsComeFromMemory(
-    Register Reg, const MachineInstr *ConditionDef) {
+    const MachineInstr *ConditionDef) {
+  Register Reg = ConditionDef->getOperand(0).getReg();
   if (!Reg.isVirtual())
     return false;
 
@@ -1014,10 +1054,10 @@ bool EarlyIfConverter::doOperandsComeFromMemory(
   // The condition is consumed by the branch terminating Head, so this is the
   // end of the interval a load has to survive without a call in between.
   const MachineInstr *Br = &*IfConv.Head->getFirstTerminator();
+  MachineLoop *IfConvLoop = Loops->getLoopFor(IfConv.Head);
 
   // Walk the def-use chain.
   SmallPtrSet<const MachineInstr *, 8> VisitedInstrs;
-  SmallPtrSet<const MachineBasicBlock *, 8> VisitedBlocks;
   SmallVector<const MachineInstr *> Worklist;
 
   MachineInstr *DefMI = MRI->getVRegDef(Reg);
@@ -1035,34 +1075,27 @@ bool EarlyIfConverter::doOperandsComeFromMemory(
 
     // Don't walk through PHIs: a value arriving on a back edge is loaded in a
     // previous iteration, so the interval between the load and the branch is
-    // not the one callInPath measures.
+    // not the one callInRange measures.
     if (MI->isPHI())
       continue;
 
-    // Stop walking if we encounter an instruction outside the loop.
-    // For blocks in the same loop, we continue to walk the def-use chain
-    // to find loads, regardless of whether they're immediate predecessors.
     const MachineBasicBlock *Parent = MI->getParent();
-    MachineLoop *IfConvLoop = Loops->getLoopFor(IfConv.Head);
     MachineLoop *ParentLoop = Loops->getLoopFor(Parent);
 
     // If the instruction is outside the loop, skip it (loop-invariant).
     if (IfConvLoop && ParentLoop != IfConvLoop)
       continue;
 
-    // Track visited blocks for call checking later.
-    VisitedBlocks.insert(Parent);
-
     // Check if this instruction is a load, and there are no calls between
     // the load and the condition (which would break the "close in time"
     // assumption).
     if (MI->mayLoad() && !isConstantPoolLoad(MI) &&
         !MI->isDereferenceableInvariantLoad()) {
-      // If the load doesn't dominate the condition (e.g., comes after it in
+      // If the load doesn't dominate the branch (e.g., comes after it in
       // the same block via a loop back-edge), it can't affect this iteration.
       // If not - check if there is a call between the load instruction and
-      // ConditionDef.
-      if (!DomTree->dominates(MI, Br) || callInPath(MI, Br, VisitedBlocks))
+      // the branch.
+      if (!DomTree->dominates(MI, Br) || callInRange(MI, Br))
         continue;
 
       return true;
@@ -1109,8 +1142,7 @@ bool EarlyIfConverter::isConditionDataDependent() {
   // Check if operands used to compute the branch condition were loaded recently
   // from memory, starting by the ConditionDef itself and walking up the use-def
   // chain.
-  if (doOperandsComeFromMemory(MBP.ConditionDef->getOperand(0).getReg(),
-                               MBP.ConditionDef)) {
+  if (doOperandsComeFromMemory(MBP.ConditionDef)) {
     ++NumDataDependant;
     return true;
   }
@@ -1361,6 +1393,9 @@ bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
     Changed = true;
     updateDomTree(DomTree, IfConv, RemoveBlocks);
     updateLoops(Loops, RemoveBlocks);
+    // Head absorbs the instructions of the removed blocks, including any calls,
+    // so a Head cached as call-free may no longer be.
+    NoCallBlocksCache.erase(IfConv.Head);
     for (MachineBasicBlock *MBB : RemoveBlocks) {
       NoCallBlocksCache.erase(MBB);
       MBB->eraseFromParent();
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
index 7fa516fe918c3..12170733e2332 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br-limit.mir
@@ -3,11 +3,6 @@
 # RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -early-ifcvt-max-region-instrs=3 -verify-machine-dom-info -o - %s | FileCheck %s --check-prefix=CHECK-SMALL-BUDGET
 # RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -verify-machine-dom-info -o - %s | FileCheck %s --check-prefix=CHECK-LARGE-BUDGET
 
---- |
-  define i32 @load_in_pred_region_over_instruction_budget(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-...
 ---
 name:            load_in_pred_region_over_instruction_budget
 alignment:       4
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
index d2698f75c64c9..053e589ad0475 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-load-to-cond-br.mir
@@ -2,105 +2,6 @@
 # RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -verify-machine-dom-info -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DEFAULT
 # RUN: llc -mtriple=aarch64 -mcpu=apple-m1 -run-pass=early-ifcvt -enable-early-ifcvt-data-dependent -verify-machine-dom-info -o - %s | FileCheck %s --check-prefixes=CHECK-COMMON,CHECK-DATA-DEPENDENT
 
---- |
-  define i32 @arg_to_cond_branch(i32 %val, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_from_constant_pool_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_from_constant_pool_to_cond_branch_with_cbz(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @cbz_arg_to_cond_branch(i32 %val, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @cbz_load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @tbz_arg_to_cond_branch(i32 %val, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @tbz_load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @mixed_cp_and_mem_load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @hot_branch_load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @invariant_load_to_cond_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_outside_loop_branch_inside(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_inside_loop_branch_inside(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_branch_separate_bbs_in_loop(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @call_between_load_and_branch(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_cond_and_branch_pred_bb(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_cond_and_branch_pred_bb_with_call(ptr %p, i32%x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_call_in_head(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_loop_not_immediate_pred(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_loop_call_in_intermediate_block(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_to_cond_in_backedge(ptr %p) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_call_in_empty_intermediate_block(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_diamond_call_in_one_arm(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_call_on_unreachable_path(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @call_in_block_with_early_exit_before_condition(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @call_in_block_before_load(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_call_in_block_behind_load(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @load_in_pred_call_in_chained_diamond_arm(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @call_between_load_and_cbz(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @cbz_cond_def_in_pred_call_in_head(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @call_before_load_carried_by_phi(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  define i32 @two_regions_share_call_block(ptr %p, i32 %x, i32 %y) {
-    ret i32 0
-  }
-  declare void @foo()
-...
 ---
 name:            arg_to_cond_branch
 alignment:       4
@@ -1023,7 +924,7 @@ body:             |
   ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
   ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
   ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
   ; CHECK-COMMON-NEXT:   Bcc 12, %bb.2, implicit $nzcv
   ; CHECK-COMMON-NEXT:   B %bb.1
@@ -1046,7 +947,7 @@ body:             |
     %1:gpr32 = COPY $w1
     %2:gpr32 = COPY $w2
     %3:gpr32common = LDRWui %0, 0 :: (load (s32))
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
     Bcc 12, %bb.2, implicit $nzcv
     B %bb.1
@@ -1156,7 +1057,7 @@ body:             |
   ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
   ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
   ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   B %bb.1
   ; CHECK-COMMON-NEXT: {{  $}}
   ; CHECK-COMMON-NEXT: bb.1:
@@ -1184,7 +1085,7 @@ body:             |
     %1:gpr32 = COPY $w1
     %2:gpr32 = COPY $w2
     %3:gpr32common = LDRWui %0, 0 :: (load (s32))
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     B %bb.1
 
   bb.1:
@@ -1224,7 +1125,7 @@ body:             |
   ; CHECK-COMMON-NEXT: bb.1:
   ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
   ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 100, 0, implicit-def $nzcv
   ; CHECK-COMMON-NEXT:   Bcc 12, %bb.3, implicit $nzcv
   ; CHECK-COMMON-NEXT:   B %bb.2
@@ -1252,7 +1153,7 @@ body:             |
   bb.1:
     successors: %bb.2(0x40000000), %bb.3(0x40000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     %4:gpr32 = SUBSWri %3, 100, 0, implicit-def $nzcv
     Bcc 12, %bb.3, implicit $nzcv
     B %bb.2
@@ -1403,7 +1304,7 @@ body:             |
   ; CHECK-COMMON-NEXT: bb.2:
   ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
   ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
   ; CHECK-COMMON-NEXT: {{  $}}
   ; CHECK-COMMON-NEXT: bb.3:
@@ -1446,7 +1347,7 @@ body:             |
   bb.2:
     successors: %bb.3(0x80000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     %4:gpr32common = ADDWri %3, 1, 0
 
   bb.3:
@@ -1548,79 +1449,47 @@ name:            load_in_pred_call_in_empty_intermediate_block
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_empty_intermediate_block
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.6:
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_empty_intermediate_block
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.3(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.6(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32common = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.6:
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: load_in_pred_call_in_empty_intermediate_block
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32sp = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -1637,7 +1506,7 @@ body:             |
   bb.2:
     successors: %bb.3(0x80000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
 
   bb.3:
     successors: %bb.4(0x40000000), %bb.5(0x40000000)
@@ -1667,89 +1536,52 @@ name:            load_in_pred_diamond_call_in_one_arm
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: load_in_pred_diamond_call_in_one_arm
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.3
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.6, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.5
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.6:
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_diamond_call_in_one_arm
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: load_in_pred_diamond_call_in_one_arm
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.3
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.6, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.5
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -1769,7 +1601,7 @@ body:             |
   bb.2:
     successors: %bb.4(0x80000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     B %bb.4
 
   bb.3:
@@ -1821,7 +1653,7 @@ body:             |
   ; CHECK-DEFAULT-NEXT: bb.2:
   ; CHECK-DEFAULT-NEXT:   successors:
   ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-DEFAULT-NEXT:   BRK 1
   ; CHECK-DEFAULT-NEXT: {{  $}}
   ; CHECK-DEFAULT-NEXT: bb.3:
@@ -1863,7 +1695,7 @@ body:             |
   ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
   ; CHECK-DATA-DEPENDENT-NEXT:   successors:
   ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-DATA-DEPENDENT-NEXT:   BRK 1
   ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
   ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
@@ -1893,7 +1725,7 @@ body:             |
   bb.2:
     successors:
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     BRK 1
 
   bb.3:
@@ -1920,77 +1752,46 @@ name:            call_in_block_with_early_exit_before_condition
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: call_in_block_with_early_exit_before_condition
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.3
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[COPY1]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.5, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: call_in_block_with_early_exit_before_condition
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[COPY1]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: call_in_block_with_early_exit_before_condition
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.3
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[COPY1]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x40000000), %bb.5(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.3, [[MADDWrrr1]], %bb.4
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -2003,7 +1804,7 @@ body:             |
   bb.1:
     successors: %bb.2(0x40000000), %bb.3(0x40000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     %10:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
     Bcc 0, %bb.2, implicit $nzcv
     B %bb.3
@@ -2044,7 +1845,7 @@ body:             |
   ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
   ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
   ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DEFAULT-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-DEFAULT-NEXT: {{  $}}
   ; CHECK-DEFAULT-NEXT: bb.1:
   ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
@@ -2077,7 +1878,7 @@ body:             |
   ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
   ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
   ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-DATA-DEPENDENT-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
   ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
   ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
@@ -2098,7 +1899,7 @@ body:             |
     %0:gpr64common = COPY $x0
     %1:gpr32 = COPY $w1
     %2:gpr32 = COPY $w2
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
 
   bb.1:
     successors: %bb.2(0x80000000)
@@ -2128,91 +1929,53 @@ name:            load_in_pred_call_in_block_behind_load
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_block_behind_load
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT:   B %bb.1
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   B %bb.2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.3, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT:   B %bb.1
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.6, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.5
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.6:
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_block_behind_load
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.1
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.3, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.1
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: load_in_pred_call_in_block_behind_load
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.3, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   B %bb.1
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.6, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.5
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.6(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.4, [[MADDWrrr1]], %bb.5
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -2238,7 +2001,7 @@ body:             |
   bb.3:
     successors: %bb.1(0x80000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     B %bb.1
 
   bb.4:
@@ -2265,123 +2028,69 @@ name:            load_in_pred_call_in_chained_diamond_arm
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: load_in_pred_call_in_chained_diamond_arm
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.3
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   B %bb.4
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.6
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT:   B %bb.7
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.6:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   B %bb.7
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.7:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.8(0x40000000), %bb.9(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.9, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.8
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.8:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.9(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.9:
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.7, [[MADDWrrr1]], %bb.8
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: load_in_pred_call_in_chained_diamond_arm
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.2, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.3
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.3:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.4
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.4:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.6
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.7(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.7
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.6:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.7(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.7
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.7:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: load_in_pred_call_in_chained_diamond_arm
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[LDRWui]], 0, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.2, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.3
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   B %bb.4
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   successors: %bb.5(0x40000000), %bb.6(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.6
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   B %bb.7
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   B %bb.7
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.7:
+  ; CHECK-COMMON-NEXT:   successors: %bb.8(0x40000000), %bb.9(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.9, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.8
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.8:
+  ; CHECK-COMMON-NEXT:   successors: %bb.9(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.9:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.7, [[MADDWrrr1]], %bb.8
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -2418,7 +2127,7 @@ body:             |
   bb.5:
     successors: %bb.7(0x80000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     B %bb.7
 
   bb.6:
@@ -2459,7 +2168,7 @@ body:             |
   ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
   ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
   ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32 = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   CBZW [[LDRWui]], %bb.2
   ; CHECK-COMMON-NEXT:   B %bb.1
   ; CHECK-COMMON-NEXT: {{  $}}
@@ -2481,7 +2190,7 @@ body:             |
     %1:gpr32 = COPY $w1
     %2:gpr32 = COPY $w2
     %3:gpr32 = LDRWui %0, 0 :: (load (s32))
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     CBZW %3, %bb.2
     B %bb.1
 
@@ -2515,7 +2224,7 @@ body:             |
   ; CHECK-COMMON-NEXT: bb.1:
   ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.3(0x40000000)
   ; CHECK-COMMON-NEXT: {{  $}}
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT:   CBZW [[MADDWrrr]], %bb.3
   ; CHECK-COMMON-NEXT:   B %bb.2
   ; CHECK-COMMON-NEXT: {{  $}}
@@ -2542,7 +2251,7 @@ body:             |
   bb.1:
     successors: %bb.2(0x40000000), %bb.3(0x40000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     CBZW %4, %bb.3
     B %bb.2
 
@@ -2575,7 +2284,7 @@ body:             |
   ; CHECK-COMMON-NEXT:   successors: %bb.2(0x80000000)
   ; CHECK-COMMON-NEXT: {{  $}}
   ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32common = PHI [[COPY1]], %bb.0, %4, %bb.5
-  ; CHECK-COMMON-NEXT:   BL @foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
   ; CHECK-COMMON-NEXT: {{  $}}
   ; CHECK-COMMON-NEXT: bb.2:
   ; CHECK-COMMON-NEXT:   successors: %bb.3(0x80000000)
@@ -2621,7 +2330,7 @@ body:             |
     successors: %bb.2(0x80000000)
 
     %3:gpr32common = PHI %1, %bb.0, %4, %bb.5
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
 
   bb.2:
     successors: %bb.3(0x80000000)
@@ -2661,99 +2370,62 @@ name:            two_regions_share_call_block
 alignment:       4
 tracksRegLiveness: true
 body:             |
-  ; CHECK-DEFAULT-LABEL: name: two_regions_share_call_block
-  ; CHECK-DEFAULT: bb.0:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DEFAULT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DEFAULT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DEFAULT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT:   [[LDRWui1:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 1 :: (load (s32))
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.1:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.2
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.2:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.4, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.3
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.3:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.4(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.4:
-  ; CHECK-DEFAULT-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.5:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.6(0x40000000), %bb.7(0x40000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[ADDWri1:%[0-9]+]]:gpr32common = ADDWri [[LDRWui1]], 1, 0
-  ; CHECK-DEFAULT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri1]], 100, 0, implicit-def $nzcv
-  ; CHECK-DEFAULT-NEXT:   Bcc 12, %bb.7, implicit $nzcv
-  ; CHECK-DEFAULT-NEXT:   B %bb.6
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.6:
-  ; CHECK-DEFAULT-NEXT:   successors: %bb.7(0x80000000)
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DEFAULT-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr2]], [[COPY1]], $wzr
-  ; CHECK-DEFAULT-NEXT: {{  $}}
-  ; CHECK-DEFAULT-NEXT: bb.7:
-  ; CHECK-DEFAULT-NEXT:   [[PHI1:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.5, [[MADDWrrr3]], %bb.6
-  ; CHECK-DEFAULT-NEXT:   $w0 = COPY [[PHI1]]
-  ; CHECK-DEFAULT-NEXT:   RET_ReallyLR implicit $w0
-  ;
-  ; CHECK-DATA-DEPENDENT-LABEL: name: two_regions_share_call_block
-  ; CHECK-DATA-DEPENDENT: bb.0:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.1(0x80000000)
-  ; CHECK-DATA-DEPENDENT-NEXT:   liveins: $x0, $w1, $w2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[LDRWui1:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 1 :: (load (s32))
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.1:
-  ; CHECK-DATA-DEPENDENT-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT:   BL @foo, implicit-def $lr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   Bcc 0, %bb.5, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   B %bb.2
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.2:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr1]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
-  ; CHECK-DATA-DEPENDENT-NEXT: {{  $}}
-  ; CHECK-DATA-DEPENDENT-NEXT: bb.5:
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[ADDWri1:%[0-9]+]]:gpr32common = ADDWri [[LDRWui1]], 1, 0
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri1]], 100, 0, implicit-def $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr2]], [[COPY1]], $wzr
-  ; CHECK-DATA-DEPENDENT-NEXT:   [[CSELWr1:%[0-9]+]]:gpr32 = CSELWr [[COPY1]], [[MADDWrrr3]], 12, implicit $nzcv
-  ; CHECK-DATA-DEPENDENT-NEXT:   $w0 = COPY [[CSELWr1]]
-  ; CHECK-DATA-DEPENDENT-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-LABEL: name: two_regions_share_call_block
+  ; CHECK-COMMON: bb.0:
+  ; CHECK-COMMON-NEXT:   successors: %bb.1(0x80000000)
+  ; CHECK-COMMON-NEXT:   liveins: $x0, $w1, $w2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+  ; CHECK-COMMON-NEXT:   [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
+  ; CHECK-COMMON-NEXT:   [[COPY2:%[0-9]+]]:gpr32 = COPY $w2
+  ; CHECK-COMMON-NEXT:   [[LDRWui:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 0 :: (load (s32))
+  ; CHECK-COMMON-NEXT:   [[LDRWui1:%[0-9]+]]:gpr32common = LDRWui [[COPY]], 1 :: (load (s32))
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.1:
+  ; CHECK-COMMON-NEXT:   successors: %bb.2(0x40000000), %bb.5(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   BL &foo, implicit-def $lr
+  ; CHECK-COMMON-NEXT:   [[SUBSWrr:%[0-9]+]]:gpr32 = SUBSWrr [[COPY1]], [[COPY2]], implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 0, %bb.5, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.2
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.2:
+  ; CHECK-COMMON-NEXT:   successors: %bb.3(0x40000000), %bb.4(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[LDRWui]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.4, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.3
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.3:
+  ; CHECK-COMMON-NEXT:   successors: %bb.4(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr1:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.4:
+  ; CHECK-COMMON-NEXT:   [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.2, [[MADDWrrr1]], %bb.3
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.5:
+  ; CHECK-COMMON-NEXT:   successors: %bb.6(0x40000000), %bb.7(0x40000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[ADDWri1:%[0-9]+]]:gpr32common = ADDWri [[LDRWui1]], 1, 0
+  ; CHECK-COMMON-NEXT:   [[SUBSWri1:%[0-9]+]]:gpr32 = SUBSWri [[ADDWri1]], 100, 0, implicit-def $nzcv
+  ; CHECK-COMMON-NEXT:   Bcc 12, %bb.7, implicit $nzcv
+  ; CHECK-COMMON-NEXT:   B %bb.6
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.6:
+  ; CHECK-COMMON-NEXT:   successors: %bb.7(0x80000000)
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr2:%[0-9]+]]:gpr32 = MADDWrrr [[COPY1]], [[COPY2]], $wzr
+  ; CHECK-COMMON-NEXT:   [[MADDWrrr3:%[0-9]+]]:gpr32 = MADDWrrr [[MADDWrrr2]], [[COPY1]], $wzr
+  ; CHECK-COMMON-NEXT: {{  $}}
+  ; CHECK-COMMON-NEXT: bb.7:
+  ; CHECK-COMMON-NEXT:   [[PHI1:%[0-9]+]]:gpr32 = PHI [[COPY1]], %bb.5, [[MADDWrrr3]], %bb.6
+  ; CHECK-COMMON-NEXT:   $w0 = COPY [[PHI1]]
+  ; CHECK-COMMON-NEXT:   RET_ReallyLR implicit $w0
   bb.0:
     successors: %bb.1(0x80000000)
     liveins: $x0, $w1, $w2
@@ -2767,7 +2439,7 @@ body:             |
   bb.1:
     successors: %bb.2(0x40000000), %bb.5(0x40000000)
 
-    BL @foo, implicit-def $lr
+    BL &foo, implicit-def $lr
     %5:gpr32 = SUBSWrr %1, %2, implicit-def $nzcv
     Bcc 0, %bb.5, implicit $nzcv
     B %bb.2



More information about the llvm-commits mailing list