[llvm] [MachineLICM] Don't allow hoisting invariant loads across mem barrier. (PR #116987)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 20 11:02:51 PST 2024
https://github.com/fhahn updated https://github.com/llvm/llvm-project/pull/116987
>From ea586eaa8f3f435ee2a53bcac1c8310ac20974ba Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Wed, 20 Nov 2024 14:47:13 +0000
Subject: [PATCH 1/2] [MachineLICM] Don't allow hoisting invariant loads across
mem barrier.
The improvements in 63917e1 / #70796 do not check for memory
barriers/unmodelled sideeffects, which means we may incorrectly hoist
loads across memory barriers.
Fix this by checking any machine instruction in the loop is a load-fold
barrier.
---
llvm/lib/CodeGen/MachineLICM.cpp | 2 +-
llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/CodeGen/MachineLICM.cpp b/llvm/lib/CodeGen/MachineLICM.cpp
index 48c901b8d06d61..00e3b5def5d108 100644
--- a/llvm/lib/CodeGen/MachineLICM.cpp
+++ b/llvm/lib/CodeGen/MachineLICM.cpp
@@ -1501,7 +1501,7 @@ void MachineLICMImpl::InitializeLoadsHoistableLoops() {
if (!AllowedToHoistLoads[Loop])
continue;
for (auto &MI : *MBB) {
- if (!MI.mayStore() && !MI.isCall() &&
+ if (!MI.isLoadFoldBarrier() && !MI.mayStore() && !MI.isCall() &&
!(MI.mayLoad() && MI.hasOrderedMemoryRef()))
continue;
for (MachineLoop *L = Loop; L != nullptr; L = L->getParentLoop())
diff --git a/llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll b/llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll
index 932a5af264a000..17f8263560430d 100644
--- a/llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll
+++ b/llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll
@@ -499,16 +499,16 @@ for.exit: ; preds = %for.body
@a = external local_unnamed_addr global i32, align 4
-; FIXME: Load hoisted out of the loop across memory barriers.
+; Make sure the load is not hoisted out of the loop across memory barriers.
define i32 @load_between_memory_barriers() {
; CHECK-LABEL: load_between_memory_barriers:
; CHECK: // %bb.0:
; CHECK-NEXT: adrp x8, :got:a
; CHECK-NEXT: ldr x8, [x8, :got_lo12:a]
-; CHECK-NEXT: ldr w0, [x8]
; CHECK-NEXT: .LBB8_1: // %loop
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
; CHECK-NEXT: //MEMBARRIER
+; CHECK-NEXT: ldr w0, [x8]
; CHECK-NEXT: //MEMBARRIER
; CHECK-NEXT: cbz w0, .LBB8_1
; CHECK-NEXT: // %bb.2: // %exit
>From b62f928d73bd0c1fdf67c3e6e1341a517209315c Mon Sep 17 00:00:00 2001
From: Florian Hahn <flo at fhahn.com>
Date: Wed, 20 Nov 2024 19:01:35 +0000
Subject: [PATCH 2/2] !ifxup update lcb5.ll to state before 63917e1975bd69e
---
llvm/test/CodeGen/Mips/lcb5.ll | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/test/CodeGen/Mips/lcb5.ll b/llvm/test/CodeGen/Mips/lcb5.ll
index f320f6fc5660ce..bb059f1ee8453e 100644
--- a/llvm/test/CodeGen/Mips/lcb5.ll
+++ b/llvm/test/CodeGen/Mips/lcb5.ll
@@ -186,7 +186,7 @@ if.end: ; preds = %if.then, %entry
}
; ci: .ent z3
-; ci: bteqz $BB6_3
+; ci: bteqz $BB6_2
; ci: .end z3
; Function Attrs: nounwind optsize
@@ -210,7 +210,7 @@ if.end: ; preds = %if.then, %entry
; ci: .ent z4
; ci: btnez $BB7_1 # 16 bit inst
-; ci: jal $BB7_3 # branch
+; ci: jal $BB7_2 # branch
; ci: nop
; ci: $BB7_1:
; ci: .p2align 2
More information about the llvm-commits
mailing list