Skip to content

Commit e21a22a

Browse files
[Attributor] fix AANoUndef initialization
Currently, `AANoUndefImpl::initialize` mistakenly always indicates optimistic fixpoint for function returned position. This is because an associated value is `Function` in the case, and `isGuaranteedNotToBeUndefOrPoison` returns true for Function. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D86361
1 parent 5e3fd47 commit e21a22a

File tree

11 files changed

+348
-642
lines changed

11 files changed

+348
-642
lines changed

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7715,7 +7715,8 @@ struct AANoUndefImpl : AANoUndef {
77157715
indicatePessimisticFixpoint();
77167716
else if (isa<FreezeInst>(V))
77177717
indicateOptimisticFixpoint();
7718-
else if (isGuaranteedNotToBeUndefOrPoison(&V))
7718+
else if (getPositionKind() != IRPosition::IRP_RETURNED &&
7719+
isGuaranteedNotToBeUndefOrPoison(&V))
77197720
indicateOptimisticFixpoint();
77207721
else
77217722
AANoUndef::initialize(A);

llvm/test/Transforms/Attributor/ArgumentPromotion/X86/thiscall.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,18 +48,18 @@ entry:
4848
define void @exportedfun(%struct.a* %a) {
4949
; IS__TUNIT____-LABEL: define {{[^@]+}}@exportedfun
5050
; IS__TUNIT____-SAME: (%struct.a* nocapture nofree readnone [[A:%.*]])
51-
; IS__TUNIT____-NEXT: [[INALLOCA_SAVE:%.*]] = tail call noundef i8* @llvm.stacksave()
51+
; IS__TUNIT____-NEXT: [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()
5252
; IS__TUNIT____-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4
5353
; IS__TUNIT____-NEXT: call x86_thiscallcc void @internalfun(%struct.a* noalias nocapture nofree readnone undef, <{ [[STRUCT_A]] }>* inalloca noundef nonnull align 4 dereferenceable(1) [[ARGMEM]])
54-
; IS__TUNIT____-NEXT: call void @llvm.stackrestore(i8* noundef [[INALLOCA_SAVE]])
54+
; IS__TUNIT____-NEXT: call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])
5555
; IS__TUNIT____-NEXT: ret void
5656
;
5757
; IS__CGSCC____-LABEL: define {{[^@]+}}@exportedfun
5858
; IS__CGSCC____-SAME: (%struct.a* nocapture nofree readnone [[A:%.*]])
59-
; IS__CGSCC____-NEXT: [[INALLOCA_SAVE:%.*]] = tail call noundef i8* @llvm.stacksave()
59+
; IS__CGSCC____-NEXT: [[INALLOCA_SAVE:%.*]] = tail call i8* @llvm.stacksave()
6060
; IS__CGSCC____-NEXT: [[ARGMEM:%.*]] = alloca inalloca <{ [[STRUCT_A:%.*]] }>, align 4
6161
; IS__CGSCC____-NEXT: call x86_thiscallcc void @internalfun(%struct.a* noalias nocapture nofree readnone [[A]], <{ [[STRUCT_A]] }>* inalloca noundef nonnull align 4 dereferenceable(1) [[ARGMEM]])
62-
; IS__CGSCC____-NEXT: call void @llvm.stackrestore(i8* noundef [[INALLOCA_SAVE]])
62+
; IS__CGSCC____-NEXT: call void @llvm.stackrestore(i8* [[INALLOCA_SAVE]])
6363
; IS__CGSCC____-NEXT: ret void
6464
;
6565
%inalloca.save = tail call i8* @llvm.stacksave()

llvm/test/Transforms/Attributor/IPConstantProp/musttail-call.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ define i8* @start(i8 %v) {
3030
; IS__CGSCC____-NEXT: [[C1:%.*]] = icmp eq i8 [[V]], 0
3131
; IS__CGSCC____-NEXT: br i1 [[C1]], label [[TRUE:%.*]], label [[FALSE:%.*]]
3232
; IS__CGSCC____: true:
33-
; IS__CGSCC____-NEXT: [[CA:%.*]] = musttail call noalias align 536870912 i8* @side_effects(i8 [[V]])
33+
; IS__CGSCC____-NEXT: [[CA:%.*]] = musttail call noalias noundef align 536870912 i8* @side_effects(i8 [[V]])
3434
; IS__CGSCC____-NEXT: ret i8* [[CA]]
3535
; IS__CGSCC____: false:
3636
; IS__CGSCC____-NEXT: [[C2:%.*]] = icmp eq i8 [[V]], 1
3737
; IS__CGSCC____-NEXT: br i1 [[C2]], label [[C2_TRUE:%.*]], label [[C2_FALSE:%.*]]
3838
; IS__CGSCC____: c2_true:
39-
; IS__CGSCC____-NEXT: [[CA1:%.*]] = musttail call noalias align 536870912 i8* @no_side_effects(i8 [[V]])
39+
; IS__CGSCC____-NEXT: [[CA1:%.*]] = musttail call noalias noundef align 536870912 i8* @no_side_effects(i8 [[V]])
4040
; IS__CGSCC____-NEXT: ret i8* [[CA1]]
4141
; IS__CGSCC____: c2_false:
42-
; IS__CGSCC____-NEXT: [[CA2:%.*]] = musttail call noalias align 536870912 i8* @dont_zap_me(i8 [[V]])
42+
; IS__CGSCC____-NEXT: [[CA2:%.*]] = musttail call noalias noundef align 536870912 i8* @dont_zap_me(i8 [[V]])
4343
; IS__CGSCC____-NEXT: ret i8* [[CA2]]
4444
;
4545
%c1 = icmp eq i8 %v, 0
@@ -70,7 +70,7 @@ define internal i8* @side_effects(i8 %v) {
7070
; IS__CGSCC____-LABEL: define {{[^@]+}}@side_effects
7171
; IS__CGSCC____-SAME: (i8 [[V:%.*]])
7272
; IS__CGSCC____-NEXT: [[I1:%.*]] = call i32 @external()
73-
; IS__CGSCC____-NEXT: [[CA:%.*]] = musttail call noalias align 536870912 i8* @start(i8 [[V]])
73+
; IS__CGSCC____-NEXT: [[CA:%.*]] = musttail call noalias noundef align 536870912 i8* @start(i8 [[V]])
7474
; IS__CGSCC____-NEXT: ret i8* [[CA]]
7575
;
7676
%i1 = call i32 @external()

llvm/test/Transforms/Attributor/align.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ define align 4 i8* @test7() #0 {
234234
;
235235
; IS__CGSCC_NPM: Function Attrs: nofree noinline norecurse nosync nounwind readnone uwtable willreturn
236236
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@test7()
237-
; IS__CGSCC_NPM-NEXT: [[C:%.*]] = tail call nonnull align 8 dereferenceable(1) i8* @f1()
237+
; IS__CGSCC_NPM-NEXT: [[C:%.*]] = tail call noundef nonnull align 8 dereferenceable(1) i8* @f1()
238238
; IS__CGSCC_NPM-NEXT: ret i8* [[C]]
239239
;
240240
%c = tail call i8* @f1(i8* align 8 dereferenceable(1) @a1)
@@ -328,12 +328,12 @@ define align 4 i32* @test7b(i32* align 32 %p) #0 {
328328
; TEST 8
329329
define void @test8_helper() {
330330
; CHECK-LABEL: define {{[^@]+}}@test8_helper()
331-
; CHECK-NEXT: [[PTR0:%.*]] = tail call noundef i32* @unknown()
332-
; CHECK-NEXT: [[PTR1:%.*]] = tail call noundef align 4 i32* @unknown()
333-
; CHECK-NEXT: [[PTR2:%.*]] = tail call noundef align 8 i32* @unknown()
334-
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture noundef readnone align 4 [[PTR1]], i32* noalias nocapture noundef readnone align 4 [[PTR1]], i32* noalias nocapture noundef readnone [[PTR0]])
335-
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture noundef readnone align 8 [[PTR2]], i32* noalias nocapture noundef readnone align 4 [[PTR1]], i32* noalias nocapture noundef readnone align 4 [[PTR1]])
336-
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture noundef readnone align 8 [[PTR2]], i32* noalias nocapture noundef readnone align 4 [[PTR1]], i32* noalias nocapture noundef readnone align 4 [[PTR1]])
331+
; CHECK-NEXT: [[PTR0:%.*]] = tail call i32* @unknown()
332+
; CHECK-NEXT: [[PTR1:%.*]] = tail call align 4 i32* @unknown()
333+
; CHECK-NEXT: [[PTR2:%.*]] = tail call align 8 i32* @unknown()
334+
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture readnone align 4 [[PTR1]], i32* noalias nocapture readnone align 4 [[PTR1]], i32* noalias nocapture readnone [[PTR0]])
335+
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture readnone align 8 [[PTR2]], i32* noalias nocapture readnone align 4 [[PTR1]], i32* noalias nocapture readnone align 4 [[PTR1]])
336+
; CHECK-NEXT: tail call void @test8(i32* noalias nocapture readnone align 8 [[PTR2]], i32* noalias nocapture readnone align 4 [[PTR1]], i32* noalias nocapture readnone align 4 [[PTR1]])
337337
; CHECK-NEXT: ret void
338338
;
339339
%ptr0 = tail call i32* @unknown()
@@ -350,10 +350,10 @@ declare void @user_i32_ptr(i32* nocapture readnone) nounwind
350350
define internal void @test8(i32* %a, i32* %b, i32* %c) {
351351
; IS__TUNIT____: Function Attrs: nounwind
352352
; IS__TUNIT____-LABEL: define {{[^@]+}}@test8
353-
; IS__TUNIT____-SAME: (i32* noalias nocapture noundef readnone align 4 [[A:%.*]], i32* noalias nocapture noundef readnone align 4 [[B:%.*]], i32* noalias nocapture noundef readnone [[C:%.*]])
354-
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture noundef readnone align 4 [[A]])
355-
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture noundef readnone align 4 [[B]])
356-
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture noundef readnone [[C]])
353+
; IS__TUNIT____-SAME: (i32* noalias nocapture readnone align 4 [[A:%.*]], i32* noalias nocapture readnone align 4 [[B:%.*]], i32* noalias nocapture readnone [[C:%.*]])
354+
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[A]])
355+
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture readnone align 4 [[B]])
356+
; IS__TUNIT____-NEXT: call void @user_i32_ptr(i32* noalias nocapture readnone [[C]])
357357
; IS__TUNIT____-NEXT: ret void
358358
;
359359
; IS__CGSCC____: Function Attrs: nounwind

