@@ -164,4 +164,60 @@ exit: ; preds = %if.end, %entry
164
164
ret void
165
165
}
166
166
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
+
167
223
declare void @llvm.assume (i1 noundef)
0 commit comments