brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.3 KiB · 610c3e2 Raw
662 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt -S -mcpu=gfx900 -amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s3; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s4 5target triple = "amdgcn--"6 7define ptr addrspace(7) @gep(ptr addrspace(7) %in, i32 %idx) {8; CHECK-LABEL: define { ptr addrspace(8), i32 } @gep9; CHECK-SAME: ({ ptr addrspace(8), i32 } [[IN:%.*]], i32 [[IDX:%.*]]) #[[ATTR0:[0-9]+]] {10; CHECK-NEXT:    [[IN_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 011; CHECK-NEXT:    [[IN_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 112; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nsw i32 [[IDX]], 4013; CHECK-NEXT:    [[RET_OFFS:%.*]] = add nsw i32 [[RET_IDX]], 814; CHECK-NEXT:    [[RET_OFFS1:%.*]] = add nsw i32 [[RET_OFFS]], 2415; CHECK-NEXT:    [[RET:%.*]] = add i32 [[IN_OFF]], [[RET_OFFS1]]16; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[IN]], i32 [[RET]], 117; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]18;19  %ret = getelementptr inbounds {i32, [4 x ptr]}, ptr addrspace(7) %in, i32 %idx, i32 1, i32 320  ret ptr addrspace(7) %ret21}22 23define <2 x ptr addrspace(7)> @gep_vectors(<2 x ptr addrspace(7)> %in, <2 x i32> %idx) {24; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_vectors25; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[IN:%.*]], <2 x i32> [[IDX:%.*]]) #[[ATTR0]] {26; CHECK-NEXT:    [[IN_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 027; CHECK-NEXT:    [[IN_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 128; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nsw <2 x i32> [[IDX]], splat (i32 40)29; CHECK-NEXT:    [[RET_OFFS:%.*]] = add nsw <2 x i32> [[RET_IDX]], splat (i32 8)30; CHECK-NEXT:    [[RET_OFFS1:%.*]] = add nsw <2 x i32> [[RET_OFFS]], splat (i32 24)31; CHECK-NEXT:    [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[RET_OFFS1]]32; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], <2 x i32> [[RET]], 133; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]]34;35  %ret = getelementptr inbounds {i32, [4 x ptr]}, <2 x ptr addrspace(7)> %in, <2 x i32> %idx, i32 1, i32 336  ret <2 x ptr addrspace(7)> %ret37}38 39define <2 x ptr addrspace(7)> @gep_vector_scalar(<2 x ptr addrspace(7)> %in, i64 %idx) {40; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_vector_scalar41; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[IN:%.*]], i64 [[IDX:%.*]]) #[[ATTR0]] {42; CHECK-NEXT:    [[IN_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 043; CHECK-NEXT:    [[IN_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], 144; CHECK-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[IDX]], i64 045; CHECK-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x i64> [[DOTSPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer46; CHECK-NEXT:    [[DOTSPLAT_C:%.*]] = trunc <2 x i64> [[DOTSPLAT]] to <2 x i32>47; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nsw <2 x i32> [[DOTSPLAT_C]], splat (i32 40)48; CHECK-NEXT:    [[RET_OFFS:%.*]] = add nsw <2 x i32> [[RET_IDX]], splat (i32 8)49; CHECK-NEXT:    [[RET_OFFS1:%.*]] = add nsw <2 x i32> [[RET_OFFS]], splat (i32 24)50; CHECK-NEXT:    [[RET:%.*]] = add <2 x i32> [[IN_OFF]], [[RET_OFFS1]]51; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[IN]], <2 x i32> [[RET]], 152; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]]53;54  %ret = getelementptr inbounds {i32, [4 x ptr]}, <2 x ptr addrspace(7)> %in, i64 %idx, i32 1, i32 355  ret <2 x ptr addrspace(7)> %ret56}57 58define <2 x ptr addrspace(7)> @gep_scalar_vector(ptr addrspace(7) %in, <2 x i32> %idxs) {59; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @gep_scalar_vector60; CHECK-SAME: ({ ptr addrspace(8), i32 } [[IN:%.*]], <2 x i32> [[IDXS:%.*]]) #[[ATTR0]] {61; CHECK-NEXT:    [[IN_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 062; CHECK-NEXT:    [[IN_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[IN]], 163; CHECK-NEXT:    [[IN_RSRC_SPLATINSERT:%.*]] = insertelement <2 x ptr addrspace(8)> poison, ptr addrspace(8) [[IN_RSRC]], i64 064; CHECK-NEXT:    [[IN_RSRC_SPLAT:%.*]] = shufflevector <2 x ptr addrspace(8)> [[IN_RSRC_SPLATINSERT]], <2 x ptr addrspace(8)> poison, <2 x i32> zeroinitializer65; CHECK-NEXT:    [[IN_OFF_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[IN_OFF]], i64 066; CHECK-NEXT:    [[IN_OFF_SPLAT:%.*]] = shufflevector <2 x i32> [[IN_OFF_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer67; CHECK-NEXT:    [[RET:%.*]] = add <2 x i32> [[IN_OFF_SPLAT]], [[IDXS]]68; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[IN_RSRC_SPLAT]], 069; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> [[RET]], 170; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP2]]71;72  %ret = getelementptr inbounds i8, ptr addrspace(7) %in, <2 x i32> %idxs73  ret <2 x ptr addrspace(7)> %ret74}75 76define ptr addrspace(7) @simple_gep(ptr addrspace(7) %ptr, i32 %off) {77; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_gep78; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {79; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 080; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 181; CHECK-NEXT:    [[RET_IDX:%.*]] = mul i32 [[OFF]], 482; CHECK-NEXT:    [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX]]83; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[PTR]], i32 [[RET]], 184; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]85;86  %ret = getelementptr i32, ptr addrspace(7) %ptr, i32 %off87  ret ptr addrspace(7) %ret88}89 90define ptr addrspace(7) @simple_inbounds_gep(ptr addrspace(7) %ptr, i32 %off) {91; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_inbounds_gep92; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {93; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 094; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 195; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nsw i32 [[OFF]], 496; CHECK-NEXT:    [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX]]97; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[PTR]], i32 [[RET]], 198; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]99;100  %ret = getelementptr inbounds i32, ptr addrspace(7) %ptr, i32 %off101  ret ptr addrspace(7) %ret102}103 104define ptr addrspace(7) @simple_nuw_gep(ptr addrspace(7) %ptr, i32 %off) {105; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_nuw_gep106; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {107; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0108; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1109; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nuw i32 [[OFF]], 4110; CHECK-NEXT:    [[RET:%.*]] = add nuw i32 [[PTR_OFF]], [[RET_IDX]]111; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[PTR]], i32 [[RET]], 1112; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]113;114  %ret = getelementptr nuw i32, ptr addrspace(7) %ptr, i32 %off115  ret ptr addrspace(7) %ret116}117 118define ptr addrspace(7) @simple_nusw_gep(ptr addrspace(7) %ptr, i32 %off) {119; CHECK-LABEL: define { ptr addrspace(8), i32 } @simple_nusw_gep120; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {121; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0122; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1123; CHECK-NEXT:    [[RET_IDX:%.*]] = mul nsw i32 [[OFF]], 4124; CHECK-NEXT:    [[RET:%.*]] = add i32 [[PTR_OFF]], [[RET_IDX]]125; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[PTR]], i32 [[RET]], 1126; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]127;128  %ret = getelementptr nusw i32, ptr addrspace(7) %ptr, i32 %off129  ret ptr addrspace(7) %ret130}131 132define ptr addrspace(7) @nusw_gep_pair(ptr addrspace(7) %ptr, i32 %off) {133; CHECK-LABEL: define { ptr addrspace(8), i32 } @nusw_gep_pair134; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]], i32 [[OFF:%.*]]) #[[ATTR0]] {135; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0136; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1137; CHECK-NEXT:    [[P1_IDX:%.*]] = mul nsw i32 [[OFF]], 4138; CHECK-NEXT:    [[P1:%.*]] = add i32 [[PTR_OFF]], [[P1_IDX]]139; CHECK-NEXT:    [[RET:%.*]] = add nuw i32 [[P1]], 16140; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[PTR]], i32 [[RET]], 1141; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]142;143  %p1 = getelementptr nusw i32, ptr addrspace(7) %ptr, i32 %off144  %ret = getelementptr nusw i32, ptr addrspace(7) %p1, i32 4145  ret ptr addrspace(7) %ret146}147 148define ptr addrspace(7) @zero_gep(ptr addrspace(7) %ptr) {149; CHECK-LABEL: define { ptr addrspace(8), i32 } @zero_gep150; CHECK-SAME: ({ ptr addrspace(8), i32 } [[RET:%.*]]) #[[ATTR0]] {151; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[RET]], 0152; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[RET]], 1153; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]154;155  %ret = getelementptr i8, ptr addrspace(7) %ptr, i32 0156  ret ptr addrspace(7) %ret157}158 159define ptr addrspace(7) @zero_gep_goes_second(ptr addrspace(7) %v0, i32 %arg) {160; CHECK-LABEL: define { ptr addrspace(8), i32 } @zero_gep_goes_second161; CHECK-SAME: ({ ptr addrspace(8), i32 } [[V0:%.*]], i32 [[ARG:%.*]]) #[[ATTR0]] {162; CHECK-NEXT:    [[V0_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 0163; CHECK-NEXT:    [[V0_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 1164; CHECK-NEXT:    [[V1:%.*]] = add i32 [[V0_OFF]], [[ARG]]165; CHECK-NEXT:    [[V2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[V0]], i32 [[V1]], 1166; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[V2]]167;168  %v1 = getelementptr i8, ptr addrspace(7) %v0, i32 %arg169  %v2 = getelementptr i8, ptr addrspace(7) %v1, i32 0170  ret ptr addrspace(7) %v2171}172 173define ptr addrspace(7) @zero_gep_goes_first(ptr addrspace(7) %v0, i32 %arg) {174; CHECK-LABEL: define { ptr addrspace(8), i32 } @zero_gep_goes_first175; CHECK-SAME: ({ ptr addrspace(8), i32 } [[V0:%.*]], i32 [[ARG:%.*]]) #[[ATTR0]] {176; CHECK-NEXT:    [[V0_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 0177; CHECK-NEXT:    [[V0_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[V0]], 1178; CHECK-NEXT:    [[V2:%.*]] = add i32 [[V0_OFF]], [[ARG]]179; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } [[V0]], i32 [[V2]], 1180; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP1]]181;182  %v1 = getelementptr i8, ptr addrspace(7) %v0, i32 0183  %v2 = getelementptr i8, ptr addrspace(7) %v1, i32 %arg184  ret ptr addrspace(7) %v2185}186 187define i160 @ptrtoint(ptr addrspace(7) %ptr) {188; CHECK-LABEL: define i160 @ptrtoint189; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {190; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0191; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1192; CHECK-NEXT:    [[RET_RSRC:%.*]] = ptrtoint ptr addrspace(8) [[PTR_RSRC]] to i160193; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw i160 [[RET_RSRC]], 32194; CHECK-NEXT:    [[RET_OFF:%.*]] = zext i32 [[PTR_OFF]] to i160195; CHECK-NEXT:    [[RET:%.*]] = or i160 [[TMP1]], [[RET_OFF]]196; CHECK-NEXT:    ret i160 [[RET]]197;198  %ret = ptrtoint ptr addrspace(7) %ptr to i160199  ret i160 %ret200}201 202define <2 x i160> @ptrtoint_vec(<2 x ptr addrspace(7)> %ptr) {203; CHECK-LABEL: define <2 x i160> @ptrtoint_vec204; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[PTR:%.*]]) #[[ATTR0]] {205; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 0206; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 1207; CHECK-NEXT:    [[RET_RSRC:%.*]] = ptrtoint <2 x ptr addrspace(8)> [[PTR_RSRC]] to <2 x i160>208; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw <2 x i160> [[RET_RSRC]], splat (i160 32)209; CHECK-NEXT:    [[RET_OFF:%.*]] = zext <2 x i32> [[PTR_OFF]] to <2 x i160>210; CHECK-NEXT:    [[RET:%.*]] = or <2 x i160> [[TMP1]], [[RET_OFF]]211; CHECK-NEXT:    ret <2 x i160> [[RET]]212;213  %ret = ptrtoint <2 x ptr addrspace(7)> %ptr to <2 x i160>214  ret <2 x i160> %ret215}216 217define i256 @ptrtoint_long(ptr addrspace(7) %ptr) {218; CHECK-LABEL: define i256 @ptrtoint_long219; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {220; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0221; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1222; CHECK-NEXT:    [[RET_RSRC:%.*]] = ptrtoint ptr addrspace(8) [[PTR_RSRC]] to i256223; CHECK-NEXT:    [[TMP1:%.*]] = shl nuw nsw i256 [[RET_RSRC]], 32224; CHECK-NEXT:    [[RET_OFF:%.*]] = zext i32 [[PTR_OFF]] to i256225; CHECK-NEXT:    [[RET:%.*]] = or i256 [[TMP1]], [[RET_OFF]]226; CHECK-NEXT:    ret i256 [[RET]]227;228  %ret = ptrtoint ptr addrspace(7) %ptr to i256229  ret i256 %ret230}231 232define i64 @ptrtoint_short(ptr addrspace(7) %ptr) {233; CHECK-LABEL: define i64 @ptrtoint_short234; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {235; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0236; CHECK-NEXT:    [[PTR_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1237; CHECK-NEXT:    [[RET_RSRC:%.*]] = ptrtoint ptr addrspace(8) [[PTR_RSRC]] to i64238; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 [[RET_RSRC]], 32239; CHECK-NEXT:    [[RET_OFF:%.*]] = zext i32 [[PTR_OFF]] to i64240; CHECK-NEXT:    [[RET:%.*]] = or i64 [[TMP1]], [[RET_OFF]]241; CHECK-NEXT:    ret i64 [[RET]]242;243  %ret = ptrtoint ptr addrspace(7) %ptr to i64244  ret i64 %ret245}246 247define i32 @ptrtoint_offset(ptr addrspace(7) %ptr) {248; CHECK-LABEL: define i32 @ptrtoint_offset249; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {250; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0251; CHECK-NEXT:    [[RET:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1252; CHECK-NEXT:    ret i32 [[RET]]253;254  %ret = ptrtoint ptr addrspace(7) %ptr to i32255  ret i32 %ret256}257 258define i32 @ptrtoaddr(ptr addrspace(7) %ptr) {259; CHECK-LABEL: define i32 @ptrtoaddr260; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {261; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0262; CHECK-NEXT:    [[RET:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1263; CHECK-NEXT:    ret i32 [[RET]]264;265  %ret = ptrtoaddr ptr addrspace(7) %ptr to i32266  ret i32 %ret267}268 269define <2 x i32> @ptrtoaddr_vec(<2 x ptr addrspace(7)> %ptr) {270; CHECK-LABEL: define <2 x i32> @ptrtoaddr_vec271; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[PTR:%.*]]) #[[ATTR0]] {272; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 0273; CHECK-NEXT:    [[RET:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[PTR]], 1274; CHECK-NEXT:    ret <2 x i32> [[RET]]275;276  %ret = ptrtoaddr <2 x ptr addrspace(7)> %ptr to <2 x i32>277  ret <2 x i32> %ret278}279 280;; Check that we extend the offset to i160.281define i160 @ptrtoaddr_ext(ptr addrspace(7) %ptr) {282; CHECK-LABEL: define i160 @ptrtoaddr_ext283; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {284; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0285; CHECK-NEXT:    [[ADDR:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1286; CHECK-NEXT:    [[EXT:%.*]] = zext i32 [[ADDR]] to i160287; CHECK-NEXT:    ret i160 [[EXT]]288;289  %addr = ptrtoaddr ptr addrspace(7) %ptr to i32290  %ext = zext i32 %addr to i160291  ret i160 %ext292}293 294;; Check that we truncate the offset to i16.295define i16 @ptrtoaddr_trunc(ptr addrspace(7) %ptr) {296; CHECK-LABEL: define i16 @ptrtoaddr_trunc297; CHECK-SAME: ({ ptr addrspace(8), i32 } [[PTR:%.*]]) #[[ATTR0]] {298; CHECK-NEXT:    [[PTR_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 0299; CHECK-NEXT:    [[ADDR:%.*]] = extractvalue { ptr addrspace(8), i32 } [[PTR]], 1300; CHECK-NEXT:    [[TRUNC:%.*]] = trunc i32 [[ADDR]] to i16301; CHECK-NEXT:    ret i16 [[TRUNC]]302;303  %addr = ptrtoaddr ptr addrspace(7) %ptr to i32304  %trunc = trunc i32 %addr to i16305  ret i16 %trunc306}307 308define ptr addrspace(7) @inttoptr(i160 %v) {309; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr310; CHECK-SAME: (i160 [[V:%.*]]) #[[ATTR0]] {311; CHECK-NEXT:    [[TMP1:%.*]] = lshr i160 [[V]], 32312; CHECK-NEXT:    [[TMP2:%.*]] = trunc i160 [[TMP1]] to i128313; CHECK-NEXT:    [[RET_RSRC:%.*]] = inttoptr i128 [[TMP2]] to ptr addrspace(8)314; CHECK-NEXT:    [[RET_OFF:%.*]] = trunc i160 [[V]] to i32315; CHECK-NEXT:    [[TMP3:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[RET_RSRC]], 0316; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP3]], i32 [[RET_OFF]], 1317; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]318;319  %ret = inttoptr i160 %v to ptr addrspace(7)320  ret ptr addrspace(7) %ret321}322 323define <2 x ptr addrspace(7)> @inttoptr_vec(<2 x i160> %v) {324; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @inttoptr_vec325; CHECK-SAME: (<2 x i160> [[V:%.*]]) #[[ATTR0]] {326; CHECK-NEXT:    [[TMP1:%.*]] = lshr <2 x i160> [[V]], splat (i160 32)327; CHECK-NEXT:    [[TMP2:%.*]] = trunc <2 x i160> [[TMP1]] to <2 x i128>328; CHECK-NEXT:    [[RET_RSRC:%.*]] = inttoptr <2 x i128> [[TMP2]] to <2 x ptr addrspace(8)>329; CHECK-NEXT:    [[RET_OFF:%.*]] = trunc <2 x i160> [[V]] to <2 x i32>330; CHECK-NEXT:    [[TMP3:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[RET_RSRC]], 0331; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP3]], <2 x i32> [[RET_OFF]], 1332; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[RET]]333;334  %ret = inttoptr <2 x i160> %v to <2 x ptr addrspace(7)>335  ret <2 x ptr addrspace(7)> %ret336}337 338define ptr addrspace(7) @inttoptr_long(i256 %v) {339; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr_long340; CHECK-SAME: (i256 [[V:%.*]]) #[[ATTR0]] {341; CHECK-NEXT:    [[TMP1:%.*]] = lshr i256 [[V]], 32342; CHECK-NEXT:    [[TMP2:%.*]] = trunc i256 [[TMP1]] to i128343; CHECK-NEXT:    [[RET_RSRC:%.*]] = inttoptr i128 [[TMP2]] to ptr addrspace(8)344; CHECK-NEXT:    [[RET_OFF:%.*]] = trunc i256 [[V]] to i32345; CHECK-NEXT:    [[TMP3:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[RET_RSRC]], 0346; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP3]], i32 [[RET_OFF]], 1347; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]348;349  %ret = inttoptr i256 %v to ptr addrspace(7)350  ret ptr addrspace(7) %ret351}352 353define ptr addrspace(7) @inttoptr_offset(i32 %v) {354; CHECK-LABEL: define { ptr addrspace(8), i32 } @inttoptr_offset355; CHECK-SAME: (i32 [[V:%.*]]) #[[ATTR0]] {356; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, i32 [[V]], 1357; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]358;359  %ret = inttoptr i32 %v to ptr addrspace(7)360  ret ptr addrspace(7) %ret361}362 363define ptr addrspace(7) @addrspacecast(ptr addrspace(8) %buf) {364; CHECK-LABEL: define { ptr addrspace(8), i32 } @addrspacecast365; CHECK-SAME: (ptr addrspace(8) [[BUF:%.*]]) #[[ATTR0]] {366; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[BUF]], 0367; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 0, 1368; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]369;370  %ret = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)371  ret ptr addrspace(7) %ret372}373 374define <2 x ptr addrspace(7)> @addrspacecast_vec(<2 x ptr addrspace(8)> %buf) {375; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @addrspacecast_vec376; CHECK-SAME: (<2 x ptr addrspace(8)> [[BUF:%.*]]) #[[ATTR0]] {377; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[BUF]], 0378; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> zeroinitializer, 1379; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[RET]]380;381  %ret = addrspacecast <2 x ptr addrspace(8)> %buf to <2 x ptr addrspace(7)>382  ret <2 x ptr addrspace(7)> %ret383}384 385define ptr addrspace(7) @addrspacecast_null() {386; CHECK-LABEL: define { ptr addrspace(8), i32 } @addrspacecast_null387; CHECK-SAME: () #[[ATTR0]] {388; CHECK-NEXT:    ret { ptr addrspace(8), i32 } zeroinitializer389;390  %ret = addrspacecast ptr null to ptr addrspace(7)391  ret ptr addrspace(7) %ret392}393 394define <2 x ptr addrspace(7)> @addrspacecast_null_vec() {395; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @addrspacecast_null_vec396; CHECK-SAME: () #[[ATTR0]] {397; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } zeroinitializer398;399  %ret = addrspacecast <2 x ptr> zeroinitializer to <2 x ptr addrspace(7)>400  ret <2 x ptr addrspace(7)> %ret401}402 403define i1 @test_null(ptr addrspace(7) %p) {404; CHECK-LABEL: define i1 @test_null405; CHECK-SAME: ({ ptr addrspace(8), i32 } [[P:%.*]]) #[[ATTR0]] {406; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 0407; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 1408; CHECK-NEXT:    [[IS_NULL_RSRC:%.*]] = icmp eq ptr addrspace(8) [[P_RSRC]], null409; CHECK-NEXT:    [[IS_NULL_OFF:%.*]] = icmp eq i32 [[P_OFF]], 0410; CHECK-NEXT:    [[IS_NULL:%.*]] = and i1 [[IS_NULL_RSRC]], [[IS_NULL_OFF]]411; CHECK-NEXT:    ret i1 [[IS_NULL]]412;413  %is.null = icmp eq ptr addrspace(7) %p, addrspacecast (ptr null to ptr addrspace(7))414  ret i1 %is.null415}416 417define ptr addrspace(7) @addrspacecast_undef() {418; CHECK-LABEL: define { ptr addrspace(8), i32 } @addrspacecast_undef419; CHECK-SAME: () #[[ATTR0]] {420; CHECK-NEXT:    ret { ptr addrspace(8), i32 } undef421;422  %ret = addrspacecast ptr undef to ptr addrspace(7)423  ret ptr addrspace(7) %ret424}425 426define <2 x ptr addrspace(7)> @addrspacecast_undef_vec() {427; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @addrspacecast_undef_vec428; CHECK-SAME: () #[[ATTR0]] {429; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } undef430;431  %ret = addrspacecast <2 x ptr> undef to <2 x ptr addrspace(7)>432  ret <2 x ptr addrspace(7)> %ret433}434 435define ptr addrspace(7) @addrspacecast_poison() {436; CHECK-LABEL: define { ptr addrspace(8), i32 } @addrspacecast_poison437; CHECK-SAME: () #[[ATTR0]] {438; CHECK-NEXT:    ret { ptr addrspace(8), i32 } poison439;440  %ret = addrspacecast ptr poison to ptr addrspace(7)441  ret ptr addrspace(7) %ret442}443 444define <2 x ptr addrspace(7)> @addrspacecast_poison_vec() {445; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @addrspacecast_poison_vec446; CHECK-SAME: () #[[ATTR0]] {447; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } poison448;449  %ret = addrspacecast <2 x ptr> poison to <2 x ptr addrspace(7)>450  ret <2 x ptr addrspace(7)> %ret451}452 453declare ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1), i16, i64, i32)454 455define ptr addrspace(7) @make_buffer_rsrc(ptr addrspace(1) %buf, i16 %stride, i64 %numRecords, i32 %flags) {456; CHECK-LABEL: define { ptr addrspace(8), i32 } @make_buffer_rsrc457; CHECK-SAME: (ptr addrspace(1) [[BUF:%.*]], i16 [[STRIDE:%.*]], i64 [[NUMRECORDS:%.*]], i32 [[FLAGS:%.*]]) #[[ATTR0]] {458; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(8) @llvm.amdgcn.make.buffer.rsrc.p8.p1(ptr addrspace(1) [[BUF]], i16 [[STRIDE]], i64 [[NUMRECORDS]], i32 [[FLAGS]])459; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[RET]], 0460; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 0, 1461; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP2]]462;463  %ret = call ptr addrspace(7) @llvm.amdgcn.make.buffer.rsrc.p7.p1(ptr addrspace(1) %buf, i16 %stride, i64 %numRecords, i32 %flags)464  ret ptr addrspace(7) %ret465}466 467define i1 @icmp_eq(ptr addrspace(7) %a, ptr addrspace(7) %b) {468; CHECK-LABEL: define i1 @icmp_eq469; CHECK-SAME: ({ ptr addrspace(8), i32 } [[A:%.*]], { ptr addrspace(8), i32 } [[B:%.*]]) #[[ATTR0]] {470; CHECK-NEXT:    [[B_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[B]], 0471; CHECK-NEXT:    [[B_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[B]], 1472; CHECK-NEXT:    [[A_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[A]], 0473; CHECK-NEXT:    [[A_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[A]], 1474; CHECK-NEXT:    [[RET_RSRC:%.*]] = icmp eq ptr addrspace(8) [[A_RSRC]], [[B_RSRC]]475; CHECK-NEXT:    [[RET_OFF:%.*]] = icmp eq i32 [[A_OFF]], [[B_OFF]]476; CHECK-NEXT:    [[RET:%.*]] = and i1 [[RET_RSRC]], [[RET_OFF]]477; CHECK-NEXT:    ret i1 [[RET]]478;479  %ret = icmp eq ptr addrspace(7) %a, %b480  ret i1 %ret481}482 483define i1 @icmp_ne(ptr addrspace(7) %a, ptr addrspace(7) %b) {484; CHECK-LABEL: define i1 @icmp_ne485; CHECK-SAME: ({ ptr addrspace(8), i32 } [[A:%.*]], { ptr addrspace(8), i32 } [[B:%.*]]) #[[ATTR0]] {486; CHECK-NEXT:    [[B_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[B]], 0487; CHECK-NEXT:    [[B_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[B]], 1488; CHECK-NEXT:    [[A_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[A]], 0489; CHECK-NEXT:    [[A_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[A]], 1490; CHECK-NEXT:    [[RET_RSRC:%.*]] = icmp ne ptr addrspace(8) [[A_RSRC]], [[B_RSRC]]491; CHECK-NEXT:    [[RET_OFF:%.*]] = icmp ne i32 [[A_OFF]], [[B_OFF]]492; CHECK-NEXT:    [[RET:%.*]] = or i1 [[RET_RSRC]], [[RET_OFF]]493; CHECK-NEXT:    ret i1 [[RET]]494;495  %ret = icmp ne ptr addrspace(7) %a, %b496  ret i1 %ret497}498 499define <2 x i1> @icmp_eq_vec(<2 x ptr addrspace(7)> %a, <2 x ptr addrspace(7)> %b) {500; CHECK-LABEL: define <2 x i1> @icmp_eq_vec501; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[A:%.*]], { <2 x ptr addrspace(8)>, <2 x i32> } [[B:%.*]]) #[[ATTR0]] {502; CHECK-NEXT:    [[B_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 0503; CHECK-NEXT:    [[B_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 1504; CHECK-NEXT:    [[A_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 0505; CHECK-NEXT:    [[A_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 1506; CHECK-NEXT:    [[RET_RSRC:%.*]] = icmp eq <2 x ptr addrspace(8)> [[A_RSRC]], [[B_RSRC]]507; CHECK-NEXT:    [[RET_OFF:%.*]] = icmp eq <2 x i32> [[A_OFF]], [[B_OFF]]508; CHECK-NEXT:    [[RET:%.*]] = and <2 x i1> [[RET_RSRC]], [[RET_OFF]]509; CHECK-NEXT:    ret <2 x i1> [[RET]]510;511  %ret = icmp eq <2 x ptr addrspace(7)> %a, %b512  ret <2 x i1> %ret513}514 515define <2 x i1> @icmp_ne_vec(<2 x ptr addrspace(7)> %a, <2 x ptr addrspace(7)> %b) {516; CHECK-LABEL: define <2 x i1> @icmp_ne_vec517; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[A:%.*]], { <2 x ptr addrspace(8)>, <2 x i32> } [[B:%.*]]) #[[ATTR0]] {518; CHECK-NEXT:    [[B_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 0519; CHECK-NEXT:    [[B_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 1520; CHECK-NEXT:    [[A_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 0521; CHECK-NEXT:    [[A_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 1522; CHECK-NEXT:    [[RET_RSRC:%.*]] = icmp ne <2 x ptr addrspace(8)> [[A_RSRC]], [[B_RSRC]]523; CHECK-NEXT:    [[RET_OFF:%.*]] = icmp ne <2 x i32> [[A_OFF]], [[B_OFF]]524; CHECK-NEXT:    [[RET:%.*]] = or <2 x i1> [[RET_RSRC]], [[RET_OFF]]525; CHECK-NEXT:    ret <2 x i1> [[RET]]526;527  %ret = icmp ne <2 x ptr addrspace(7)> %a, %b528  ret <2 x i1> %ret529}530 531define ptr addrspace(7) @freeze(ptr addrspace(7) %p) {532; CHECK-LABEL: define { ptr addrspace(8), i32 } @freeze533; CHECK-SAME: ({ ptr addrspace(8), i32 } [[P:%.*]]) #[[ATTR0]] {534; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 0535; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 1536; CHECK-NEXT:    [[RET_RSRC:%.*]] = freeze ptr addrspace(8) [[P_RSRC]]537; CHECK-NEXT:    [[RET_OFF:%.*]] = freeze i32 [[P_OFF]]538; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[RET_RSRC]], 0539; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET_OFF]], 1540; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]541;542  %ret = freeze ptr addrspace(7) %p543  ret ptr addrspace(7) %ret544}545 546define <2 x ptr addrspace(7)> @freeze_vec(<2 x ptr addrspace(7)> %p) {547; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @freeze_vec548; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[P:%.*]]) #[[ATTR0]] {549; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[P]], 0550; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[P]], 1551; CHECK-NEXT:    [[RET_RSRC:%.*]] = freeze <2 x ptr addrspace(8)> [[P_RSRC]]552; CHECK-NEXT:    [[RET_OFF:%.*]] = freeze <2 x i32> [[P_OFF]]553; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[RET_RSRC]], 0554; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> [[RET_OFF]], 1555; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[RET]]556;557  %ret = freeze <2 x ptr addrspace(7)> %p558  ret <2 x ptr addrspace(7)> %ret559}560 561define ptr addrspace(7) @extractelement(<2 x ptr addrspace(7)> %v, i32 %i) {562; CHECK-LABEL: define { ptr addrspace(8), i32 } @extractelement563; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[V:%.*]], i32 [[I:%.*]]) #[[ATTR0]] {564; CHECK-NEXT:    [[V_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[V]], 0565; CHECK-NEXT:    [[V_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[V]], 1566; CHECK-NEXT:    [[RET_RSRC:%.*]] = extractelement <2 x ptr addrspace(8)> [[V_RSRC]], i32 [[I]]567; CHECK-NEXT:    [[RET_OFF:%.*]] = extractelement <2 x i32> [[V_OFF]], i32 [[I]]568; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[RET_RSRC]], 0569; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[RET_OFF]], 1570; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]571;572  %ret = extractelement <2 x ptr addrspace(7)> %v, i32 %i573  ret ptr addrspace(7) %ret574}575 576define <2 x ptr addrspace(7)> @insertelement(<2 x ptr addrspace(7)> %v, ptr addrspace(7) %s, i32 %i) {577; CHECK-LABEL: define { <2 x ptr addrspace(8)>, <2 x i32> } @insertelement578; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[V:%.*]], { ptr addrspace(8), i32 } [[S:%.*]], i32 [[I:%.*]]) #[[ATTR0]] {579; CHECK-NEXT:    [[S_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[S]], 0580; CHECK-NEXT:    [[S_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[S]], 1581; CHECK-NEXT:    [[V_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[V]], 0582; CHECK-NEXT:    [[V_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[V]], 1583; CHECK-NEXT:    [[RET_RSRC:%.*]] = insertelement <2 x ptr addrspace(8)> [[V_RSRC]], ptr addrspace(8) [[S_RSRC]], i32 [[I]]584; CHECK-NEXT:    [[RET_OFF:%.*]] = insertelement <2 x i32> [[V_OFF]], i32 [[S_OFF]], i32 [[I]]585; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } poison, <2 x ptr addrspace(8)> [[RET_RSRC]], 0586; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[TMP1]], <2 x i32> [[RET_OFF]], 1587; CHECK-NEXT:    ret { <2 x ptr addrspace(8)>, <2 x i32> } [[RET]]588;589  %ret = insertelement <2 x ptr addrspace(7)> %v, ptr addrspace(7) %s, i32 %i590  ret <2 x ptr addrspace(7)> %ret591}592 593define <4 x ptr addrspace(7)> @shufflenvector(<2 x ptr addrspace(7)> %a, <2 x ptr addrspace(7)> %b) {594; CHECK-LABEL: define { <4 x ptr addrspace(8)>, <4 x i32> } @shufflenvector595; CHECK-SAME: ({ <2 x ptr addrspace(8)>, <2 x i32> } [[A:%.*]], { <2 x ptr addrspace(8)>, <2 x i32> } [[B:%.*]]) #[[ATTR0]] {596; CHECK-NEXT:    [[B_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 0597; CHECK-NEXT:    [[B_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[B]], 1598; CHECK-NEXT:    [[A_RSRC:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 0599; CHECK-NEXT:    [[A_OFF:%.*]] = extractvalue { <2 x ptr addrspace(8)>, <2 x i32> } [[A]], 1600; CHECK-NEXT:    [[RET_RSRC:%.*]] = shufflevector <2 x ptr addrspace(8)> [[A_RSRC]], <2 x ptr addrspace(8)> [[B_RSRC]], <4 x i32> <i32 0, i32 3, i32 1, i32 2>601; CHECK-NEXT:    [[RET_OFF:%.*]] = shufflevector <2 x i32> [[A_OFF]], <2 x i32> [[B_OFF]], <4 x i32> <i32 0, i32 3, i32 1, i32 2>602; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { <4 x ptr addrspace(8)>, <4 x i32> } poison, <4 x ptr addrspace(8)> [[RET_RSRC]], 0603; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <4 x ptr addrspace(8)>, <4 x i32> } [[TMP1]], <4 x i32> [[RET_OFF]], 1604; CHECK-NEXT:    ret { <4 x ptr addrspace(8)>, <4 x i32> } [[RET]]605;606  %ret = shufflevector <2 x ptr addrspace(7)> %a, <2 x ptr addrspace(7)> %b, <4 x i32> <i32 0, i32 3, i32 1, i32 2>607  ret <4 x ptr addrspace(7)> %ret608}609 610declare ptr addrspace(7) @llvm.ptrmask.p7.i32(ptr addrspace(7), i32)611 612define ptr addrspace(7) @ptrmask(ptr addrspace(7) %p, i32 %mask) {613; CHECK-LABEL: define { ptr addrspace(8), i32 } @ptrmask614; CHECK-SAME: ({ ptr addrspace(8), i32 } [[P:%.*]], i32 [[MASK:%.*]]) #[[ATTR0]] {615; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 0616; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 1617; CHECK-NEXT:    [[RET_OFF:%.*]] = and i32 [[P_OFF]], [[MASK]]618; CHECK-NEXT:    [[RET:%.*]] = insertvalue { ptr addrspace(8), i32 } [[P]], i32 [[RET_OFF]], 1619; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[RET]]620;621  %ret = call ptr addrspace(7) @llvm.ptrmask.p7.i32(ptr addrspace(7) %p, i32 %mask)622  ret ptr addrspace(7) %ret623}624 625declare ptr @llvm.invariant.start.p7(i64, ptr addrspace(7) nocapture)626declare void @llvm.invariant.end.p7(ptr, i64, ptr addrspace(7) nocapture)627 628define i32 @invariant_start_end(ptr addrspace(7) %p) {629; CHECK-LABEL: define i32 @invariant_start_end630; CHECK-SAME: ({ ptr addrspace(8), i32 } [[P:%.*]]) #[[ATTR0]] {631; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 0632; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 1633; CHECK-NEXT:    [[INV:%.*]] = call ptr @llvm.invariant.start.p8(i64 256, ptr addrspace(8) [[P_RSRC]])634; CHECK-NEXT:    [[V:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[P_RSRC]], i32 [[P_OFF]], i32 0, i32 0)635; CHECK-NEXT:    call void @llvm.invariant.end.p8(ptr [[INV]], i64 256, ptr addrspace(8) [[P_RSRC]])636; CHECK-NEXT:    ret i32 [[V]]637;638  %inv = call ptr @llvm.invariant.start.p7(i64 256, ptr addrspace(7) %p)639  %v = load i32, ptr addrspace(7) %p640  call void @llvm.invariant.end.p7(ptr %inv, i64 256, ptr addrspace(7) %p)641  ret i32 %v642}643 644declare ptr addrspace(7) @llvm.launder.invariant.group.p7(ptr addrspace(7) nocapture)645declare ptr addrspace(7) @llvm.strip.invariant.group.p7(ptr addrspace(7) nocapture)646 647define ptr addrspace(7) @invariant_group(ptr addrspace(7) %p) {648; CHECK-LABEL: define { ptr addrspace(8), i32 } @invariant_group649; CHECK-SAME: ({ ptr addrspace(8), i32 } [[P:%.*]]) #[[ATTR0]] {650; CHECK-NEXT:    [[P_RSRC:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 0651; CHECK-NEXT:    [[P_OFF:%.*]] = extractvalue { ptr addrspace(8), i32 } [[P]], 1652; CHECK-NEXT:    [[LAUNDERED:%.*]] = call ptr addrspace(8) @llvm.launder.invariant.group.p8(ptr addrspace(8) [[P_RSRC]])653; CHECK-NEXT:    [[STRIPPED:%.*]] = call ptr addrspace(8) @llvm.strip.invariant.group.p8(ptr addrspace(8) [[LAUNDERED]])654; CHECK-NEXT:    [[TMP1:%.*]] = insertvalue { ptr addrspace(8), i32 } poison, ptr addrspace(8) [[STRIPPED]], 0655; CHECK-NEXT:    [[TMP2:%.*]] = insertvalue { ptr addrspace(8), i32 } [[TMP1]], i32 [[P_OFF]], 1656; CHECK-NEXT:    ret { ptr addrspace(8), i32 } [[TMP2]]657;658  %laundered = call ptr addrspace(7) @llvm.launder.invariant.group.p7(ptr addrspace(7) %p)659  %stripped = call ptr addrspace(7) @llvm.strip.invariant.group.p7(ptr addrspace(7) %laundered)660  ret ptr addrspace(7) %stripped661}662