Skip to content

Commit f33310e

Browse files
authored
[Attributor][FIX] Ensure nonnull IR deduction is not optimistic (#93322)
We cannot use assumed dead information for nonnull IR-implied deduction as we will never go back and re-check. This was reported in #85810
1 parent 58df646 commit f33310e

File tree

2 files changed

+67
-35
lines changed

2 files changed

+67
-35
lines changed

llvm/lib/Transforms/IPO/AttributorAttributes.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2446,7 +2446,7 @@ bool AANonNull::isImpliedByIR(Attributor &A, const IRPosition &IRP,
24462446
return true;
24472447
},
24482448
IRP.getAssociatedFunction(), nullptr, {Instruction::Ret},
2449-
UsedAssumedInformation))
2449+
UsedAssumedInformation, false, /*CheckPotentiallyDead=*/true))
24502450
return false;
24512451
}
24522452

llvm/test/Transforms/Attributor/nonnull.ll

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ declare nonnull ptr @ret_nonnull()
99
declare void @llvm.assume(i1)
1010

1111
; Return a pointer trivially nonnull (call return attribute)
12+
;.
13+
; CHECK: @G = internal global i64 1, align 8
14+
;.
1215
define ptr @test1() {
1316
; CHECK-LABEL: define {{[^@]+}}@test1() {
1417
; CHECK-NEXT: [[RET:%.*]] = call nonnull ptr @ret_nonnull()
@@ -34,10 +37,10 @@ define ptr @test2A(i1 %c, ptr %ret) {
3437
; CHECK-SAME: (i1 noundef [[C:%.*]], ptr nofree nonnull readnone returned "no-capture-maybe-returned" [[RET:%.*]]) #[[ATTR2:[0-9]+]] {
3538
; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
3639
; CHECK: A:
37-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15:[0-9]+]] [ "nonnull"(ptr [[RET]]) ]
40+
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16:[0-9]+]] [ "nonnull"(ptr [[RET]]) ]
3841
; CHECK-NEXT: ret ptr [[RET]]
3942
; CHECK: B:
40-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[RET]]) ]
43+
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16]] [ "nonnull"(ptr [[RET]]) ]
4144
; CHECK-NEXT: ret ptr [[RET]]
4245
;
4346
br i1 %c, label %A, label %B
@@ -55,10 +58,10 @@ define ptr @test2B(i1 %c, ptr %ret) {
5558
; CHECK-SAME: (i1 noundef [[C:%.*]], ptr nofree nonnull readnone returned dereferenceable(4) "no-capture-maybe-returned" [[RET:%.*]]) #[[ATTR2]] {
5659
; CHECK-NEXT: br i1 [[C]], label [[A:%.*]], label [[B:%.*]]
5760
; CHECK: A:
58-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "dereferenceable"(ptr [[RET]], i32 4) ]
61+
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16]] [ "dereferenceable"(ptr [[RET]], i32 4) ]
5962
; CHECK-NEXT: ret ptr [[RET]]
6063
; CHECK: B:
61-
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "dereferenceable"(ptr [[RET]], i32 4) ]
64+
; CHECK-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16]] [ "dereferenceable"(ptr [[RET]], i32 4) ]
6265
; CHECK-NEXT: ret ptr [[RET]]
6366
;
6467
br i1 %c, label %A, label %B
@@ -274,7 +277,7 @@ define ptr @test10(ptr %a, i64 %n) {
274277
; CHECK-LABEL: define {{[^@]+}}@test10
275278
; CHECK-SAME: (ptr nofree readnone "no-capture-maybe-returned" [[A:%.*]], i64 [[N:%.*]]) #[[ATTR2]] {
276279
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[N]], 0
277-
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR15]]
280+
; CHECK-NEXT: call void @llvm.assume(i1 noundef [[CMP]]) #[[ATTR16]]
278281
; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[N]]
279282
; CHECK-NEXT: ret ptr [[B]]
280283
;
@@ -402,11 +405,11 @@ define internal ptr @f1(ptr %arg) {
402405
; TUNIT-NEXT: br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]]
403406
; TUNIT: bb4:
404407
; TUNIT-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
405-
; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR16:[0-9]+]]
408+
; TUNIT-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR17:[0-9]+]]
406409
; TUNIT-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1
407410
; TUNIT-NEXT: br label [[BB9]]
408411
; TUNIT: bb6:
409-
; TUNIT-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
412+
; TUNIT-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR17]]
410413
; TUNIT-NEXT: ret ptr [[TMP7]]
411414
; TUNIT: bb9:
412415
; TUNIT-NEXT: [[TMP10:%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
@@ -424,11 +427,11 @@ define internal ptr @f1(ptr %arg) {
424427
; CGSCC-NEXT: br i1 [[TMP3]], label [[BB6:%.*]], label [[BB4:%.*]]
425428
; CGSCC: bb4:
426429
; CGSCC-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[ARG]], i64 1
427-
; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR16:[0-9]+]]
430+
; CGSCC-NEXT: [[TMP5B:%.*]] = tail call ptr @f3(ptr nofree nonnull readonly [[TMP5]]) #[[ATTR17:[0-9]+]]
428431
; CGSCC-NEXT: [[TMP5C:%.*]] = getelementptr inbounds i32, ptr [[TMP5B]], i64 -1
429432
; CGSCC-NEXT: br label [[BB9]]
430433
; CGSCC: bb6:
431-
; CGSCC-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR16]]
434+
; CGSCC-NEXT: [[TMP7:%.*]] = tail call ptr @f2(ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG]]) #[[ATTR17]]
432435
; CGSCC-NEXT: ret ptr [[TMP7]]
433436
; CGSCC: bb9:
434437
; CGSCC-NEXT: [[TMP10:%.*]] = phi ptr [ [[TMP5C]], [[BB4]] ], [ inttoptr (i64 4 to ptr), [[BB:%.*]] ]
@@ -464,14 +467,14 @@ define internal ptr @f2(ptr %arg) {
464467
; TUNIT-LABEL: define {{[^@]+}}@f2
465468
; TUNIT-SAME: (ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR6]] {
466469
; TUNIT-NEXT: bb:
467-
; TUNIT-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]]
470+
; TUNIT-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR17]]
468471
; TUNIT-NEXT: ret ptr [[TMP]]
469472
;
470473
; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: read)
471474
; CGSCC-LABEL: define {{[^@]+}}@f2
472475
; CGSCC-SAME: (ptr nofree nonnull readonly align 4 dereferenceable(4) [[ARG:%.*]]) #[[ATTR5]] {
473476
; CGSCC-NEXT: bb:
474-
; CGSCC-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]]
477+
; CGSCC-NEXT: [[TMP:%.*]] = tail call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR17]]
475478
; CGSCC-NEXT: ret ptr [[TMP]]
476479
;
477480
bb:
@@ -485,14 +488,14 @@ define dso_local noalias ptr @f3(ptr %arg) {
485488
; TUNIT-LABEL: define {{[^@]+}}@f3
486489
; TUNIT-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR6]] {
487490
; TUNIT-NEXT: bb:
488-
; TUNIT-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]]
491+
; TUNIT-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR17]]
489492
; TUNIT-NEXT: ret ptr [[TMP]]
490493
;
491494
; CGSCC: Function Attrs: nofree nosync nounwind memory(argmem: read)
492495
; CGSCC-LABEL: define {{[^@]+}}@f3
493496
; CGSCC-SAME: (ptr nofree readonly [[ARG:%.*]]) #[[ATTR5]] {
494497
; CGSCC-NEXT: bb:
495-
; CGSCC-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR16]]
498+
; CGSCC-NEXT: [[TMP:%.*]] = call ptr @f1(ptr nofree readonly [[ARG]]) #[[ATTR17]]
496499
; CGSCC-NEXT: ret ptr [[TMP]]
497500
;
498501
bb:
@@ -856,7 +859,7 @@ define i8 @parent6(ptr %a, ptr %b) {
856859
define i8 @parent7(ptr %a) {
857860
; CHECK-LABEL: define {{[^@]+}}@parent7
858861
; CHECK-SAME: (ptr nonnull [[A:%.*]]) {
859-
; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull readonly [[A]]) #[[ATTR17:[0-9]+]]
862+
; CHECK-NEXT: [[RET:%.*]] = call i8 @use1safecall(ptr nonnull readonly [[A]]) #[[ATTR18:[0-9]+]]
860863
; CHECK-NEXT: call void @use1nonnull(ptr nonnull [[A]])
861864
; CHECK-NEXT: ret i8 [[RET]]
862865
;
@@ -981,7 +984,7 @@ define ptr @g1() {
981984
; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(none)
982985
; CGSCC-LABEL: define {{[^@]+}}@g1
983986
; CGSCC-SAME: () #[[ATTR10:[0-9]+]] {
984-
; CGSCC-NEXT: [[C:%.*]] = call noundef nonnull align 4 ptr @g2() #[[ATTR18:[0-9]+]]
987+
; CGSCC-NEXT: [[C:%.*]] = call noundef nonnull align 4 ptr @g2() #[[ATTR19:[0-9]+]]
985988
; CGSCC-NEXT: ret ptr [[C]]
986989
;
987990
%c = call ptr @g2()
@@ -1392,7 +1395,7 @@ define ptr @mybasename(ptr nofree readonly %str) {
13921395
; TUNIT: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(read)
13931396
; TUNIT-LABEL: define {{[^@]+}}@mybasename
13941397
; TUNIT-SAME: (ptr nofree readonly [[STR:%.*]]) #[[ATTR14:[0-9]+]] {
1395-
; TUNIT-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR18:[0-9]+]]
1398+
; TUNIT-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR19:[0-9]+]]
13961399
; TUNIT-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[CALL]], null
13971400
; TUNIT-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 1
13981401
; TUNIT-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], ptr [[ADD_PTR]], ptr [[STR]]
@@ -1401,7 +1404,7 @@ define ptr @mybasename(ptr nofree readonly %str) {
14011404
; CGSCC: Function Attrs: mustprogress nofree nosync nounwind willreturn memory(read)
14021405
; CGSCC-LABEL: define {{[^@]+}}@mybasename
14031406
; CGSCC-SAME: (ptr nofree readonly [[STR:%.*]]) #[[ATTR14:[0-9]+]] {
1404-
; CGSCC-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR19:[0-9]+]]
1407+
; CGSCC-NEXT: [[CALL:%.*]] = call ptr @strrchr(ptr nofree readonly [[STR]], i32 noundef 47) #[[ATTR20:[0-9]+]]
14051408
; CGSCC-NEXT: [[TOBOOL:%.*]] = icmp ne ptr [[CALL]], null
14061409
; CGSCC-NEXT: [[ADD_PTR:%.*]] = getelementptr inbounds i8, ptr [[CALL]], i64 1
14071410
; CGSCC-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], ptr [[ADD_PTR]], ptr [[STR]]
@@ -1424,14 +1427,14 @@ define void @nonnull_assume_pos(ptr %arg) {
14241427
;
14251428
; TUNIT-LABEL: define {{[^@]+}}@nonnull_assume_pos
14261429
; TUNIT-SAME: (ptr nocapture nofree nonnull readnone [[ARG:%.*]]) {
1427-
; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[ARG]]) ]
1430+
; TUNIT-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16]] [ "nonnull"(ptr [[ARG]]) ]
14281431
; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[ARG]]) #[[ATTR5]]
14291432
; TUNIT-NEXT: [[TMP1:%.*]] = call ptr @unknown()
14301433
; TUNIT-NEXT: ret void
14311434
;
14321435
; CGSCC-LABEL: define {{[^@]+}}@nonnull_assume_pos
14331436
; CGSCC-SAME: (ptr nocapture nofree nonnull readnone [[ARG:%.*]]) {
1434-
; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR15]] [ "nonnull"(ptr [[ARG]]) ]
1437+
; CGSCC-NEXT: call void @llvm.assume(i1 noundef true) #[[ATTR16]] [ "nonnull"(ptr [[ARG]]) ]
14351438
; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[ARG]]) #[[ATTR4]]
14361439
; CGSCC-NEXT: [[TMP1:%.*]] = call ptr @unknown()
14371440
; CGSCC-NEXT: ret void
@@ -1553,14 +1556,14 @@ define void @phi_caller(ptr %p) {
15531556
; TUNIT: Function Attrs: nounwind
15541557
; TUNIT-LABEL: define {{[^@]+}}@phi_caller
15551558
; TUNIT-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] {
1556-
; TUNIT-NEXT: [[C:%.*]] = call nonnull ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR19:[0-9]+]]
1559+
; TUNIT-NEXT: [[C:%.*]] = call nonnull ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR20:[0-9]+]]
15571560
; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[C]]) #[[ATTR5]]
15581561
; TUNIT-NEXT: ret void
15591562
;
15601563
; CGSCC: Function Attrs: nounwind
15611564
; CGSCC-LABEL: define {{[^@]+}}@phi_caller
15621565
; CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4]] {
1563-
; CGSCC-NEXT: [[C:%.*]] = call nonnull ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR20:[0-9]+]]
1566+
; CGSCC-NEXT: [[C:%.*]] = call nonnull ptr @phi(ptr noalias nofree readnone [[P]]) #[[ATTR21:[0-9]+]]
15641567
; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[C]]) #[[ATTR4]]
15651568
; CGSCC-NEXT: ret void
15661569
;
@@ -1593,14 +1596,14 @@ define void @multi_ret_caller(ptr %p) {
15931596
; TUNIT: Function Attrs: nounwind
15941597
; TUNIT-LABEL: define {{[^@]+}}@multi_ret_caller
15951598
; TUNIT-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] {
1596-
; TUNIT-NEXT: [[C:%.*]] = call nonnull ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR19]]
1599+
; TUNIT-NEXT: [[C:%.*]] = call nonnull ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR20]]
15971600
; TUNIT-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[C]]) #[[ATTR5]]
15981601
; TUNIT-NEXT: ret void
15991602
;
16001603
; CGSCC: Function Attrs: nounwind
16011604
; CGSCC-LABEL: define {{[^@]+}}@multi_ret_caller
16021605
; CGSCC-SAME: (ptr nofree [[P:%.*]]) #[[ATTR4]] {
1603-
; CGSCC-NEXT: [[C:%.*]] = call nonnull ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR20]]
1606+
; CGSCC-NEXT: [[C:%.*]] = call nonnull ptr @multi_ret(ptr noalias nofree readnone [[P]]) #[[ATTR21]]
16041607
; CGSCC-NEXT: call void @use_i8_ptr(ptr noalias nocapture nofree nonnull readnone [[C]]) #[[ATTR4]]
16051608
; CGSCC-NEXT: ret void
16061609
;
@@ -1609,6 +1612,33 @@ define void @multi_ret_caller(ptr %p) {
16091612
ret void
16101613
}
16111614

