Lines Matching refs:nonnull
10 declare nonnull i8* @ret_nonnull()
13 ; Return a pointer trivially nonnull (call return attribute)
16 ; CHECK-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
23 ; Return a pointer trivially nonnull (argument attribute)
24 define i8* @test2(i8* nonnull %p) {
27 ; CHECK-SAME: (i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[P:%.*]]) #[[ATTR1…
36 ; CHECK-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned "no-capture-maybe-returned" [[RET…
39 ; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13:[0-9]+]] [ "nonnull"(i8* [[RET]]…
42 ; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(i8* [[RET]]) ]
47 call void @llvm.assume(i1 true) [ "nonnull"(i8* %ret) ]
50 call void @llvm.assume(i1 true) [ "nonnull"(i8* %ret) ]
57 ; CHECK-SAME: (i1 [[C:%.*]], i8* nofree nonnull readnone returned dereferenceable(4) "no-capture-ma…
75 ; Given an SCC where one of the functions can not be marked nonnull,
76 ; can we still mark the other one which is trivially nonnull
108 ; CHECK-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
117 ; nonnull if neither can ever return null. (In this case, they
150 ; make sure we haven't marked them as nonnull.
232 ; IS________OPM-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
243 ; IS________NPM-NEXT: [[RET:%.*]] = call nonnull i8* @ret_nonnull()
294 ; ATTRIBUTOR_NPM: define nonnull i8* @test10
312 ; return p? p: nonnull();
314 ; FIXME: missing nonnull
342 define void @test12(i8* nonnull %a) {
344 ; CHECK-SAME: (i8* nonnull [[A:%.*]]) {
345 ; CHECK-NEXT: tail call void @test12_helper(i8* nonnull [[A]])
357 ; NOT_CGSCC_NPM-NEXT: [[NONNULLPTR:%.*]] = tail call nonnull i8* @ret_nonnull()
359 …void @test13(i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture n…
360 …apture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture nofree readnone [[MAYBENULLPT…
364 ; IS__CGSCC_NPM-NEXT: [[NONNULLPTR:%.*]] = tail call nonnull i8* @ret_nonnull()
366 …void @test13(i8* noalias nocapture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture n…
367 …apture nofree nonnull readnone [[NONNULLPTR]], i8* noalias nocapture nofree readnone [[MAYBENULLPT…
380 ; NOT_CGSCC_NPM-SAME: (i8* noalias nocapture nofree nonnull readnone [[A:%.*]], i8* noalias nocaptu…
381 ; NOT_CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[A]])…
388 ; IS__CGSCC_NPM-SAME: (i8* noalias nocapture nofree nonnull readnone [[A:%.*]], i8* noalias nocaptu…
389 ; IS__CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[A]])…
400 declare nonnull i8* @nonnull()
404 ; Argument of f1, f2, f3 can be marked with nonnull.
407 ; 1. In f1:bb6, %arg can be marked with nonnull because of the comparison in bb1
408 ; 2. Because f2 is internal function, f2(i32* %arg) -> @f2(i32* nonnull %arg)
409 ; 3. In f1:bb4 %tmp5 is nonnull and f3 is internal function.
410 ; Then, f3(i32* %arg) -> @f3(i32* nonnull %arg)
411 ; 4. We get nonnull in whole f1 call sites so f1(i32* %arg) -> @f1(i32* nonnull %arg)
415 ; FIXME: missing nonnull It should be nonnull @f1(i32* nonnull readonly %arg)
428 ; NOT_CGSCC_NPM-NEXT: [[TMP5B:%.*]] = tail call i32* @f3(i32* nofree nonnull readonly [[TMP5]]) …
432 ; NOT_CGSCC_NPM-NEXT: [[TMP7:%.*]] = tail call i32* @f2(i32* nofree nonnull readonly align 4 der…
450 ; IS__CGSCC_NPM-NEXT: [[TMP5B:%.*]] = tail call i32* @f3(i32* nofree nonnull readonly [[TMP5]]) …
454 ; IS__CGSCC_NPM-NEXT: [[TMP7:%.*]] = tail call i32* @f2(i32* nofree nonnull readonly align 4 der…
488 ; NOT_CGSCC_NPM-SAME: (i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR…
495 ; IS__CGSCC_NPM-SAME: (i32* nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR…
506 ; FIXME: missing nonnull. It should be nonnull @f3(i32* nonnull readonly %arg)
522 ; FIXME: missing nonnull. It should be @f1(i32* nonnull readonly %arg)
530 ; CHECK-SAME: (i8* noundef nonnull dereferenceable(4) [[ARG:%.*]]) {
531 ; CHECK-NEXT: tail call void @use1(i8* noundef nonnull dereferenceable(4) [[ARG]])
545 ; fun2(nonnull %a, nonnull %b)
547 ; fun2(nonnull %a, %b)
548 ; We can say that %a is nonnull but %b is not.
552 ; NOT_CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7:[0-9]+]] {
556 ; NOT_CGSCC_NPM-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* nonnull [[B]]) #[[ATTR7]]
559 ; NOT_CGSCC_NPM-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* [[B]]) #[[ATTR7]]
564 ; IS__CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]]) #[[ATTR6:[0-9]+]] {
568 ; IS__CGSCC_NPM-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* nonnull [[B]]) #[[ATTR6]]
571 ; IS__CGSCC_NPM-NEXT: tail call void @fun2(i8* nonnull [[A]], i8* [[B]]) #[[ATTR6]]
577 tail call void @fun2(i8* nonnull %a, i8* nonnull %b)
580 tail call void @fun2(i8* nonnull %a, i8* %b)
588 ; fun1(nonnull %a)
589 ; We can say that %a is nonnull
594 ; NOT_CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR7]] {
604 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR7]]
609 ; IS__CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8 [[C:%.*]]) #[[ATTR6]] {
619 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR6]]
631 tail call void @fun1(i8* nonnull %a)
643 ; fun1(nonnull %a)
648 ; NOT_CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]]) #[[ATTR7]] {
661 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR7]]
667 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR7]]
672 ; IS__CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8 [[C:%.*]]) #[[ATTR6]] {
685 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR6]]
691 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR6]]
706 tail call void @fun1(i8* nonnull %b)
712 tail call void @fun1(i8* nonnull %a)
721 ; NOT_CGSCC_NPM-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8 [[C:%.*]]) #[[ATTR5]] {
727 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR5]]
728 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR5]]
731 ; NOT_CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR5]]
736 ; IS__CGSCC_NPM-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8 [[C:%.*]]) #[[ATTR4]] {
742 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR4]]
743 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[A]]) #[[ATTR4]]
746 ; IS__CGSCC_NPM-NEXT: tail call void @fun1(i8* nonnull [[B]]) #[[ATTR4]]
754 tail call void @fun1(i8* nonnull %b)
755 tail call void @fun1(i8* nonnull %a)
758 tail call void @fun1(i8* nonnull %b)
762 ; Test propagation of nonnull callsite args back to caller.
768 declare void @use1nonnull(i8* nonnull %x);
769 declare void @use2nonnull(i8* nonnull %x, i8* nonnull %y);
770 declare void @use3nonnull(i8* nonnull %x, i8* nonnull %y, i8* nonnull %z);
780 ; CHECK-NEXT: call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])
792 ; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]]) {
793 ; CHECK-NEXT: call void @use3nonnull(i8* nonnull [[B]], i8* nonnull [[C]], i8* nonnull [[A]])
794 ; CHECK-NEXT: call void @use3(i8* nonnull [[C]], i8* nonnull [[A]], i8* nonnull [[B]])
807 ; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* [[B:%.*]], i8* [[C:%.*]]) {
808 ; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
809 ; CHECK-NEXT: call void @use3(i8* [[C]], i8* [[B]], i8* nonnull [[A]])
823 ; CHECK-SAME: (i8* [[A:%.*]], i8* nonnull [[B:%.*]], i8* nonnull [[C:%.*]]) {
824 ; CHECK-NEXT: call void @use2nonnull(i8* nonnull [[C]], i8* nonnull [[B]])
825 ; CHECK-NEXT: call void @use2(i8* [[A]], i8* nonnull [[C]])
826 ; CHECK-NEXT: call void @use1(i8* nonnull [[B]])
847 ; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
866 ; CHECK-SAME: (i8* nonnull [[A:%.*]], i8* nofree noundef [[B:%.*]]) {
868 ; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
877 ; The nonnull callsite is guaranteed to execute, so the argument must be nonnull throughout the par…
881 ; CHECK-SAME: (i8* nonnull [[A:%.*]]) {
882 ; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(i8* nonnull readonly [[A]]) #[[ATTR15:[0-9]+]]
883 ; CHECK-NEXT: call void @use1nonnull(i8* nonnull [[A]])
900 ; NOT_CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* nocapture nofree readnone [[BOGUS1:%.*]], i8* non…
902 ; NOT_CGSCC_NPM-NEXT: invoke void @use2nonnull(i8* nonnull [[A]], i8* nonnull [[B]])
913 ; IS__CGSCC_NPM-SAME: (i8* nonnull [[A:%.*]], i8* nocapture nofree readnone [[BOGUS1:%.*]], i8* non…
915 ; IS__CGSCC_NPM-NEXT: invoke void @use2nonnull(i8* nonnull [[A]], i8* nonnull [[B]])
951 ; Should't be able to derive nonnull based on gep.
979 ; FIXME: We should propagate dereferenceable here but *not* nonnull
983 ; CHECK-SAME: (i32 addrspace(3)* nofree nonnull readnone returned dereferenceable(4) "no-capture-ma…
1008 ; IS__CGSCC_OPM-NEXT: [[C:%.*]] = call noundef nonnull align 4 i32* @g2() #[[ATTR16:[0-9]+]]
1014 ; IS__CGSCC_NPM-NEXT: [[C:%.*]] = call noundef nonnull align 4 i32* @g2() #[[ATTR16:[0-9]+]]
1025 ; NOT_CGSCC_NPM-SAME: (i32* noalias nocapture nonnull readnone [[A:%.*]]) #[[ATTR5]] {
1026 ; NOT_CGSCC_NPM-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]]) #[[A…
1031 ; IS__CGSCC_NPM-SAME: (i32* noalias nocapture nonnull readnone [[A:%.*]]) #[[ATTR4]] {
1032 ; IS__CGSCC_NPM-NEXT: call void @use_i32_ptr(i32* noalias nocapture nonnull readnone [[A]]) #[[A…
1040 define weak_odr void @weak_caller(i32* nonnull %a) {
1043 ; NOT_CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]]) {
1044 ; NOT_CGSCC_NPM-NEXT: call void @called_by_weak(i32* noalias nocapture nonnull readnone [[A]]) #…
1048 ; IS__CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]]) {
1049 ; IS__CGSCC_NPM-NEXT: call void @called_by_weak(i32* noalias nocapture nonnull readnone [[A]]) #…
1056 ; Expect nonnull
1060 ; NOT_CGSCC_NPM-SAME: (i32* noalias nocapture noundef nonnull readnone align 16 dereferenceable(8) …
1061 ; NOT_CGSCC_NPM-NEXT: call void @use_i32_ptr(i32* noalias nocapture noundef nonnull readnone ali…
1066 ; IS__CGSCC_NPM-SAME: (i32* noalias nocapture noundef nonnull readnone align 16 dereferenceable(8) …
1067 ; IS__CGSCC_NPM-NEXT: call void @use_i32_ptr(i32* noalias nocapture noundef nonnull readnone ali…
1073 ; Avoid nonnull as we do not touch naked functions
1084 ; Avoid nonnull as we do not touch optnone
1096 define void @make_live(i32* nonnull dereferenceable(8) %a) {
1098 ; NOT_CGSCC_NPM-SAME: (i32* noundef nonnull align 16 dereferenceable(8) [[A:%.*]]) {
1099 ; NOT_CGSCC_NPM-NEXT: call void @naked(i32* noundef nonnull align 16 dereferenceable(8) [[A]])
1100 ; NOT_CGSCC_NPM-NEXT: call void @control(i32* noalias nocapture noundef nonnull readnone align 1…
1101 ; NOT_CGSCC_NPM-NEXT: call void @optnone(i32* noundef nonnull align 16 dereferenceable(8) [[A]])
1105 ; IS__CGSCC_NPM-SAME: (i32* noundef nonnull align 16 dereferenceable(8) [[A:%.*]]) {
1106 ; IS__CGSCC_NPM-NEXT: call void @naked(i32* noundef nonnull align 16 dereferenceable(8) [[A]])
1107 ; IS__CGSCC_NPM-NEXT: call void @control(i32* noalias nocapture noundef nonnull readnone align 1…
1108 ; IS__CGSCC_NPM-NEXT: call void @optnone(i32* noundef nonnull align 16 dereferenceable(8) [[A]])
1111 call void @naked(i32* nonnull dereferenceable(8) align 16 %a)
1112 call void @control(i32* nonnull dereferenceable(8) align 16 %a)
1113 call void @optnone(i32* nonnull dereferenceable(8) align 16 %a)
1122 ; return g(nonnull u);
1135 ; IS________OPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR5]]
1151 ; IS__TUNIT_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR7]]
1167 ; IS__CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR6]]
1181 %tmp5 = tail call i32 @g(i32* nonnull %a)
1201 ; IS________OPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR5]]
1219 ; IS__TUNIT_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR7]]
1237 ; IS__CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR6]]
1253 %tmp5 = tail call i32 @g(i32* nonnull %a)
1271 ; NOT_CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1276 ; NOT_CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR5]]
1280 ; NOT_CGSCC_NPM-NEXT: tail call void @h(i32* nonnull [[A]]) #[[ATTR5]]
1287 ; IS__CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] {
1292 ; IS__CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR4]]
1296 ; IS__CGSCC_NPM-NEXT: tail call void @h(i32* nonnull [[A]]) #[[ATTR4]]
1306 %tmp5 = tail call i32 @g(i32* nonnull %a)
1321 ; NOT_CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR7]] {
1326 ; NOT_CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR5]]
1330 ; NOT_CGSCC_NPM-NEXT: tail call void @h(i32* nonnull [[A]]) #[[ATTR5]]
1339 ; IS__CGSCC_NPM-SAME: (i32* nonnull [[A:%.*]], i32 [[B:%.*]]) #[[ATTR6]] {
1344 ; IS__CGSCC_NPM-NEXT: [[TMP5:%.*]] = tail call i32 @g(i32* nonnull [[A]]) #[[ATTR4]]
1348 ; IS__CGSCC_NPM-NEXT: tail call void @h(i32* nonnull [[A]]) #[[ATTR4]]
1360 %tmp5 = tail call i32 @g(i32* nonnull %a)
1407 ; IS________NPM-NEXT: tail call void @sink(i32* nonnull [[TMP6]])
1462 ; IS________NPM-NEXT: tail call void @sink(i32* nonnull [[TMP6]])
1488 ; We should not mark the return of @strrchr as `nonnull`, it may well be NULL!
1508 ; ATTRIBUTOR-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]])
1509 ; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) #11 [ "nonnull"(i8* [[ARG]]) ]
1510 ; ATTRIBUTOR-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
1515 ; NOT_CGSCC_NPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]]) {
1516 ; NOT_CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(i8* [[ARG]…
1517 ; NOT_CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]…
1522 ; IS__CGSCC_NPM-SAME: (i8* nocapture nofree nonnull readnone [[ARG:%.*]]) {
1523 ; IS__CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR13]] [ "nonnull"(i8* [[ARG]…
1524 ; IS__CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]…
1528 call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
1538 ; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
1539 ; ATTRIBUTOR-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]])
1541 ; ATTRIBUTOR-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG…
1542 ; ATTRIBUTOR-NEXT: call void @llvm.assume(i1 true) [ "nonnull"(i8* [[ARG]]) ]
1543 ; ATTRIBUTOR-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[ARG…
1551 ; NOT_CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(i8* [[ARG]]) ]
1552 ; NOT_CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]…
1554 ; NOT_CGSCC_NPM-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[…
1555 ; NOT_CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(i8* [[ARG]]) ]
1556 ; NOT_CGSCC_NPM-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[…
1563 ; IS__CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(i8* [[ARG]]) ]
1564 ; IS__CGSCC_NPM-NEXT: call void @use_i8_ptr(i8* noalias nocapture nofree nonnull readnone [[ARG]…
1566 ; IS__CGSCC_NPM-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[…
1567 ; IS__CGSCC_NPM-NEXT: call void @llvm.assume(i1 noundef true) [ "nonnull"(i8* [[ARG]]) ]
1568 ; IS__CGSCC_NPM-NEXT: call void @use_i8_ptr_ret(i8* noalias nocapture nofree nonnull readnone [[…
1573 call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
1577 call void @llvm.assume(i1 true) ["nonnull"(i8* %arg)]
1605 ; FIXME: nonnull should not be propagated to the caller's p unless there is noundef
1608 ; CHECK-SAME: (i8* nonnull [[P:%.*]]) {
1609 ; CHECK-NEXT: call void @nonnull_callee(i8* nonnull [[P]])
1616 declare void @nonnull_callee(i8* nonnull %p)