@@ -46,7 +46,7 @@ define void @c3(ptr %q) {
46
46
; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
47
47
; ATTRIBUTOR-LABEL: define void @c3
48
48
; 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]+]]
50
50
; ATTRIBUTOR-NEXT: ret void
51
51
;
52
52
call void @c2 (ptr %q )
@@ -232,7 +232,7 @@ define i1 @c7(ptr %q, i32 %bitno) {
232
232
; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(read)
233
233
; ATTRIBUTOR-LABEL: define i1 @c7
234
234
; 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]+]]
236
236
; ATTRIBUTOR-NEXT: [[VAL:%.*]] = load i1, ptr [[PTR]], align 1
237
237
; ATTRIBUTOR-NEXT: ret i1 [[VAL]]
238
238
;
@@ -337,7 +337,7 @@ define void @nc2(ptr %p, ptr %q) {
337
337
; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
338
338
; ATTRIBUTOR-LABEL: define void @nc2
339
339
; 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]+]]
341
341
; ATTRIBUTOR-NEXT: ret void
342
342
;
343
343
%1 = call i32 @nc1 (ptr %q , ptr %p , i1 0 ) ; <i32> [#uses=0]
@@ -389,7 +389,7 @@ define void @readonly_nounwind_willreturn(ptr %p) {
389
389
; ATTRIBUTOR: Function Attrs: mustprogress nosync nounwind willreturn memory(read)
390
390
; ATTRIBUTOR-LABEL: define void @readonly_nounwind_willreturn
391
391
; 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]+]]
393
393
; ATTRIBUTOR-NEXT: ret void
394
394
;
395
395
call void @external_willreturn (ptr %p )
@@ -732,7 +732,7 @@ define void @nocaptureLaunder(ptr %p) {
732
732
; ATTRIBUTOR-LABEL: define void @nocaptureLaunder
733
733
; ATTRIBUTOR-SAME: (ptr nofree captures(none) [[P:%.*]]) #[[ATTR12:[0-9]+]] {
734
734
; 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]+]]
736
736
; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1
737
737
; ATTRIBUTOR-NEXT: ret void
738
738
;
@@ -754,7 +754,7 @@ define void @captureLaunder(ptr %p) {
754
754
; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn
755
755
; ATTRIBUTOR-LABEL: define void @captureLaunder
756
756
; 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 ]]
758
758
; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g2, align 8
759
759
; ATTRIBUTOR-NEXT: ret void
760
760
;
@@ -776,7 +776,7 @@ define void @nocaptureStrip(ptr %p) {
776
776
; ATTRIBUTOR-LABEL: define void @nocaptureStrip
777
777
; ATTRIBUTOR-SAME: (ptr nofree writeonly captures(none) [[P:%.*]]) #[[ATTR13:[0-9]+]] {
778
778
; 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 ]]
780
780
; ATTRIBUTOR-NEXT: store i8 42, ptr [[B]], align 1
781
781
; ATTRIBUTOR-NEXT: ret void
782
782
;
@@ -798,7 +798,7 @@ define void @captureStrip(ptr %p) {
798
798
; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
799
799
; ATTRIBUTOR-LABEL: define void @captureStrip
800
800
; 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 ]]
802
802
; ATTRIBUTOR-NEXT: store ptr [[B]], ptr @g3, align 8
803
803
; ATTRIBUTOR-NEXT: ret void
804
804
;
@@ -1033,13 +1033,13 @@ define void @readnone_indirec(ptr %f, ptr %p) {
1033
1033
; FNATTRS: Function Attrs: nofree nosync memory(none)
1034
1034
; FNATTRS-LABEL: define void @readnone_indirec
1035
1035
; 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]+]]
1037
1037
; FNATTRS-NEXT: ret void
1038
1038
;
1039
1039
; ATTRIBUTOR: Function Attrs: nosync memory(none)
1040
1040
; ATTRIBUTOR-LABEL: define void @readnone_indirec
1041
1041
; 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]+]]
1043
1043
; ATTRIBUTOR-NEXT: ret void
1044
1044
;
1045
1045
call void %f (ptr %p ) readnone
@@ -1231,5 +1231,62 @@ define void @dont_increase_existing_captures_scc2(ptr %p) {
1231
1231
ret void
1232
1232
}
1233
1233
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
+
1234
1291
declare ptr @llvm.launder.invariant.group.p0 (ptr )
1235
1292
declare ptr @llvm.strip.invariant.group.p0 (ptr )
0 commit comments