Skip to content

Commit f5d63cc

Browse files
committed
[LICM] Add test with deref assumption of GEP.
1 parent e080366 commit f5d63cc

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

llvm/test/Transforms/LICM/hoist-speculatable-load.ll

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,4 +164,60 @@ exit: ; preds = %if.end, %entry
164164
ret void
165165
}
166166

167+
define void @f_chained_gep_with_nofree_nosync(ptr %ptr, ptr %ptr2, i1 %cond) nofree nosync {
168+
; CHECK-LABEL: @f_chained_gep_with_nofree_nosync(
169+
; CHECK-NEXT: entry:
170+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i32, ptr [[PTR:%.*]], i64 1
171+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[GEP]], i32 16), "dereferenceable"(ptr [[GEP]], i32 16) ]
172+
; CHECK-NEXT: br i1 [[COND:%.*]], label [[FOR_BODY_LR_PH:%.*]], label [[IF0:%.*]]
173+
; CHECK: if0:
174+
; CHECK-NEXT: store i32 0, ptr [[PTR2:%.*]], align 4
175+
; CHECK-NEXT: br label [[FOR_BODY_LR_PH]]
176+
; CHECK: for.body.lr.ph:
177+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
178+
; CHECK: for.body:
179+
; CHECK-NEXT: [[I_08:%.*]] = phi i32 [ 0, [[FOR_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END:%.*]] ]
180+
; CHECK-NEXT: br i1 [[COND]], label [[IF_END]], label [[IF:%.*]]
181+
; CHECK: if:
182+
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[GEP]], align 4, !invariant.load [[META0]]
183+
; CHECK-NEXT: store i32 [[TMP0]], ptr [[PTR2]], align 4
184+
; CHECK-NEXT: br label [[IF_END]]
185+
; CHECK: if.end:
186+
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_08]], 1
187+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[INC]], 2
188+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[EXIT:%.*]]
189+
; CHECK: exit:
190+
; CHECK-NEXT: ret void
191+
;
192+
entry:
193+
%gep = getelementptr inbounds i32, ptr %ptr, i64 1
194+
call void @llvm.assume(i1 true) [ "align"(ptr %gep, i32 16), "dereferenceable"(ptr %gep, i32 16) ]
195+
br i1 %cond, label %for.body.lr.ph, label %if0
196+
197+
if0:
198+
store i32 0, ptr %ptr2, align 4
199+
br label %for.body.lr.ph
200+
201+
for.body.lr.ph: ; preds = %entry
202+
br label %for.body
203+
204+
for.body: ; preds = %for.body.lr.ph, %if.end
205+
%i.08 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %if.end ]
206+
br i1 %cond, label %if.end, label %if
207+
208+
if:
209+
%0 = load i32, ptr %gep, align 4, !invariant.load !{}
210+
store i32 %0, ptr %ptr2, align 4
211+
br label %if.end
212+
213+
if.end: ; preds = %for.body
214+
%inc = add nuw nsw i32 %i.08, 1
215+
%cmp = icmp slt i32 %inc, 2
216+
br i1 %cmp, label %for.body, label %exit
217+
218+
exit: ; preds = %if.end, %entry
219+
ret void
220+
}
221+
222+
167223
declare void @llvm.assume(i1 noundef)

0 commit comments

Comments
 (0)