@@ -46,7 +46,7 @@ define void @c3(ptr %q) {
4646; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
4747; ATTRIBUTOR-LABEL: define void @c3
4848; ATTRIBUTOR-SAME: (ptr nofree writeonly [[Q:%.*]]) #[[ATTR1]] {
49- ; ATTRIBUTOR-NEXT: call void @c2(ptr nofree writeonly [[Q]]) #[[ATTR18 :[0-9]+]]
49+ ; ATTRIBUTOR-NEXT: call void @c2(ptr nofree writeonly [[Q]]) #[[ATTR19 :[0-9]+]]
5050; ATTRIBUTOR-NEXT: ret void
5151;
5252 call void @c2 (ptr %q )
@@ -232,7 +232,7 @@ define i1 @c7(ptr %q, i32 %bitno) {
232232; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read)
233233; ATTRIBUTOR-LABEL: define i1 @c7
234234; ATTRIBUTOR-SAME: (ptr nofree readonly [[Q:%.*]], i32 [[BITNO:%.*]]) #[[ATTR2]] {
235- ; ATTRIBUTOR-NEXT: [[PTR:%.*]] = call ptr @lookup_bit(ptr nofree readnone [[Q]], i32 [[BITNO]]) #[[ATTR19 :[0-9]+]]
235+ ; ATTRIBUTOR-NEXT: [[PTR:%.*]] = call ptr @lookup_bit(ptr nofree readnone [[Q]], i32 [[BITNO]]) #[[ATTR20 :[0-9]+]]
236236; ATTRIBUTOR-NEXT: [[VAL:%.*]] = load i1, ptr [[PTR]], align 1
237237; ATTRIBUTOR-NEXT: ret i1 [[VAL]]
238238;
@@ -337,7 +337,7 @@ define void @nc2(ptr %p, ptr %q) {
337337; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
338338; ATTRIBUTOR-LABEL: define void @nc2
339339; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]], ptr nofree [[Q:%.*]]) #[[ATTR5]] {
340- ; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @nc1(ptr nofree [[Q]], ptr nofree captures(none) [[P]], i1 false) #[[ATTR20 :[0-9]+]]
340+ ; ATTRIBUTOR-NEXT: [[TMP1:%.*]] = call i32 @nc1(ptr nofree [[Q]], ptr nofree captures(none) [[P]], i1 false) #[[ATTR21 :[0-9]+]]
341341; ATTRIBUTOR-NEXT: ret void
342342;
343343 %1 = call i32 @nc1 (ptr %q , ptr %p , i1 0 ) ; <i32> [#uses=0]
@@ -389,7 +389,7 @@ define void @readonly_nounwind_willreturn(ptr %p) {
389389; ATTRIBUTOR: Function Attrs: mustprogress nosync nounwind willreturn memory(read)
390390; ATTRIBUTOR-LABEL: define void @readonly_nounwind_willreturn
391391; ATTRIBUTOR-SAME: (ptr readonly captures(none) [[P:%.*]]) #[[ATTR9:[0-9]+]] {
392- ; ATTRIBUTOR-NEXT: call void @external_willreturn(ptr readonly captures(none) [[P]]) #[[ATTR21 :[0-9]+]]
392+ ; ATTRIBUTOR-NEXT: call void @external_willreturn(ptr readonly captures(none) [[P]]) #[[ATTR22 :[0-9]+]]
393393; ATTRIBUTOR-NEXT: ret void
394394;
395395 call void @external_willreturn (ptr %p )
@@ -732,7 +732,7 @@ define void @nocaptureLaunder(ptr %p) {
732732; ATTRIBUTOR-LABEL: define void @nocaptureLaunder
733733; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) #[[ATTR12:[0-9]+]] {
734734; ATTRIBUTOR-NEXT: entry:
735- ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR22 :[0-9]+]]
735+ ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR23 :[0-9]+]]
736736; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1
737737; ATTRIBUTOR-NEXT: ret void
738738;
@@ -754,7 +754,7 @@ define void @captureLaunder(ptr %p) {
754754; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
755755; ATTRIBUTOR-LABEL: define void @captureLaunder
756756; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR5]] {
757- ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR22 ]]
757+ ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[P]]) #[[ATTR23 ]]
758758; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g2, align 8
759759; ATTRIBUTOR-NEXT: ret void
760760;
@@ -776,7 +776,7 @@ define void @nocaptureStrip(ptr %p) {
776776; ATTRIBUTOR-LABEL: define void @nocaptureStrip
777777; ATTRIBUTOR-SAME: (ptr nofree writeonly captures(none) [[P:%.*]]) #[[ATTR13:[0-9]+]] {
778778; ATTRIBUTOR-NEXT: entry:
779- ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR19 ]]
779+ ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR20 ]]
780780; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1
781781; ATTRIBUTOR-NEXT: ret void
782782;
@@ -798,7 +798,7 @@ define void @captureStrip(ptr %p) {
798798; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
799799; ATTRIBUTOR-LABEL: define void @captureStrip
800800; ATTRIBUTOR-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] {
801- ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR19 ]]
801+ ; ATTRIBUTOR-NEXT: [[B:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[P]]) #[[ATTR20 ]]
802802; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g3, align 8
803803; ATTRIBUTOR-NEXT: ret void
804804;
@@ -1033,13 +1033,13 @@ define void @readnone_indirec(ptr %f, ptr %p) {
10331033; FNATTRS: Function Attrs: nofree nosync memory(none)
10341034; FNATTRS-LABEL: define void @readnone_indirec
10351035; FNATTRS-SAME: (ptr readonly captures(none) [[F:%.*]], ptr readnone [[P:%.*]]) #[[ATTR19:[0-9]+]] {
1036- ; FNATTRS-NEXT: call void [[F]](ptr [[P]]) #[[ATTR22 :[0-9]+]]
1036+ ; FNATTRS-NEXT: call void [[F]](ptr [[P]]) #[[ATTR23 :[0-9]+]]
10371037; FNATTRS-NEXT: ret void
10381038;
10391039; ATTRIBUTOR: Function Attrs: nosync memory(none)
10401040; ATTRIBUTOR-LABEL: define void @readnone_indirec
10411041; ATTRIBUTOR-SAME: (ptr nofree nonnull readnone captures(none) [[F:%.*]], ptr readnone [[P:%.*]]) #[[ATTR15:[0-9]+]] {
1042- ; ATTRIBUTOR-NEXT: call void [[F]](ptr [[P]]) #[[ATTR23 :[0-9]+]]
1042+ ; ATTRIBUTOR-NEXT: call void [[F]](ptr [[P]]) #[[ATTR24 :[0-9]+]]
10431043; ATTRIBUTOR-NEXT: ret void
10441044;
10451045 call void %f (ptr %p ) readnone
@@ -1231,5 +1231,62 @@ define void @dont_increase_existing_captures_scc2(ptr %p) {
12311231 ret void
12321232}
12331233
1234+ define void @addr_only_scc (ptr %p ) {
1235+ ; FNATTRS: Function Attrs: nofree nosync nounwind memory(write, argmem: read, inaccessiblemem: none)
1236+ ; FNATTRS-LABEL: define void @addr_only_scc
1237+ ; FNATTRS-SAME: (ptr captures(address_is_null) [[P:%.*]]) #[[ATTR20:[0-9]+]] {
1238+ ; FNATTRS-NEXT: [[V:%.*]] = load i8, ptr [[P]], align 1
1239+ ; FNATTRS-NEXT: store i8 [[V]], ptr @g, align 1
1240+ ; FNATTRS-NEXT: call void @addr_only_scc2(ptr [[P]])
1241+ ; FNATTRS-NEXT: ret void
1242+ ;
1243+ ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind
1244+ ; ATTRIBUTOR-LABEL: define void @addr_only_scc
1245+ ; ATTRIBUTOR-SAME: (ptr nofree nonnull [[P:%.*]]) #[[ATTR16:[0-9]+]] {
1246+ ; ATTRIBUTOR-NEXT: [[V:%.*]] = load i8, ptr [[P]], align 1
1247+ ; ATTRIBUTOR-NEXT: store i8 [[V]], ptr @g, align 1
1248+ ; ATTRIBUTOR-NEXT: call void @addr_only_scc2(ptr nofree nonnull [[P]]) #[[ATTR16]]
1249+ ; ATTRIBUTOR-NEXT: ret void
1250+ ;
1251+ %v = load i8 , ptr %p
1252+ store i8 %v , ptr @g
1253+ call void @addr_only_scc2 (ptr %p )
1254+ ret void
1255+ }
1256+
1257+ define void @addr_only_scc2 (ptr %p ) {
1258+ ; FNATTRS: Function Attrs: nofree nosync nounwind memory(write, argmem: read, inaccessiblemem: none)
1259+ ; FNATTRS-LABEL: define void @addr_only_scc2
1260+ ; FNATTRS-SAME: (ptr captures(address_is_null) [[P:%.*]]) #[[ATTR20]] {
1261+ ; FNATTRS-NEXT: [[CMP:%.*]] = icmp ne ptr [[P]], null
1262+ ; FNATTRS-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
1263+ ; FNATTRS: if:
1264+ ; FNATTRS-NEXT: call void @addr_only_scc(ptr [[P]])
1265+ ; FNATTRS-NEXT: br label [[EXIT]]
1266+ ; FNATTRS: exit:
1267+ ; FNATTRS-NEXT: ret void
1268+ ;
1269+ ; ATTRIBUTOR: Function Attrs: nofree nosync nounwind
1270+ ; ATTRIBUTOR-LABEL: define void @addr_only_scc2
1271+ ; ATTRIBUTOR-SAME: (ptr nofree [[P:%.*]]) #[[ATTR16]] {
1272+ ; ATTRIBUTOR-NEXT: [[CMP:%.*]] = icmp ne ptr [[P]], null
1273+ ; ATTRIBUTOR-NEXT: br i1 [[CMP]], label [[IF:%.*]], label [[EXIT:%.*]]
1274+ ; ATTRIBUTOR: if:
1275+ ; ATTRIBUTOR-NEXT: call void @addr_only_scc(ptr nofree [[P]]) #[[ATTR16]]
1276+ ; ATTRIBUTOR-NEXT: br label [[EXIT]]
1277+ ; ATTRIBUTOR: exit:
1278+ ; ATTRIBUTOR-NEXT: ret void
1279+ ;
1280+ %cmp = icmp ne ptr %p , null
1281+ br i1 %cmp , label %if , label %exit
1282+
1283+ if:
1284+ call void @addr_only_scc (ptr %p )
1285+ br label %exit
1286+
1287+ exit:
1288+ ret void
1289+ }
1290+
12341291declare ptr @llvm.launder.invariant.group.p0 (ptr )
12351292declare ptr @llvm.strip.invariant.group.p0 (ptr )
0 commit comments