Skip to content

Commit f338216

Browse files
committed
[FunctionAttrs] Add test for SCC with address only capture (NFC)
1 parent f49ee00 commit f338216

File tree

1 file changed

+67
-10
lines changed

1 file changed

+67
-10
lines changed

llvm/test/Transforms/FunctionAttrs/nocapture.ll

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
12341291
declare ptr @llvm.launder.invariant.group.p0(ptr)
12351292
declare ptr @llvm.strip.invariant.group.p0(ptr)

0 commit comments

Comments
 (0)