@@ -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+
167223declare void @llvm.assume (i1 noundef)
0 commit comments