llvm/test/Transforms/Attributor/dereferenceable-1.ll

Lines changed: 32 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -275,37 +275,21 @@ if.false:
275275
}
276276

277277
define void @f7_2(i1 %c) {
278-
; NOT_CGSCC_NPM: Function Attrs: nounwind willreturn
279-
; NOT_CGSCC_NPM-LABEL: define {{[^@]+}}@f7_2
280-
; NOT_CGSCC_NPM-SAME: (i1 [[C:%.*]])
281-
; NOT_CGSCC_NPM-NEXT: [[PTR:%.*]] = tail call noundef nonnull align 4 dereferenceable(4) i32* @unkown_ptr()
282-
; NOT_CGSCC_NPM-NEXT: [[A:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(4) [[PTR]])
283-
; NOT_CGSCC_NPM-NEXT: [[ARG_A_0:%.*]] = load i32, i32* [[PTR]], align 4
284-
; NOT_CGSCC_NPM-NEXT: [[B:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(4) [[PTR]])
285-
; NOT_CGSCC_NPM-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
286-
; NOT_CGSCC_NPM: if.true:
287-
; NOT_CGSCC_NPM-NEXT: [[C:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
288-
; NOT_CGSCC_NPM-NEXT: [[D:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
289-
; NOT_CGSCC_NPM-NEXT: [[E:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
290-
; NOT_CGSCC_NPM-NEXT: ret void
291-
; NOT_CGSCC_NPM: if.false:
292-
; NOT_CGSCC_NPM-NEXT: ret void
293-
;
294-
; IS__CGSCC_NPM: Function Attrs: nounwind willreturn
295-
; IS__CGSCC_NPM-LABEL: define {{[^@]+}}@f7_2
296-
; IS__CGSCC_NPM-SAME: (i1 [[C:%.*]])
297-
; IS__CGSCC_NPM-NEXT: [[PTR:%.*]] = tail call nonnull align 4 dereferenceable(4) i32* @unkown_ptr()
298-
; IS__CGSCC_NPM-NEXT: [[A:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(4) [[PTR]])
299-
; IS__CGSCC_NPM-NEXT: [[ARG_A_0:%.*]] = load i32, i32* [[PTR]], align 4
300-
; IS__CGSCC_NPM-NEXT: [[B:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(4) [[PTR]])
301-
; IS__CGSCC_NPM-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
302-
; IS__CGSCC_NPM: if.true:
303-
; IS__CGSCC_NPM-NEXT: [[C:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
304-
; IS__CGSCC_NPM-NEXT: [[D:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
305-
; IS__CGSCC_NPM-NEXT: [[E:%.*]] = tail call i32 @unkown_f(i32* noundef nonnull align 4 dereferenceable(8) [[PTR]])
306-
; IS__CGSCC_NPM-NEXT: ret void
307-
; IS__CGSCC_NPM: if.false:
308-
; IS__CGSCC_NPM-NEXT: ret void
278+
; CHECK: Function Attrs: nounwind willreturn
279+
; CHECK-LABEL: define {{[^@]+}}@f7_2
280+
; CHECK-SAME: (i1 [[C:%.*]])
281+
; CHECK-NEXT: [[PTR:%.*]] = tail call nonnull align 4 dereferenceable(4) i32* @unkown_ptr()
282+
; CHECK-NEXT: [[A:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])
283+
; CHECK-NEXT: [[ARG_A_0:%.*]] = load i32, i32* [[PTR]], align 4
284+
; CHECK-NEXT: [[B:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(4) [[PTR]])
285+
; CHECK-NEXT: br i1 [[C]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
286+
; CHECK: if.true:
287+
; CHECK-NEXT: [[C:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])
288+
; CHECK-NEXT: [[D:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])
289+
; CHECK-NEXT: [[E:%.*]] = tail call i32 @unkown_f(i32* nonnull align 4 dereferenceable(8) [[PTR]])
290+
; CHECK-NEXT: ret void
291+
; CHECK: if.false:
292+
; CHECK-NEXT: ret void
309293
;
310294
%ptr = tail call i32* @unkown_ptr()
311295
%A = tail call i32 @unkown_f(i32* %ptr)
@@ -1033,41 +1017,23 @@ define void @nonnull_assume_call(i8* %arg1, i8* %arg2, i8* %arg3, i8* %arg4) {
10331017
; ATTRIBUTOR-NEXT: call void @unknown()
10341018
; ATTRIBUTOR-NEXT: ret void
10351019
;
1036-
; NOT_CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_call
1037-
; NOT_CGSCC_OPM-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])
1038-
; NOT_CGSCC_OPM-NEXT: call void @unknown()
1039-
; NOT_CGSCC_OPM-NEXT: [[P:%.*]] = call noundef nonnull dereferenceable(101) i32* @unkown_ptr()
1040-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use32(i32* noundef nonnull dereferenceable(101) [[P]])
1041-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1042-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1043-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1044-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1045-
; NOT_CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG3]]), "dereferenceable"(i8* [[ARG1]], i64 1), "dereferenceable"(i8* [[ARG1]], i64 2), "dereferenceable"(i32* [[P]], i64 101), "dereferenceable_or_null"(i8* [[ARG2]], i64 31), "dereferenceable_or_null"(i8* [[ARG4]], i64 42) ]
1046-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1047-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1048-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1049-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1050-
; NOT_CGSCC_OPM-NEXT: call void @unknown_use32(i32* noundef nonnull dereferenceable(101) [[P]])
1051-
; NOT_CGSCC_OPM-NEXT: call void @unknown()
1052-
; NOT_CGSCC_OPM-NEXT: ret void
1053-
;
1054-
; IS__CGSCC_OPM-LABEL: define {{[^@]+}}@nonnull_assume_call
1055-
; IS__CGSCC_OPM-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])
1056-
; IS__CGSCC_OPM-NEXT: call void @unknown()
1057-
; IS__CGSCC_OPM-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) i32* @unkown_ptr()
1058-
; IS__CGSCC_OPM-NEXT: call void @unknown_use32(i32* noundef nonnull dereferenceable(101) [[P]])
1059-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1060-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1061-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1062-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1063-
; IS__CGSCC_OPM-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG3]]), "dereferenceable"(i8* [[ARG1]], i64 1), "dereferenceable"(i8* [[ARG1]], i64 2), "dereferenceable"(i32* [[P]], i64 101), "dereferenceable_or_null"(i8* [[ARG2]], i64 31), "dereferenceable_or_null"(i8* [[ARG4]], i64 42) ]
1064-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1065-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1066-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1067-
; IS__CGSCC_OPM-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1068-
; IS__CGSCC_OPM-NEXT: call void @unknown_use32(i32* noundef nonnull dereferenceable(101) [[P]])
1069-
; IS__CGSCC_OPM-NEXT: call void @unknown()
1070-
; IS__CGSCC_OPM-NEXT: ret void
1020+
; CHECK-LABEL: define {{[^@]+}}@nonnull_assume_call
1021+
; CHECK-SAME: (i8* [[ARG1:%.*]], i8* [[ARG2:%.*]], i8* [[ARG3:%.*]], i8* [[ARG4:%.*]])
1022+
; CHECK-NEXT: call void @unknown()
1023+
; CHECK-NEXT: [[P:%.*]] = call nonnull dereferenceable(101) i32* @unkown_ptr()
1024+
; CHECK-NEXT: call void @unknown_use32(i32* nonnull dereferenceable(101) [[P]])
1025+
; CHECK-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1026+
; CHECK-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1027+
; CHECK-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1028+
; CHECK-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1029+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG3]]), "dereferenceable"(i8* [[ARG1]], i64 1), "dereferenceable"(i8* [[ARG1]], i64 2), "dereferenceable"(i32* [[P]], i64 101), "dereferenceable_or_null"(i8* [[ARG2]], i64 31), "dereferenceable_or_null"(i8* [[ARG4]], i64 42) ]
1030+
; CHECK-NEXT: call void @unknown_use8(i8* nonnull dereferenceable(2) [[ARG1]])
1031+
; CHECK-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(31) [[ARG2]])
1032+
; CHECK-NEXT: call void @unknown_use8(i8* nonnull [[ARG3]])
1033+
; CHECK-NEXT: call void @unknown_use8(i8* dereferenceable_or_null(42) [[ARG4]])
1034+
; CHECK-NEXT: call void @unknown_use32(i32* nonnull dereferenceable(101) [[P]])
1035+
; CHECK-NEXT: call void @unknown()
1036+
; CHECK-NEXT: ret void
10711037
;
10721038
call void @unknown()
10731039
%p = call i32* @unkown_ptr()

0 commit comments

Comments
 (0)