Skip to content

Commit dc2eccf

Browse files
committed
!fixup use getDT, fix crash if CFG is modified.
1 parent 8d72e76 commit dc2eccf

File tree

2 files changed

+37
-7
lines changed

2 files changed

+37
-7
lines changed

llvm/lib/CodeGen/CodeGenPrepare.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5948,10 +5948,12 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr,
59485948
auto InsertPos = findInsertPos(Addr, MemoryInst, SunkAddr);
59495949

59505950
// TODO: Adjust insert point considering (Base|Scaled)Reg if possible.
5951-
if (!SunkAddr &&
5952-
((AddrMode.BaseReg && !DT->dominates(AddrMode.BaseReg, &*InsertPos)) ||
5953-
(AddrMode.ScaledReg && !DT->dominates(AddrMode.ScaledReg, &*InsertPos))))
5954-
return Modified;
5951+
if (!SunkAddr) {
5952+
auto &DT = getDT(*MemoryInst->getFunction());
5953+
if ((AddrMode.BaseReg && !DT.dominates(AddrMode.BaseReg, &*InsertPos)) ||
5954+
(AddrMode.ScaledReg && !DT.dominates(AddrMode.ScaledReg, &*InsertPos)))
5955+
return Modified;
5956+
}
59555957

59565958
IRBuilder<> Builder(MemoryInst->getParent(), InsertPos);
59575959

llvm/test/Transforms/CodeGenPrepare/X86/sink-addrmode-reg-does-not-geps.ll

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
22
; RUN: opt -S -passes='require<profile-summary>,function(codegenprepare)' %s | FileCheck %s
33

4-
54
target triple = "x86_64-unknown-linux"
65

76
declare i1 @cond(float)
87

9-
define void @test(ptr %src) {
10-
; CHECK-LABEL: define void @test(
8+
define void @scaled_reg_does_not_dominate_insert_point(ptr %src) {
9+
; CHECK-LABEL: define void @scaled_reg_does_not_dominate_insert_point(
1110
; CHECK-SAME: ptr [[SRC:%.*]]) {
1211
; CHECK-NEXT: [[BB:.*]]:
1312
; CHECK-NEXT: br label %[[LOOP:.*]]
@@ -46,3 +45,32 @@ loop:
4645
exit:
4746
ret void
4847
}
48+
49+
define void @check_dt_after_modifying_cfg(ptr %dst, i64 %x, i8 %y, i8 %z) {
50+
; CHECK-LABEL: define void @check_dt_after_modifying_cfg(
51+
; CHECK-SAME: ptr [[DST:%.*]], i64 [[X:%.*]], i8 [[Y:%.*]], i8 [[Z:%.*]]) {
52+
; CHECK-NEXT: [[ENTRY:.*]]:
53+
; CHECK-NEXT: [[OFFSET:%.*]] = lshr i64 [[X]], 2
54+
; CHECK-NEXT: [[SEL_FROZEN:%.*]] = freeze i8 [[Z]]
55+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i8 [[SEL_FROZEN]], 0
56+
; CHECK-NEXT: br i1 [[CMP]], label %[[SELECT_END:.*]], label %[[SELECT_FALSE_SINK:.*]]
57+
; CHECK: [[SELECT_FALSE_SINK]]:
58+
; CHECK-NEXT: [[SMIN:%.*]] = tail call i8 @llvm.smin.i8(i8 [[Y]], i8 0)
59+
; CHECK-NEXT: br label %[[SELECT_END]]
60+
; CHECK: [[SELECT_END]]:
61+
; CHECK-NEXT: [[SEL:%.*]] = phi i8 [ 0, %[[ENTRY]] ], [ [[SMIN]], %[[SELECT_FALSE_SINK]] ]
62+
; CHECK-NEXT: [[SUNKADDR:%.*]] = getelementptr i8, ptr [[DST]], i64 [[OFFSET]]
63+
; CHECK-NEXT: store i8 [[SEL]], ptr [[SUNKADDR]], align 1
64+
; CHECK-NEXT: ret void
65+
;
66+
entry:
67+
%offset = lshr i64 %x, 2
68+
%gep.dst = getelementptr i8, ptr %dst, i64 %offset
69+
%smin = tail call i8 @llvm.smin.i8(i8 %y, i8 0)
70+
%cmp = icmp slt i8 %z, 0
71+
%sel = select i1 %cmp, i8 0, i8 %smin
72+
store i8 %sel, ptr %gep.dst, align 1
73+
ret void
74+
}
75+
76+
declare i8 @llvm.smin.i8(i8, i8) #0

0 commit comments

Comments
 (0)