1615+
; From https://github.com/llvm/llvm-project/pull/85810
1616+
@G = internal global i64 1, align 8
1617+
define dso_local ptr @update_global_in_alive_bb() {
1618+
; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
1619+
; CHECK-LABEL: define {{[^@]+}}@update_global_in_alive_bb
1620+
; CHECK-SAME: () #[[ATTR15:[0-9]+]] {
1621+
; CHECK-NEXT: entry:
1622+
; CHECK-NEXT: [[TMP0:%.*]] = load i64, ptr @G, align 8
1623+
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i64 [[TMP0]], 0
1624+
; CHECK-NEXT: br i1 [[CMP]], label [[IF_THEN:%.*]], label [[IF_ELSE:%.*]]
1625+
; CHECK: if.then:
1626+
; CHECK-NEXT: store i64 0, ptr @G, align 8
1627+
; CHECK-NEXT: ret ptr inttoptr (i64 5 to ptr)
1628+
; CHECK: if.else:
1629+
; CHECK-NEXT: ret ptr null
1630+
;
1631+
entry:
1632+
%0 = load i64, ptr @G, align 8
1633+
%cmp = icmp ne i64 %0, 0
1634+
br i1 %cmp, label %if.then, label %if.else
1635+
if.then:
1636+
store i64 0, ptr @G, align 8
1637+
ret ptr inttoptr (i64 5 to ptr)
1638+
if.else:
1639+
ret ptr null
1640+
}
1641+
16121642
attributes #0 = { null_pointer_is_valid }
16131643
attributes #1 = { nounwind willreturn}
16141644
;.
@@ -1627,11 +1657,12 @@ attributes #1 = { nounwind willreturn}
16271657
; TUNIT: attributes #[[ATTR12]] = { noinline optnone }
16281658
; TUNIT: attributes #[[ATTR13:[0-9]+]] = { nofree nounwind willreturn memory(read) }
16291659
; TUNIT: attributes #[[ATTR14]] = { mustprogress nofree nosync nounwind willreturn memory(read) }
1630-
; TUNIT: attributes #[[ATTR15]] = { nofree willreturn memory(write) }
1631-
; TUNIT: attributes #[[ATTR16]] = { nofree nosync nounwind memory(read) }
1632-
; TUNIT: attributes #[[ATTR17]] = { nosync willreturn memory(read) }
1633-
; TUNIT: attributes #[[ATTR18]] = { nofree nosync willreturn memory(read) }
1634-
; TUNIT: attributes #[[ATTR19]] = { nofree nosync nounwind willreturn memory(none) }
1660+
; TUNIT: attributes #[[ATTR15]] = { mustprogress nofree norecurse nosync nounwind willreturn }
1661+
; TUNIT: attributes #[[ATTR16]] = { nofree willreturn memory(write) }
1662+
; TUNIT: attributes #[[ATTR17]] = { nofree nosync nounwind memory(read) }
1663+
; TUNIT: attributes #[[ATTR18]] = { nosync willreturn memory(read) }
1664+
; TUNIT: attributes #[[ATTR19]] = { nofree nosync willreturn memory(read) }
1665+
; TUNIT: attributes #[[ATTR20]] = { nofree nosync nounwind willreturn memory(none) }
16351666
;.
16361667
; CGSCC: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: write) }
16371668
; CGSCC: attributes #[[ATTR1]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
@@ -1648,10 +1679,11 @@ attributes #1 = { nounwind willreturn}
16481679
; CGSCC: attributes #[[ATTR12]] = { noinline optnone }
16491680
; CGSCC: attributes #[[ATTR13:[0-9]+]] = { nofree nounwind willreturn memory(read) }
16501681
; CGSCC: attributes #[[ATTR14]] = { mustprogress nofree nosync nounwind willreturn memory(read) }
1651-
; CGSCC: attributes #[[ATTR15]] = { nofree willreturn memory(write) }
1652-
; CGSCC: attributes #[[ATTR16]] = { nofree nosync nounwind memory(read) }
1653-
; CGSCC: attributes #[[ATTR17]] = { nosync willreturn memory(read) }
1654-
; CGSCC: attributes #[[ATTR18]] = { nofree nosync willreturn }
1655-
; CGSCC: attributes #[[ATTR19]] = { nofree nosync willreturn memory(read) }
1656-
; CGSCC: attributes #[[ATTR20]] = { nofree willreturn }
1682+
; CGSCC: attributes #[[ATTR15]] = { mustprogress nofree norecurse nosync nounwind willreturn }
1683+
; CGSCC: attributes #[[ATTR16]] = { nofree willreturn memory(write) }
1684+
; CGSCC: attributes #[[ATTR17]] = { nofree nosync nounwind memory(read) }
1685+
; CGSCC: attributes #[[ATTR18]] = { nosync willreturn memory(read) }
1686+
; CGSCC: attributes #[[ATTR19]] = { nofree nosync willreturn }
1687+
; CGSCC: attributes #[[ATTR20]] = { nofree nosync willreturn memory(read) }
1688+
; CGSCC: attributes #[[ATTR21]] = { nofree willreturn }
16571689
;.

0 commit comments

Comments
 (0)