[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