@@ -1082,6 +1082,65 @@ define i64 @captures_not_ret_only(ptr %p) {
10821082 ret i64 %int
10831083}
10841084
1085+ @gi = global i64 0
1086+
1087+ ;; Unlike ptrtoint, ptrtoaddr only captures the address
1088+ define i64 @captures_ptrtoaddr_stored (ptr %p ) {
1089+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write, argmem: none, inaccessiblemem: none)
1090+ ; FNATTRS-LABEL: define noundef i64 @captures_ptrtoaddr_stored
1091+ ; FNATTRS-SAME: (ptr captures(address) [[P:%.*]]) #[[ATTR1]] {
1092+ ; FNATTRS-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1093+ ; FNATTRS-NEXT: store i64 [[INT]], ptr @gi, align 8
1094+ ; FNATTRS-NEXT: ret i64 0
1095+ ;
1096+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(write)
1097+ ; ATTRIBUTOR-LABEL: define i64 @captures_ptrtoaddr_stored
1098+ ; ATTRIBUTOR-SAME: (ptr nofree writeonly [[P:%.*]]) #[[ATTR1]] {
1099+ ; ATTRIBUTOR-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1100+ ; ATTRIBUTOR-NEXT: store i64 [[INT]], ptr @gi, align 8
1101+ ; ATTRIBUTOR-NEXT: ret i64 0
1102+ ;
1103+ %int = ptr toaddr ptr %p to i64
1104+ store i64 %int , ptr @gi , align 8
1105+ ret i64 0
1106+ }
1107+
1108+ ;; Note: ptrtoaddr is a location-independent capture, so we don't get captures(ret: address) here.
1109+ define i64 @captures_ptrtoaddr_ret (ptr %p ) {
1110+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1111+ ; FNATTRS-LABEL: define i64 @captures_ptrtoaddr_ret
1112+ ; FNATTRS-SAME: (ptr captures(address) [[P:%.*]]) #[[ATTR0]] {
1113+ ; FNATTRS-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1114+ ; FNATTRS-NEXT: ret i64 [[INT]]
1115+ ;
1116+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1117+ ; ATTRIBUTOR-LABEL: define i64 @captures_ptrtoaddr_ret
1118+ ; ATTRIBUTOR-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR0]] {
1119+ ; ATTRIBUTOR-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1120+ ; ATTRIBUTOR-NEXT: ret i64 [[INT]]
1121+ ;
1122+ %int = ptr toaddr ptr %p to i64
1123+ ret i64 %int
1124+ }
1125+
1126+ ;; Note: ptrtoaddr is a location-independent capture, so we don't get captures(none) here.
1127+ define i64 @captures_ptrtoaddr_ignored (ptr %p ) {
1128+ ; FNATTRS: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1129+ ; FNATTRS-LABEL: define noundef i64 @captures_ptrtoaddr_ignored
1130+ ; FNATTRS-SAME: (ptr captures(address) [[P:%.*]]) #[[ATTR0]] {
1131+ ; FNATTRS-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1132+ ; FNATTRS-NEXT: ret i64 0
1133+ ;
1134+ ; ATTRIBUTOR: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
1135+ ; ATTRIBUTOR-LABEL: define i64 @captures_ptrtoaddr_ignored
1136+ ; ATTRIBUTOR-SAME: (ptr nofree readnone [[P:%.*]]) #[[ATTR0]] {
1137+ ; ATTRIBUTOR-NEXT: [[INT:%.*]] = ptrtoaddr ptr [[P]] to i64
1138+ ; ATTRIBUTOR-NEXT: ret i64 0
1139+ ;
1140+ %int = ptr toaddr ptr %p to i64
1141+ ret i64 0
1142+ }
1143+
10851144define void @captures_read_provenance (ptr %p ) {
10861145; FNATTRS-LABEL: define void @captures_read_provenance
10871146; FNATTRS-SAME: (ptr captures(address, read_provenance) [[P:%.*]]) {
0 commit comments