Skip to content

Commit 42229b9

Browse files
committed
[LICM] Only create load in pre-header when promoting load.
When only a store is sunk, there is no need to create a load in the pre-header, as the result of the load will never get used. The dead load can can introduce UB, if the function is marked as writeonly. Fixes llvm#51248. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D123473
1 parent 2c6217f commit 42229b9

File tree

2 files changed

+20
-18
lines changed

2 files changed

+20
-18
lines changed

llvm/lib/Transforms/Scalar/LICM.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2156,21 +2156,24 @@ bool llvm::promoteLoopAccessesToScalars(
21562156

21572157
// Set up the preheader to have a definition of the value. It is the live-out
21582158
// value from the preheader that uses in the loop will use.
2159-
LoadInst *PreheaderLoad = new LoadInst(
2160-
AccessTy, SomePtr, SomePtr->getName() + ".promoted",
2161-
Preheader->getTerminator());
2162-
if (SawUnorderedAtomic)
2163-
PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
2164-
PreheaderLoad->setAlignment(Alignment);
2165-
PreheaderLoad->setDebugLoc(DebugLoc());
2166-
if (AATags)
2167-
PreheaderLoad->setAAMetadata(AATags);
2168-
SSA.AddAvailableValue(Preheader, PreheaderLoad);
2169-
2170-
MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
2171-
PreheaderLoad, nullptr, PreheaderLoad->getParent(), MemorySSA::End);
2172-
MemoryUse *NewMemUse = cast<MemoryUse>(PreheaderLoadMemoryAccess);
2173-
MSSAU.insertUse(NewMemUse, /*RenameUses=*/true);
2159+
LoadInst *PreheaderLoad = nullptr;
2160+
if (FoundLoadToPromote) {
2161+
PreheaderLoad =
2162+
new LoadInst(AccessTy, SomePtr, SomePtr->getName() + ".promoted",
2163+
Preheader->getTerminator());
2164+
if (SawUnorderedAtomic)
2165+
PreheaderLoad->setOrdering(AtomicOrdering::Unordered);
2166+
PreheaderLoad->setAlignment(Alignment);
2167+
PreheaderLoad->setDebugLoc(DebugLoc());
2168+
if (AATags)
2169+
PreheaderLoad->setAAMetadata(AATags);
2170+
2171+
MemoryAccess *PreheaderLoadMemoryAccess = MSSAU.createMemoryAccessInBB(
2172+
PreheaderLoad, nullptr, PreheaderLoad->getParent(), MemorySSA::End);
2173+
MemoryUse *NewMemUse = cast<MemoryUse>(PreheaderLoadMemoryAccess);
2174+
MSSAU.insertUse(NewMemUse, /*RenameUses=*/true);
2175+
SSA.AddAvailableValue(Preheader, PreheaderLoad);
2176+
}
21742177

21752178
if (VerifyMemorySSA)
21762179
MSSAU.getMemorySSA()->verifyMemorySSA();
@@ -2181,7 +2184,7 @@ bool llvm::promoteLoopAccessesToScalars(
21812184
if (VerifyMemorySSA)
21822185
MSSAU.getMemorySSA()->verifyMemorySSA();
21832186
// If the SSAUpdater didn't use the load in the preheader, just zap it now.
2184-
if (PreheaderLoad->use_empty())
2187+
if (PreheaderLoad && PreheaderLoad->use_empty())
21852188
eraseInstruction(*PreheaderLoad, *SafetyInfo, MSSAU);
21862189

21872190
return true;

llvm/test/Transforms/LICM/scalar-promote.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -605,10 +605,9 @@ Out:
605605
define void @test_sink_store_only() writeonly {
606606
; CHECK-LABEL: @test_sink_store_only(
607607
; CHECK-NEXT: entry:
608-
; CHECK-NEXT: [[GLB_PROMOTED:%.*]] = load i8, i8* @glb, align 1
609608
; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]
610609
; CHECK: loop.header:
611-
; CHECK-NEXT: [[DIV1:%.*]] = phi i8 [ [[GLB_PROMOTED]], [[ENTRY:%.*]] ], [ [[DIV:%.*]], [[LOOP_LATCH:%.*]] ]
610+
; CHECK-NEXT: [[DIV1:%.*]] = phi i8 [ undef, [[ENTRY:%.*]] ], [ [[DIV:%.*]], [[LOOP_LATCH:%.*]] ]
612611
; CHECK-NEXT: [[I:%.*]] = phi i8 [ 0, [[ENTRY]] ], [ [[ADD:%.*]], [[LOOP_LATCH]] ]
613612
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[I]], 4
614613
; CHECK-NEXT: br i1 [[CMP]], label [[LOOP_LATCH]], label [[EXIT:%.*]]

0 commit comments

Comments
 (0)