354 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces,instsimplify %s | FileCheck %s3 4define i8 @ptrmask_cast_local_to_flat(ptr addrspace(3) %src.ptr, i64 %mask) {5; CHECK-LABEL: @ptrmask_cast_local_to_flat(6; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(3) [[SRC_PTR:%.*]] to ptr7; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 [[MASK:%.*]])8; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 19; CHECK-NEXT: ret i8 [[LOAD]]10;11 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr12 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)13 %load = load i8, ptr %masked14 ret i8 %load15}16 17define i8 @ptrmask_cast_private_to_flat(ptr addrspace(5) %src.ptr, i64 %mask) {18; CHECK-LABEL: @ptrmask_cast_private_to_flat(19; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(5) [[SRC_PTR:%.*]] to ptr20; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 [[MASK:%.*]])21; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 122; CHECK-NEXT: ret i8 [[LOAD]]23;24 %cast = addrspacecast ptr addrspace(5) %src.ptr to ptr25 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)26 %load = load i8, ptr %masked27 ret i8 %load28}29 30define i8 @ptrmask_cast_region_to_flat(ptr addrspace(2) %src.ptr, i64 %mask) {31; CHECK-LABEL: @ptrmask_cast_region_to_flat(32; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(2) [[SRC_PTR:%.*]] to ptr33; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 [[MASK:%.*]])34; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 135; CHECK-NEXT: ret i8 [[LOAD]]36;37 %cast = addrspacecast ptr addrspace(2) %src.ptr to ptr38 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)39 %load = load i8, ptr %masked40 ret i8 %load41}42 43define i8 @ptrmask_cast_global_to_flat(ptr addrspace(1) %src.ptr, i64 %mask) {44; CHECK-LABEL: @ptrmask_cast_global_to_flat(45; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[SRC_PTR:%.*]], i64 [[MASK:%.*]])46; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(1) [[TMP1]], align 147; CHECK-NEXT: ret i8 [[LOAD]]48;49 %cast = addrspacecast ptr addrspace(1) %src.ptr to ptr50 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)51 %load = load i8, ptr %masked52 ret i8 %load53}54 55define i8 @ptrmask_cast_999_to_flat(ptr addrspace(999) %src.ptr, i64 %mask) {56; CHECK-LABEL: @ptrmask_cast_999_to_flat(57; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(999) @llvm.ptrmask.p999.i64(ptr addrspace(999) [[SRC_PTR:%.*]], i64 [[MASK:%.*]])58; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(999) [[TMP1]], align 159; CHECK-NEXT: ret i8 [[LOAD]]60;61 %cast = addrspacecast ptr addrspace(999) %src.ptr to ptr62 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)63 %load = load i8, ptr %masked64 ret i8 %load65}66 67define i8 @ptrmask_cast_flat_to_local(ptr %ptr, i64 %mask) {68; CHECK-LABEL: @ptrmask_cast_flat_to_local(69; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 [[MASK:%.*]])70; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr [[MASKED]] to ptr addrspace(3)71; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[CAST]], align 172; CHECK-NEXT: ret i8 [[LOAD]]73;74 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 %mask)75 %cast = addrspacecast ptr %masked to ptr addrspace(3)76 %load = load i8, ptr addrspace(3) %cast77 ret i8 %load78}79 80define i8 @ptrmask_cast_flat_to_private(ptr %ptr, i64 %mask) {81; CHECK-LABEL: @ptrmask_cast_flat_to_private(82; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 [[MASK:%.*]])83; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr [[MASKED]] to ptr addrspace(5)84; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(5) [[CAST]], align 185; CHECK-NEXT: ret i8 [[LOAD]]86;87 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 %mask)88 %cast = addrspacecast ptr %masked to ptr addrspace(5)89 %load = load i8, ptr addrspace(5) %cast90 ret i8 %load91}92 93define i8 @ptrmask_cast_flat_to_global(ptr %ptr, i64 %mask) {94; CHECK-LABEL: @ptrmask_cast_flat_to_global(95; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[PTR:%.*]], i64 [[MASK:%.*]])96; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr [[MASKED]] to ptr addrspace(1)97; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(1) [[CAST]], align 198; CHECK-NEXT: ret i8 [[LOAD]]99;100 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %ptr, i64 %mask)101 %cast = addrspacecast ptr %masked to ptr addrspace(1)102 %load = load i8, ptr addrspace(1) %cast103 ret i8 %load104}105 106@lds0 = internal addrspace(3) global i8 123, align 4107@gv = internal addrspace(1) global i8 123, align 4108 109define i8 @ptrmask_cast_local_to_flat_global(i64 %mask) {110; CHECK-LABEL: @ptrmask_cast_local_to_flat_global(111; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr addrspacecast (ptr addrspace(3) @lds0 to ptr), i64 [[MASK:%.*]])112; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 1113; CHECK-NEXT: ret i8 [[LOAD]]114;115 %masked = call ptr @llvm.ptrmask.p0.i64(ptr addrspacecast (ptr addrspace(3) @lds0 to ptr), i64 %mask)116 %load = load i8, ptr %masked, align 1117 ret i8 %load118}119 120define i8 @ptrmask_cast_global_to_flat_global(i64 %mask) {121; CHECK-LABEL: @ptrmask_cast_global_to_flat_global(122; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) @gv, i64 [[MASK:%.*]])123; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(1) [[TMP1]], align 1124; CHECK-NEXT: ret i8 [[LOAD]]125;126 %masked = call ptr @llvm.ptrmask.p0.i64(ptr addrspacecast (ptr addrspace(1) @gv to ptr), i64 %mask)127 %load = load i8, ptr %masked, align 1128 ret i8 %load129}130 131define i8 @multi_ptrmask_cast_global_to_flat(ptr addrspace(1) %src.ptr, i64 %mask) {132; CHECK-LABEL: @multi_ptrmask_cast_global_to_flat(133; CHECK-NEXT: [[LOAD0:%.*]] = load i8, ptr addrspace(1) [[SRC_PTR:%.*]], align 1134; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1) [[SRC_PTR]], i64 [[MASK:%.*]])135; CHECK-NEXT: [[LOAD1:%.*]] = load i8, ptr addrspace(1) [[TMP1]], align 1136; CHECK-NEXT: [[ADD:%.*]] = add i8 [[LOAD0]], [[LOAD1]]137; CHECK-NEXT: ret i8 [[ADD]]138;139 %cast = addrspacecast ptr addrspace(1) %src.ptr to ptr140 %load0 = load i8, ptr %cast141 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)142 %load1 = load i8, ptr %masked143 %add = add i8 %load0, %load1144 ret i8 %add145}146 147; Can't rewrite the ptrmask, but can rewrite other use instructions148define i8 @multi_ptrmask_cast_local_to_flat(ptr addrspace(3) %src.ptr, i64 %mask) {149; CHECK-LABEL: @multi_ptrmask_cast_local_to_flat(150; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(3) [[SRC_PTR:%.*]] to ptr151; CHECK-NEXT: [[LOAD0:%.*]] = load i8, ptr addrspace(3) [[SRC_PTR]], align 1152; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 [[MASK:%.*]])153; CHECK-NEXT: [[LOAD1:%.*]] = load i8, ptr [[MASKED]], align 1154; CHECK-NEXT: [[ADD:%.*]] = add i8 [[LOAD0]], [[LOAD1]]155; CHECK-NEXT: ret i8 [[ADD]]156;157 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr158 %load0 = load i8, ptr %cast159 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)160 %load1 = load i8, ptr %masked161 %add = add i8 %load0, %load1162 ret i8 %add163}164 165define i8 @multi_ptrmask_cast_region_to_flat(ptr addrspace(2) %src.ptr, i64 %mask) {166; CHECK-LABEL: @multi_ptrmask_cast_region_to_flat(167; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(2) [[SRC_PTR:%.*]] to ptr168; CHECK-NEXT: [[LOAD0:%.*]] = load i8, ptr addrspace(2) [[SRC_PTR]], align 1169; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 [[MASK:%.*]])170; CHECK-NEXT: [[LOAD1:%.*]] = load i8, ptr [[MASKED]], align 1171; CHECK-NEXT: [[ADD:%.*]] = add i8 [[LOAD0]], [[LOAD1]]172; CHECK-NEXT: ret i8 [[ADD]]173;174 %cast = addrspacecast ptr addrspace(2) %src.ptr to ptr175 %load0 = load i8, ptr %cast176 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %mask)177 %load1 = load i8, ptr %masked178 %add = add i8 %load0, %load1179 ret i8 %add180}181 182; Do not fold this since it clears a single high bit.183define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffeffffffff(ptr addrspace(3) %src.ptr) {184; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_fffffffeffffffff(185; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(3) [[SRC_PTR:%.*]] to ptr186; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 -4294967297)187; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 1188; CHECK-NEXT: ret i8 [[LOAD]]189;190 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr191 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -4294967297)192 %load = load i8, ptr %masked193 ret i8 %load194}195 196; Do not fold this since it clears a single high bit.197define i8 @ptrmask_cast_local_to_flat_const_mask_7fffffffffffffff(ptr addrspace(3) %src.ptr) {198; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_7fffffffffffffff(199; CHECK-NEXT: [[CAST:%.*]] = addrspacecast ptr addrspace(3) [[SRC_PTR:%.*]] to ptr200; CHECK-NEXT: [[MASKED:%.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[CAST]], i64 9223372036854775807)201; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[MASKED]], align 1202; CHECK-NEXT: ret i8 [[LOAD]]203;204 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr205 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 9223372036854775807)206 %load = load i8, ptr %masked207 ret i8 %load208}209 210define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffff00000000(ptr addrspace(3) %src.ptr) {211; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffff00000000(212; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 0)213; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1214; CHECK-NEXT: ret i8 [[LOAD]]215;216 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr217 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -4294967296)218 %load = load i8, ptr %masked219 ret i8 %load220}221 222define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffff80000000(ptr addrspace(3) %src.ptr) {223; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffff80000000(224; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -2147483648)225; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1226; CHECK-NEXT: ret i8 [[LOAD]]227;228 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr229 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -2147483648)230 %load = load i8, ptr %masked231 ret i8 %load232}233 234; Test some align-down patterns. These only touch the low bits, which are preserved through the cast.235define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffff0000(ptr addrspace(3) %src.ptr) {236; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffffffff0000(237; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -65536)238; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1239; CHECK-NEXT: ret i8 [[LOAD]]240;241 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr242 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -65536)243 %load = load i8, ptr %masked244 ret i8 %load245}246 247define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffffff00(ptr addrspace(3) %src.ptr) {248; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffffffffff00(249; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -256)250; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1251; CHECK-NEXT: ret i8 [[LOAD]]252;253 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr254 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -256)255 %load = load i8, ptr %masked256 ret i8 %load257}258 259define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffe0(ptr addrspace(3) %src.ptr) {260; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffe0(261; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -32)262; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1263; CHECK-NEXT: ret i8 [[LOAD]]264;265 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr266 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -32)267 %load = load i8, ptr %masked268 ret i8 %load269}270 271define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffffffffff0(ptr addrspace(3) %src.ptr) {272; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_fffffffffffffff0(273; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -16)274; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1275; CHECK-NEXT: ret i8 [[LOAD]]276;277 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr278 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -16)279 %load = load i8, ptr %masked280 ret i8 %load281}282 283define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffffffffff8(ptr addrspace(3) %src.ptr) {284; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_fffffffffffffff8(285; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -8)286; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1287; CHECK-NEXT: ret i8 [[LOAD]]288;289 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr290 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -8)291 %load = load i8, ptr %masked292 ret i8 %load293}294 295define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffffffffffc(ptr addrspace(3) %src.ptr) {296; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_fffffffffffffffc(297; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -4)298; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1299; CHECK-NEXT: ret i8 [[LOAD]]300;301 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr302 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -4)303 %load = load i8, ptr %masked304 ret i8 %load305}306 307define i8 @ptrmask_cast_local_to_flat_const_mask_fffffffffffffffe(ptr addrspace(3) %src.ptr) {308; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_fffffffffffffffe(309; CHECK-NEXT: [[TMP1:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 -2)310; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP1]], align 1311; CHECK-NEXT: ret i8 [[LOAD]]312;313 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr314 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -2)315 %load = load i8, ptr %masked316 ret i8 %load317}318 319define i8 @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffff(ptr addrspace(3) %src.ptr) {320; CHECK-LABEL: @ptrmask_cast_local_to_flat_const_mask_ffffffffffffffff(321; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[SRC_PTR:%.*]], align 1322; CHECK-NEXT: ret i8 [[LOAD]]323;324 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr325 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 -1)326 %load = load i8, ptr %masked327 ret i8 %load328}329 330; Make sure non-constant masks can also be handled.331define i8 @ptrmask_cast_local_to_flat_load_range_mask(ptr addrspace(3) %src.ptr, ptr addrspace(1) %mask.ptr) {332; CHECK-LABEL: @ptrmask_cast_local_to_flat_load_range_mask(333; CHECK-NEXT: [[LOAD_MASK:%.*]] = load i64, ptr addrspace(1) [[MASK_PTR:%.*]], align 8, !range [[RNG0:![0-9]+]]334; CHECK-NEXT: [[TMP1:%.*]] = trunc i64 [[LOAD_MASK]] to i32335; CHECK-NEXT: [[TMP2:%.*]] = call ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3) [[SRC_PTR:%.*]], i32 [[TMP1]])336; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(3) [[TMP2]], align 1337; CHECK-NEXT: ret i8 [[LOAD]]338;339 %load.mask = load i64, ptr addrspace(1) %mask.ptr, align 8, !range !0340 %cast = addrspacecast ptr addrspace(3) %src.ptr to ptr341 %masked = call ptr @llvm.ptrmask.p0.i64(ptr %cast, i64 %load.mask)342 %load = load i8, ptr %masked343 ret i8 %load344}345 346declare ptr @llvm.ptrmask.p0.i64(ptr, i64) #0347declare ptr addrspace(5) @llvm.ptrmask.p5.i32(ptr addrspace(5), i32) #0348declare ptr addrspace(3) @llvm.ptrmask.p3.i32(ptr addrspace(3), i32) #0349declare ptr addrspace(1) @llvm.ptrmask.p1.i64(ptr addrspace(1), i64) #0350 351attributes #0 = { nounwind readnone speculatable willreturn }352 353!0 = !{i64 -64, i64 -1}354