Skip to content

Commit d5b0f71

Browse files
committed
[MachineLICM] Don't allow hoisting invariant loads across mem barrier.
The improvements in 63917e1 / llvm#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.
1 parent a9b3ec1 commit d5b0f71

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

llvm/lib/CodeGen/MachineLICM.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1501,7 +1501,7 @@ void MachineLICMImpl::InitializeLoadsHoistableLoops() {
15011501
if (!AllowedToHoistLoads[Loop])
15021502
continue;
15031503
for (auto &MI : *MBB) {
1504-
if (!MI.mayStore() && !MI.isCall() &&
1504+
if (!MI.isLoadFoldBarrier() && !MI.mayStore() && !MI.isCall() &&
15051505
!(MI.mayLoad() && MI.hasOrderedMemoryRef()))
15061506
continue;
15071507
for (MachineLoop *L = Loop; L != nullptr; L = L->getParentLoop())

llvm/test/CodeGen/AArch64/machine-licm-hoist-load.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,16 +499,16 @@ for.exit: ; preds = %for.body
499499

500500
@a = external local_unnamed_addr global i32, align 4
501501

502-
; FIXME: Load hoisted out of the loop across memory barriers.
502+
; Make sure the load is not hoisted out of the loop across memory barriers.
503503
define i32 @load_between_memory_barriers() {
504504
; CHECK-LABEL: load_between_memory_barriers:
505505
; CHECK: // %bb.0:
506506
; CHECK-NEXT: adrp x8, :got:a
507507
; CHECK-NEXT: ldr x8, [x8, :got_lo12:a]
508-
; CHECK-NEXT: ldr w0, [x8]
509508
; CHECK-NEXT: .LBB8_1: // %loop
510509
; CHECK-NEXT: // =>This Inner Loop Header: Depth=1
511510
; CHECK-NEXT: //MEMBARRIER
511+
; CHECK-NEXT: ldr w0, [x8]
512512
; CHECK-NEXT: //MEMBARRIER
513513
; CHECK-NEXT: cbz w0, .LBB8_1
514514
; CHECK-NEXT: // %bb.2: // %exit

0 commit comments

Comments
 (0)