[llvm] 289a329 - [EarlyIfConversion] Fix loop invariant operands check (#174765)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 8 12:03:23 PST 2026
Author: Jonathan Cohen
Date: 2026-01-08T22:03:18+02:00
New Revision: 289a3292be0c6a3df86bcdf5be7dd05b79a5570c
URL: https://github.com/llvm/llvm-project/commit/289a3292be0c6a3df86bcdf5be7dd05b79a5570c
DIFF: https://github.com/llvm/llvm-project/commit/289a3292be0c6a3df86bcdf5be7dd05b79a5570c.diff
LOG: [EarlyIfConversion] Fix loop invariant operands check (#174765)
Fixes a bug in the check which prevented walking up the operands
of the branch condition beyond the operands to the branch instruction
itself.
Added:
Modified:
llvm/lib/CodeGen/EarlyIfConversion.cpp
llvm/test/CodeGen/AArch64/early-ifcvt-likely-predictable.mir
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp
index 28993c47c094d..af5f366f92c4a 100644
--- a/llvm/lib/CodeGen/EarlyIfConversion.cpp
+++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp
@@ -942,9 +942,9 @@ bool EarlyIfConverter::shouldConvertIf() {
all_of(Def->operands(), [&](MachineOperand &Op) {
if (Op.isImm())
return true;
- if (!MO.isReg() || !MO.isUse())
- return false;
- Register Reg = MO.getReg();
+ if (!Op.isReg() || !Op.isUse())
+ return true;
+ Register Reg = Op.getReg();
if (Reg.isPhysical())
return false;
diff --git a/llvm/test/CodeGen/AArch64/early-ifcvt-likely-predictable.mir b/llvm/test/CodeGen/AArch64/early-ifcvt-likely-predictable.mir
index ab5e320725d5b..7f1d99bec6f48 100644
--- a/llvm/test/CodeGen/AArch64/early-ifcvt-likely-predictable.mir
+++ b/llvm/test/CodeGen/AArch64/early-ifcvt-likely-predictable.mir
@@ -17,6 +17,11 @@
entry:
ret void
}
+
+ define void @test_cond_def_inside_loop_with_invariant_operands() {
+ entry:
+ ret void
+ }
...
---
name: test_cond_is_load_with_invariant_ops
@@ -243,3 +248,69 @@ body: |
B %bb.1
...
+---
+name: test_cond_def_inside_loop_with_invariant_operands
+alignment: 4
+tracksRegLiveness: true
+body: |
+ ; CHECK-LABEL: name: test_cond_def_inside_loop_with_invariant_operands
+ ; CHECK: bb.0:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: liveins: $x0, $x1, $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY:%[0-9]+]]:gpr64common = COPY $x0
+ ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gpr64common = COPY $x1
+ ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gpr64common = COPY $x2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.1:
+ ; CHECK-NEXT: successors: %bb.3(0x30000000), %bb.2(0x50000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[LDRWui:%[0-9]+]]:gpr32 = LDRWui [[COPY]], 0 :: (load (s32))
+ ; CHECK-NEXT: [[LDRWui1:%[0-9]+]]:gpr32 = LDRWui [[COPY1]], 0 :: (load (s32))
+ ; CHECK-NEXT: [[SUBSWrs:%[0-9]+]]:gpr32 = SUBSWrs [[LDRWui]], [[LDRWui1]], 0, implicit-def $nzcv
+ ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gpr32all = COPY $wzr
+ ; CHECK-NEXT: [[COPY4:%[0-9]+]]:gpr32all = COPY [[COPY3]]
+ ; CHECK-NEXT: CBZW killed [[SUBSWrs]], %bb.3
+ ; CHECK-NEXT: B %bb.2
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.2:
+ ; CHECK-NEXT: successors: %bb.3(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[COPY5:%[0-9]+]]:gpr32sp = COPY [[LDRWui]]
+ ; CHECK-NEXT: [[ADDWri:%[0-9]+]]:gpr32common = ADDWri [[COPY5]], 1, 0
+ ; CHECK-NEXT: [[COPY6:%[0-9]+]]:gpr32all = COPY [[ADDWri]]
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: bb.3:
+ ; CHECK-NEXT: successors: %bb.1(0x80000000)
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: [[PHI:%[0-9]+]]:gpr32 = PHI [[COPY4]], %bb.1, [[COPY6]], %bb.2
+ ; CHECK-NEXT: STRWui [[PHI]], [[COPY2]], 0 :: (store (s32))
+ ; CHECK-NEXT: B %bb.1
+ bb.0:
+ liveins: $x0, $x1, $x2
+ %3:gpr64common = COPY $x0
+ %4:gpr64common = COPY $x1
+ %12:gpr64common = COPY $x2
+
+ bb.1:
+ successors: %bb.3(0x30000000), %bb.2(0x50000000)
+
+ %5:gpr32 = LDRWui %3, 0 :: (load (s32))
+ %6:gpr32 = LDRWui %4, 0 :: (load (s32))
+ %7:gpr32 = SUBSWrs %5, %6, 0, implicit-def $nzcv
+ %8:gpr32all = COPY $wzr
+ %9:gpr32all = COPY %8
+ CBZW killed %7, %bb.3
+ B %bb.2
+
+ bb.2:
+ %10:gpr32sp = COPY %5
+ %11:gpr32common = ADDWri %10, 1, 0
+ %0:gpr32all = COPY %11
+
+ bb.3:
+ %1:gpr32 = PHI %9, %bb.1, %0, %bb.2
+ STRWui %1, %12, 0 :: (store (s32))
+ B %bb.1
+
+...
More information about the llvm-commits
mailing list