Skip to content

Commit 18ddebe

Browse files
dianqktstellar
authored andcommitted
Remove UB-implying metadata when promoting speculative instruction.
After D138238 introduced the then/else blocks, we should remove UB-implying metadata for the promoted speculative instruction. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D148456 (cherry picked from commit 2832d79)
1 parent dbcd2e9 commit 18ddebe

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

llvm/lib/Transforms/Scalar/SROA.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,15 +1581,17 @@ static void rewriteMemOpOfSelect(SelectInst &SI, T &I,
15811581
bool IsThen = SuccBB == HeadBI->getSuccessor(0);
15821582
int SuccIdx = IsThen ? 0 : 1;
15831583
auto *NewMemOpBB = SuccBB == Tail ? Head : SuccBB;
1584+
auto &CondMemOp = cast<T>(*I.clone());
15841585
if (NewMemOpBB != Head) {
15851586
NewMemOpBB->setName(Head->getName() + (IsThen ? ".then" : ".else"));
15861587
if (isa<LoadInst>(I))
15871588
++NumLoadsPredicated;
15881589
else
15891590
++NumStoresPredicated;
1590-
} else
1591+
} else {
1592+
CondMemOp.dropUndefImplyingAttrsAndUnknownMetadata();
15911593
++NumLoadsSpeculated;
1592-
auto &CondMemOp = cast<T>(*I.clone());
1594+
}
15931595
CondMemOp.insertBefore(NewMemOpBB->getTerminator());
15941596
Value *Ptr = SI.getOperand(1 + SuccIdx);
15951597
if (auto *PtrTy = Ptr->getType();

llvm/test/Transforms/SROA/select-load.ll

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,31 @@ entry:
409409
ret i32 %r
410410
}
411411

412+
; When promoting speculative instruction, metadata that may trigger immediate UB should be dropped.
413+
define void @load_of_select_with_noundef_nonnull(ptr %buffer, i1 %b) {
414+
; CHECK-PRESERVE-CFG-LABEL: @load_of_select_with_noundef_nonnull(
415+
; CHECK-PRESERVE-CFG-NEXT: [[UB_PTR:%.*]] = alloca ptr, align 8
416+
; CHECK-PRESERVE-CFG-NEXT: [[SELECT_PTR:%.*]] = select i1 [[B:%.*]], ptr [[BUFFER:%.*]], ptr [[UB_PTR]]
417+
; CHECK-PRESERVE-CFG-NEXT: [[LOAD_PTR:%.*]] = load ptr, ptr [[SELECT_PTR]], align 8, !nonnull !1, !noundef !1
418+
; CHECK-PRESERVE-CFG-NEXT: ret void
419+
;
420+
; CHECK-MODIFY-CFG-LABEL: @load_of_select_with_noundef_nonnull(
421+
; CHECK-MODIFY-CFG-NEXT: br i1 [[B:%.*]], label [[DOTTHEN:%.*]], label [[DOTCONT:%.*]]
422+
; CHECK-MODIFY-CFG: .then:
423+
; CHECK-MODIFY-CFG-NEXT: [[LOAD_PTR_THEN_VAL:%.*]] = load ptr, ptr [[BUFFER:%.*]], align 8, !nonnull !2, !noundef !2
424+
; CHECK-MODIFY-CFG-NEXT: br label [[DOTCONT]]
425+
; CHECK-MODIFY-CFG: .cont:
426+
; CHECK-MODIFY-CFG-NEXT: [[LOAD_PTR:%.*]] = phi ptr [ [[LOAD_PTR_THEN_VAL]], [[DOTTHEN]] ], [ undef, [[TMP0:%.*]] ]
427+
; CHECK-MODIFY-CFG-NEXT: ret void
428+
;
429+
%ub_ptr = alloca ptr
430+
%select_ptr = select i1 %b, ptr %buffer, ptr %ub_ptr
431+
%load_ptr = load ptr, ptr %select_ptr, !nonnull !1, !noundef !1
432+
ret void
433+
}
434+
412435
!0 = !{!"branch_weights", i32 1, i32 99}
436+
!1 = !{}
413437

414438
; Ensure that the branch metadata is reversed to match the reversals above.
415439

0 commit comments

Comments
 (0)