@@ -205,6 +205,8 @@ else:
205205}
206206
207207declare i8* @fn_nonnull_noundef_arg (i8* nonnull noundef %p )
208+ declare i8* @fn_nonnull_deref_arg (i8* dereferenceable (4 ) noundef %p )
209+ declare i8* @fn_nonnull_deref_or_null_arg (i8* dereferenceable_or_null (4 ) noundef %p )
208210declare i8* @fn_nonnull_arg (i8* nonnull %p )
209211declare i8* @fn_noundef_arg (i8* noundef %p )
210212
@@ -228,6 +230,46 @@ else:
228230 ret void
229231}
230232
233+ ; Optimizing this code should produce assume.
234+ define void @test9_deref (i1 %X , i8* %Y ) {
235+ ; CHECK-LABEL: @test9_deref(
236+ ; CHECK-NEXT: entry:
237+ ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[X:%.*]], i8* null, i8* [[Y:%.*]]
238+ ; CHECK-NEXT: [[TMP0:%.*]] = call i8* @fn_nonnull_deref_arg(i8* [[SPEC_SELECT]])
239+ ; CHECK-NEXT: ret void
240+ ;
241+ entry:
242+ br i1 %X , label %if , label %else
243+
244+ if:
245+ br label %else
246+
247+ else:
248+ %phi = phi i8* [ %Y , %entry ], [ null , %if ]
249+ call i8* @fn_nonnull_deref_arg (i8* %phi )
250+ ret void
251+ }
252+
253+ ; Optimizing this code should produce assume.
254+ define void @test9_deref_or_null (i1 %X , i8* %Y ) {
255+ ; CHECK-LABEL: @test9_deref_or_null(
256+ ; CHECK-NEXT: entry:
257+ ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[X:%.*]], i8* null, i8* [[Y:%.*]]
258+ ; CHECK-NEXT: [[TMP0:%.*]] = call i8* @fn_nonnull_deref_or_null_arg(i8* [[SPEC_SELECT]])
259+ ; CHECK-NEXT: ret void
260+ ;
261+ entry:
262+ br i1 %X , label %if , label %else
263+
264+ if:
265+ br label %else
266+
267+ else:
268+ %phi = phi i8* [ %Y , %entry ], [ null , %if ]
269+ call i8* @fn_nonnull_deref_or_null_arg (i8* %phi )
270+ ret void
271+ }
272+
231273define void @test9_undef (i1 %X , i8* %Y ) {
232274; CHECK-LABEL: @test9_undef(
233275; CHECK-NEXT: entry:
0 commit comments