brintos

brintos / llvm-project-archived public Read only

0
0
Text · 118.8 KiB · a8e67a4 Raw
2209 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -S -mcpu=gfx900 -passes=amdgpu-lower-buffer-fat-pointers < %s | FileCheck %s3 4; Note: if you're adding tests here, also add them to5; buffer-fat-pointers-contents-legalization.ll to make sure the output of this6; transformation can codegen.7 8target triple = "amdgcn--"9 10;;; Legal types. These are natively supported, no casts should be performed.11 12define i8 @load_i8(ptr addrspace(8) inreg %buf) {13; CHECK-LABEL: define i8 @load_i8(14; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0:[0-9]+]] {15; CHECK-NEXT:    [[RET:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)16; CHECK-NEXT:    ret i8 [[RET]]17;18  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)19  %ret = load i8, ptr addrspace(7) %p20  ret i8 %ret21}22 23define void @store_i8(i8 %data, ptr addrspace(8) inreg %buf) {24; CHECK-LABEL: define void @store_i8(25; CHECK-SAME: i8 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {26; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)27; CHECK-NEXT:    ret void28;29  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)30  store i8 %data, ptr addrspace(7) %p31  ret void32}33 34define i16 @load_i16(ptr addrspace(8) inreg %buf) {35; CHECK-LABEL: define i16 @load_i16(36; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {37; CHECK-NEXT:    [[RET:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)38; CHECK-NEXT:    ret i16 [[RET]]39;40  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)41  %ret = load i16, ptr addrspace(7) %p42  ret i16 %ret43}44 45define void @store_i16(i16 %data, ptr addrspace(8) inreg %buf) {46; CHECK-LABEL: define void @store_i16(47; CHECK-SAME: i16 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {48; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)49; CHECK-NEXT:    ret void50;51  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)52  store i16 %data, ptr addrspace(7) %p53  ret void54}55 56define i32 @load_i32(ptr addrspace(8) inreg %buf) {57; CHECK-LABEL: define i32 @load_i32(58; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {59; CHECK-NEXT:    [[RET:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)60; CHECK-NEXT:    ret i32 [[RET]]61;62  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)63  %ret = load i32, ptr addrspace(7) %p64  ret i32 %ret65}66 67define void @store_i32(i32 %data, ptr addrspace(8) inreg %buf) {68; CHECK-LABEL: define void @store_i32(69; CHECK-SAME: i32 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {70; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)71; CHECK-NEXT:    ret void72;73  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)74  store i32 %data, ptr addrspace(7) %p75  ret void76}77 78define i64 @load_i64(ptr addrspace(8) inreg %buf) {79; CHECK-LABEL: define i64 @load_i64(80; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {81; CHECK-NEXT:    [[RET:%.*]] = call i64 @llvm.amdgcn.raw.ptr.buffer.load.i64(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)82; CHECK-NEXT:    ret i64 [[RET]]83;84  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)85  %ret = load i64, ptr addrspace(7) %p86  ret i64 %ret87}88 89define void @store_i64(i64 %data, ptr addrspace(8) inreg %buf) {90; CHECK-LABEL: define void @store_i64(91; CHECK-SAME: i64 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {92; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i64(i64 [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)93; CHECK-NEXT:    ret void94;95  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)96  store i64 %data, ptr addrspace(7) %p97  ret void98}99 100define i128 @load_i128(ptr addrspace(8) inreg %buf) {101; CHECK-LABEL: define i128 @load_i128(102; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {103; CHECK-NEXT:    [[RET:%.*]] = call i128 @llvm.amdgcn.raw.ptr.buffer.load.i128(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)104; CHECK-NEXT:    ret i128 [[RET]]105;106  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)107  %ret = load i128, ptr addrspace(7) %p108  ret i128 %ret109}110 111define void @store_i128(i128 %data, ptr addrspace(8) inreg %buf) {112; CHECK-LABEL: define void @store_i128(113; CHECK-SAME: i128 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {114; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i128(i128 [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)115; CHECK-NEXT:    ret void116;117  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)118  store i128 %data, ptr addrspace(7) %p119  ret void120}121 122define <1 x i32> @load_v1i32(ptr addrspace(8) inreg %buf) {123; CHECK-LABEL: define <1 x i32> @load_v1i32(124; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {125; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)126; CHECK-NEXT:    [[RET:%.*]] = bitcast i32 [[RET_LOADABLE]] to <1 x i32>127; CHECK-NEXT:    ret <1 x i32> [[RET]]128;129  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)130  %ret = load <1 x i32>, ptr addrspace(7) %p131  ret <1 x i32> %ret132}133 134define void @store_v1i32(<1 x i32> %data, ptr addrspace(8) inreg %buf) {135; CHECK-LABEL: define void @store_v1i32(136; CHECK-SAME: <1 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {137; CHECK-NEXT:    [[DATA_STORABLE:%.*]] = bitcast <1 x i32> [[DATA]] to i32138; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_STORABLE]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)139; CHECK-NEXT:    ret void140;141  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)142  store <1 x i32> %data, ptr addrspace(7) %p143  ret void144}145 146define <2 x i32> @load_v2i32(ptr addrspace(8) inreg %buf) {147; CHECK-LABEL: define <2 x i32> @load_v2i32(148; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {149; CHECK-NEXT:    [[RET:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)150; CHECK-NEXT:    ret <2 x i32> [[RET]]151;152  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)153  %ret = load <2 x i32>, ptr addrspace(7) %p154  ret <2 x i32> %ret155}156 157define void @store_v2i32(<2 x i32> %data, ptr addrspace(8) inreg %buf) {158; CHECK-LABEL: define void @store_v2i32(159; CHECK-SAME: <2 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {160; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)161; CHECK-NEXT:    ret void162;163  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)164  store <2 x i32> %data, ptr addrspace(7) %p165  ret void166}167 168define <3 x i32> @load_v3i32(ptr addrspace(8) inreg %buf) {169; CHECK-LABEL: define <3 x i32> @load_v3i32(170; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {171; CHECK-NEXT:    [[RET:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)172; CHECK-NEXT:    ret <3 x i32> [[RET]]173;174  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)175  %ret = load <3 x i32>, ptr addrspace(7) %p176  ret <3 x i32> %ret177}178 179define void @store_v3i32(<3 x i32> %data, ptr addrspace(8) inreg %buf) {180; CHECK-LABEL: define void @store_v3i32(181; CHECK-SAME: <3 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {182; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)183; CHECK-NEXT:    ret void184;185  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)186  store <3 x i32> %data, ptr addrspace(7) %p187  ret void188}189 190define <4 x i32> @load_v4i32(ptr addrspace(8) inreg %buf) {191; CHECK-LABEL: define <4 x i32> @load_v4i32(192; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {193; CHECK-NEXT:    [[RET:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)194; CHECK-NEXT:    ret <4 x i32> [[RET]]195;196  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)197  %ret = load <4 x i32>, ptr addrspace(7) %p198  ret <4 x i32> %ret199}200 201define void @store_v4i32(<4 x i32> %data, ptr addrspace(8) inreg %buf) {202; CHECK-LABEL: define void @store_v4i32(203; CHECK-SAME: <4 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {204; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)205; CHECK-NEXT:    ret void206;207  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)208  store <4 x i32> %data, ptr addrspace(7) %p209  ret void210}211 212define <2 x i16> @load_v2i16(ptr addrspace(8) inreg %buf) {213; CHECK-LABEL: define <2 x i16> @load_v2i16(214; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {215; CHECK-NEXT:    [[RET:%.*]] = call <2 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v2i16(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)216; CHECK-NEXT:    ret <2 x i16> [[RET]]217;218  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)219  %ret = load <2 x i16>, ptr addrspace(7) %p220  ret <2 x i16> %ret221}222 223define void @store_v2i16(<2 x i16> %data, ptr addrspace(8) inreg %buf) {224; CHECK-LABEL: define void @store_v2i16(225; CHECK-SAME: <2 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {226; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i16(<2 x i16> [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)227; CHECK-NEXT:    ret void228;229  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)230  store <2 x i16> %data, ptr addrspace(7) %p231  ret void232}233 234define <4 x i16> @load_v4i16(ptr addrspace(8) inreg %buf) {235; CHECK-LABEL: define <4 x i16> @load_v4i16(236; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {237; CHECK-NEXT:    [[RET:%.*]] = call <4 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v4i16(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)238; CHECK-NEXT:    ret <4 x i16> [[RET]]239;240  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)241  %ret = load <4 x i16>, ptr addrspace(7) %p242  ret <4 x i16> %ret243}244 245define void @store_v4i16(<4 x i16> %data, ptr addrspace(8) inreg %buf) {246; CHECK-LABEL: define void @store_v4i16(247; CHECK-SAME: <4 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {248; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i16(<4 x i16> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)249; CHECK-NEXT:    ret void250;251  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)252  store <4 x i16> %data, ptr addrspace(7) %p253  ret void254}255 256define <8 x i16> @load_v8i16(ptr addrspace(8) inreg %buf) {257; CHECK-LABEL: define <8 x i16> @load_v8i16(258; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {259; CHECK-NEXT:    [[RET:%.*]] = call <8 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v8i16(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)260; CHECK-NEXT:    ret <8 x i16> [[RET]]261;262  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)263  %ret = load <8 x i16>, ptr addrspace(7) %p264  ret <8 x i16> %ret265}266 267define void @store_v8i16(<8 x i16> %data, ptr addrspace(8) inreg %buf) {268; CHECK-LABEL: define void @store_v8i16(269; CHECK-SAME: <8 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {270; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v8i16(<8 x i16> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)271; CHECK-NEXT:    ret void272;273  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)274  store <8 x i16> %data, ptr addrspace(7) %p275  ret void276}277 278define <2 x i64> @load_v2i64(ptr addrspace(8) inreg %buf) {279; CHECK-LABEL: define <2 x i64> @load_v2i64(280; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {281; CHECK-NEXT:    [[RET:%.*]] = call <2 x i64> @llvm.amdgcn.raw.ptr.buffer.load.v2i64(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)282; CHECK-NEXT:    ret <2 x i64> [[RET]]283;284  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)285  %ret = load <2 x i64>, ptr addrspace(7) %p286  ret <2 x i64> %ret287}288 289define void @store_v2i64(<2 x i64> %data, ptr addrspace(8) inreg %buf) {290; CHECK-LABEL: define void @store_v2i64(291; CHECK-SAME: <2 x i64> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {292; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i64(<2 x i64> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)293; CHECK-NEXT:    ret void294;295  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)296  store <2 x i64> %data, ptr addrspace(7) %p297  ret void298}299 300define half @load_f16(ptr addrspace(8) inreg %buf) {301; CHECK-LABEL: define half @load_f16(302; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {303; CHECK-NEXT:    [[RET:%.*]] = call half @llvm.amdgcn.raw.ptr.buffer.load.f16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)304; CHECK-NEXT:    ret half [[RET]]305;306  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)307  %ret = load half, ptr addrspace(7) %p308  ret half %ret309}310 311define void @store_f16(half %data, ptr addrspace(8) inreg %buf) {312; CHECK-LABEL: define void @store_f16(313; CHECK-SAME: half [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {314; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.f16(half [[DATA]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)315; CHECK-NEXT:    ret void316;317  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)318  store half %data, ptr addrspace(7) %p319  ret void320}321 322define bfloat @load_bf16(ptr addrspace(8) inreg %buf) {323; CHECK-LABEL: define bfloat @load_bf16(324; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {325; CHECK-NEXT:    [[RET:%.*]] = call bfloat @llvm.amdgcn.raw.ptr.buffer.load.bf16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)326; CHECK-NEXT:    ret bfloat [[RET]]327;328  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)329  %ret = load bfloat, ptr addrspace(7) %p330  ret bfloat %ret331}332 333define void @store_bf16(bfloat %data, ptr addrspace(8) inreg %buf) {334; CHECK-LABEL: define void @store_bf16(335; CHECK-SAME: bfloat [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {336; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.bf16(bfloat [[DATA]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)337; CHECK-NEXT:    ret void338;339  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)340  store bfloat %data, ptr addrspace(7) %p341  ret void342}343 344define <2 x half> @load_v2f16(ptr addrspace(8) inreg %buf) {345; CHECK-LABEL: define <2 x half> @load_v2f16(346; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {347; CHECK-NEXT:    [[RET:%.*]] = call <2 x half> @llvm.amdgcn.raw.ptr.buffer.load.v2f16(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)348; CHECK-NEXT:    ret <2 x half> [[RET]]349;350  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)351  %ret = load <2 x half>, ptr addrspace(7) %p352  ret <2 x half> %ret353}354 355define void @store_v2f16(<2 x half> %data, ptr addrspace(8) inreg %buf) {356; CHECK-LABEL: define void @store_v2f16(357; CHECK-SAME: <2 x half> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {358; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2f16(<2 x half> [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)359; CHECK-NEXT:    ret void360;361  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)362  store <2 x half> %data, ptr addrspace(7) %p363  ret void364}365 366define <4 x bfloat> @load_v4bf16(ptr addrspace(8) inreg %buf) {367; CHECK-LABEL: define <4 x bfloat> @load_v4bf16(368; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {369; CHECK-NEXT:    [[RET:%.*]] = call <4 x bfloat> @llvm.amdgcn.raw.ptr.buffer.load.v4bf16(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)370; CHECK-NEXT:    ret <4 x bfloat> [[RET]]371;372  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)373  %ret = load <4 x bfloat>, ptr addrspace(7) %p374  ret <4 x bfloat> %ret375}376 377define void @store_v4bf16(<4 x bfloat> %data, ptr addrspace(8) inreg %buf) {378; CHECK-LABEL: define void @store_v4bf16(379; CHECK-SAME: <4 x bfloat> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {380; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4bf16(<4 x bfloat> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)381; CHECK-NEXT:    ret void382;383  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)384  store <4 x bfloat> %data, ptr addrspace(7) %p385  ret void386}387 388define <8 x half> @load_v8f16(ptr addrspace(8) inreg %buf) {389; CHECK-LABEL: define <8 x half> @load_v8f16(390; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {391; CHECK-NEXT:    [[RET:%.*]] = call <8 x half> @llvm.amdgcn.raw.ptr.buffer.load.v8f16(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)392; CHECK-NEXT:    ret <8 x half> [[RET]]393;394  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)395  %ret = load <8 x half>, ptr addrspace(7) %p396  ret <8 x half> %ret397}398 399define void @store_v8f16(<8 x half> %data, ptr addrspace(8) inreg %buf) {400; CHECK-LABEL: define void @store_v8f16(401; CHECK-SAME: <8 x half> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {402; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v8f16(<8 x half> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)403; CHECK-NEXT:    ret void404;405  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)406  store <8 x half> %data, ptr addrspace(7) %p407  ret void408}409 410define float @load_f32(ptr addrspace(8) inreg %buf) {411; CHECK-LABEL: define float @load_f32(412; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {413; CHECK-NEXT:    [[RET:%.*]] = call float @llvm.amdgcn.raw.ptr.buffer.load.f32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)414; CHECK-NEXT:    ret float [[RET]]415;416  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)417  %ret = load float, ptr addrspace(7) %p418  ret float %ret419}420 421define void @store_f32(float %data, ptr addrspace(8) inreg %buf) {422; CHECK-LABEL: define void @store_f32(423; CHECK-SAME: float [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {424; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.f32(float [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)425; CHECK-NEXT:    ret void426;427  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)428  store float %data, ptr addrspace(7) %p429  ret void430}431 432define <2 x float> @load_v2f32(ptr addrspace(8) inreg %buf) {433; CHECK-LABEL: define <2 x float> @load_v2f32(434; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {435; CHECK-NEXT:    [[RET:%.*]] = call <2 x float> @llvm.amdgcn.raw.ptr.buffer.load.v2f32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)436; CHECK-NEXT:    ret <2 x float> [[RET]]437;438  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)439  %ret = load <2 x float>, ptr addrspace(7) %p440  ret <2 x float> %ret441}442 443define void @store_v2f32(<2 x float> %data, ptr addrspace(8) inreg %buf) {444; CHECK-LABEL: define void @store_v2f32(445; CHECK-SAME: <2 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {446; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2f32(<2 x float> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)447; CHECK-NEXT:    ret void448;449  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)450  store <2 x float> %data, ptr addrspace(7) %p451  ret void452}453 454define <3 x float> @load_v3f32(ptr addrspace(8) inreg %buf) {455; CHECK-LABEL: define <3 x float> @load_v3f32(456; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {457; CHECK-NEXT:    [[RET:%.*]] = call <3 x float> @llvm.amdgcn.raw.ptr.buffer.load.v3f32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)458; CHECK-NEXT:    ret <3 x float> [[RET]]459;460  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)461  %ret = load <3 x float>, ptr addrspace(7) %p462  ret <3 x float> %ret463}464 465define void @store_v3f32(<3 x float> %data, ptr addrspace(8) inreg %buf) {466; CHECK-LABEL: define void @store_v3f32(467; CHECK-SAME: <3 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {468; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3f32(<3 x float> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)469; CHECK-NEXT:    ret void470;471  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)472  store <3 x float> %data, ptr addrspace(7) %p473  ret void474}475 476define <4 x float> @load_v4f32(ptr addrspace(8) inreg %buf) {477; CHECK-LABEL: define <4 x float> @load_v4f32(478; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {479; CHECK-NEXT:    [[RET:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)480; CHECK-NEXT:    ret <4 x float> [[RET]]481;482  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)483  %ret = load <4 x float>, ptr addrspace(7) %p484  ret <4 x float> %ret485}486 487define void @store_v4f32(<4 x float> %data, ptr addrspace(8) inreg %buf) {488; CHECK-LABEL: define void @store_v4f32(489; CHECK-SAME: <4 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {490; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)491; CHECK-NEXT:    ret void492;493  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)494  store <4 x float> %data, ptr addrspace(7) %p495  ret void496}497 498define ptr addrspace(0) @load_p0(ptr addrspace(8) inreg %buf) {499; CHECK-LABEL: define ptr @load_p0(500; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {501; CHECK-NEXT:    [[RET:%.*]] = call ptr @llvm.amdgcn.raw.ptr.buffer.load.p0(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)502; CHECK-NEXT:    ret ptr [[RET]]503;504  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)505  %ret = load ptr addrspace(0), ptr addrspace(7) %p506  ret ptr addrspace(0) %ret507}508 509define void @store_p0(ptr addrspace(0) %data, ptr addrspace(8) inreg %buf) {510; CHECK-LABEL: define void @store_p0(511; CHECK-SAME: ptr [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {512; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p0(ptr [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)513; CHECK-NEXT:    ret void514;515  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)516  store ptr addrspace(0) %data, ptr addrspace(7) %p517  ret void518}519 520define ptr addrspace(1) @load_p1(ptr addrspace(8) inreg %buf) {521; CHECK-LABEL: define ptr addrspace(1) @load_p1(522; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {523; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(1) @llvm.amdgcn.raw.ptr.buffer.load.p1(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)524; CHECK-NEXT:    ret ptr addrspace(1) [[RET]]525;526  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)527  %ret = load ptr addrspace(1), ptr addrspace(7) %p528  ret ptr addrspace(1) %ret529}530 531define void @store_p1(ptr addrspace(1) %data, ptr addrspace(8) inreg %buf) {532; CHECK-LABEL: define void @store_p1(533; CHECK-SAME: ptr addrspace(1) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {534; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p1(ptr addrspace(1) [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)535; CHECK-NEXT:    ret void536;537  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)538  store ptr addrspace(1) %data, ptr addrspace(7) %p539  ret void540}541 542define ptr addrspace(2) @load_p2(ptr addrspace(8) inreg %buf) {543; CHECK-LABEL: define ptr addrspace(2) @load_p2(544; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {545; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(2) @llvm.amdgcn.raw.ptr.buffer.load.p2(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)546; CHECK-NEXT:    ret ptr addrspace(2) [[RET]]547;548  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)549  %ret = load ptr addrspace(2), ptr addrspace(7) %p550  ret ptr addrspace(2) %ret551}552 553define void @store_p2(ptr addrspace(2) %data, ptr addrspace(8) inreg %buf) {554; CHECK-LABEL: define void @store_p2(555; CHECK-SAME: ptr addrspace(2) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {556; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p2(ptr addrspace(2) [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)557; CHECK-NEXT:    ret void558;559  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)560  store ptr addrspace(2) %data, ptr addrspace(7) %p561  ret void562}563 564define ptr addrspace(3) @load_p3(ptr addrspace(8) inreg %buf) {565; CHECK-LABEL: define ptr addrspace(3) @load_p3(566; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {567; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(3) @llvm.amdgcn.raw.ptr.buffer.load.p3(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)568; CHECK-NEXT:    ret ptr addrspace(3) [[RET]]569;570  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)571  %ret = load ptr addrspace(3), ptr addrspace(7) %p572  ret ptr addrspace(3) %ret573}574 575define void @store_p3(ptr addrspace(3) %data, ptr addrspace(8) inreg %buf) {576; CHECK-LABEL: define void @store_p3(577; CHECK-SAME: ptr addrspace(3) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {578; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p3(ptr addrspace(3) [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)579; CHECK-NEXT:    ret void580;581  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)582  store ptr addrspace(3) %data, ptr addrspace(7) %p583  ret void584}585 586define ptr addrspace(4) @load_p4(ptr addrspace(8) inreg %buf) {587; CHECK-LABEL: define ptr addrspace(4) @load_p4(588; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {589; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(4) @llvm.amdgcn.raw.ptr.buffer.load.p4(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)590; CHECK-NEXT:    ret ptr addrspace(4) [[RET]]591;592  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)593  %ret = load ptr addrspace(4), ptr addrspace(7) %p594  ret ptr addrspace(4) %ret595}596 597define void @store_p4(ptr addrspace(4) %data, ptr addrspace(8) inreg %buf) {598; CHECK-LABEL: define void @store_p4(599; CHECK-SAME: ptr addrspace(4) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {600; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p4(ptr addrspace(4) [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)601; CHECK-NEXT:    ret void602;603  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)604  store ptr addrspace(4) %data, ptr addrspace(7) %p605  ret void606}607 608define ptr addrspace(5) @load_p5(ptr addrspace(8) inreg %buf) {609; CHECK-LABEL: define ptr addrspace(5) @load_p5(610; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {611; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(5) @llvm.amdgcn.raw.ptr.buffer.load.p5(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)612; CHECK-NEXT:    ret ptr addrspace(5) [[RET]]613;614  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)615  %ret = load ptr addrspace(5), ptr addrspace(7) %p616  ret ptr addrspace(5) %ret617}618 619define void @store_p5(ptr addrspace(5) %data, ptr addrspace(8) inreg %buf) {620; CHECK-LABEL: define void @store_p5(621; CHECK-SAME: ptr addrspace(5) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {622; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p5(ptr addrspace(5) [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)623; CHECK-NEXT:    ret void624;625  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)626  store ptr addrspace(5) %data, ptr addrspace(7) %p627  ret void628}629 630define ptr addrspace(6) @load_p6(ptr addrspace(8) inreg %buf) {631; CHECK-LABEL: define ptr addrspace(6) @load_p6(632; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {633; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(6) @llvm.amdgcn.raw.ptr.buffer.load.p6(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)634; CHECK-NEXT:    ret ptr addrspace(6) [[RET]]635;636  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)637  %ret = load ptr addrspace(6), ptr addrspace(7) %p638  ret ptr addrspace(6) %ret639}640 641define void @store_p6(ptr addrspace(6) %data, ptr addrspace(8) inreg %buf) {642; CHECK-LABEL: define void @store_p6(643; CHECK-SAME: ptr addrspace(6) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {644; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p6(ptr addrspace(6) [[DATA]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)645; CHECK-NEXT:    ret void646;647  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)648  store ptr addrspace(6) %data, ptr addrspace(7) %p649  ret void650}651 652define ptr addrspace(8) @load_p8(ptr addrspace(8) inreg %buf) {653; CHECK-LABEL: define ptr addrspace(8) @load_p8(654; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {655; CHECK-NEXT:    [[RET:%.*]] = call ptr addrspace(8) @llvm.amdgcn.raw.ptr.buffer.load.p8(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)656; CHECK-NEXT:    ret ptr addrspace(8) [[RET]]657;658  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)659  %ret = load ptr addrspace(8), ptr addrspace(7) %p660  ret ptr addrspace(8) %ret661}662 663define void @store_p8(ptr addrspace(8) %data, ptr addrspace(8) inreg %buf) {664; CHECK-LABEL: define void @store_p8(665; CHECK-SAME: ptr addrspace(8) [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {666; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.p8(ptr addrspace(8) [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)667; CHECK-NEXT:    ret void668;669  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)670  store ptr addrspace(8) %data, ptr addrspace(7) %p671  ret void672}673 674define <2 x ptr addrspace(1)> @load_v2p1(ptr addrspace(8) inreg %buf) {675; CHECK-LABEL: define <2 x ptr addrspace(1)> @load_v2p1(676; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {677; CHECK-NEXT:    [[RET:%.*]] = call <2 x ptr addrspace(1)> @llvm.amdgcn.raw.ptr.buffer.load.v2p1(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)678; CHECK-NEXT:    ret <2 x ptr addrspace(1)> [[RET]]679;680  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)681  %ret = load <2 x ptr addrspace(1)>, ptr addrspace(7) %p682  ret <2 x ptr addrspace(1)> %ret683}684 685define void @store_v2p1(<2 x ptr addrspace(1)> %data, ptr addrspace(8) inreg %buf) {686; CHECK-LABEL: define void @store_v2p1(687; CHECK-SAME: <2 x ptr addrspace(1)> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {688; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2p1(<2 x ptr addrspace(1)> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)689; CHECK-NEXT:    ret void690;691  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)692  store <2 x ptr addrspace(1)> %data, ptr addrspace(7) %p693  ret void694}695 696define <2 x ptr addrspace(5)> @load_v2p5(ptr addrspace(8) inreg %buf) {697; CHECK-LABEL: define <2 x ptr addrspace(5)> @load_v2p5(698; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {699; CHECK-NEXT:    [[RET:%.*]] = call <2 x ptr addrspace(5)> @llvm.amdgcn.raw.ptr.buffer.load.v2p5(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)700; CHECK-NEXT:    ret <2 x ptr addrspace(5)> [[RET]]701;702  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)703  %ret = load <2 x ptr addrspace(5)>, ptr addrspace(7) %p704  ret <2 x ptr addrspace(5)> %ret705}706 707define void @store_v2p5(<2 x ptr addrspace(5)> %data, ptr addrspace(8) inreg %buf) {708; CHECK-LABEL: define void @store_v2p5(709; CHECK-SAME: <2 x ptr addrspace(5)> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {710; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2p5(<2 x ptr addrspace(5)> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)711; CHECK-NEXT:    ret void712;713  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)714  store <2 x ptr addrspace(5)> %data, ptr addrspace(7) %p715  ret void716}717 718define <3 x ptr addrspace(5)> @load_v3p5(ptr addrspace(8) inreg %buf) {719; CHECK-LABEL: define <3 x ptr addrspace(5)> @load_v3p5(720; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {721; CHECK-NEXT:    [[RET:%.*]] = call <3 x ptr addrspace(5)> @llvm.amdgcn.raw.ptr.buffer.load.v3p5(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)722; CHECK-NEXT:    ret <3 x ptr addrspace(5)> [[RET]]723;724  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)725  %ret = load <3 x ptr addrspace(5)>, ptr addrspace(7) %p726  ret <3 x ptr addrspace(5)> %ret727}728 729define void @store_v3p5(<3 x ptr addrspace(5)> %data, ptr addrspace(8) inreg %buf) {730; CHECK-LABEL: define void @store_v3p5(731; CHECK-SAME: <3 x ptr addrspace(5)> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {732; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3p5(<3 x ptr addrspace(5)> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)733; CHECK-NEXT:    ret void734;735  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)736  store <3 x ptr addrspace(5)> %data, ptr addrspace(7) %p737  ret void738}739 740define <4 x ptr addrspace(5)> @load_v4p5(ptr addrspace(8) inreg %buf) {741; CHECK-LABEL: define <4 x ptr addrspace(5)> @load_v4p5(742; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {743; CHECK-NEXT:    [[RET:%.*]] = call <4 x ptr addrspace(5)> @llvm.amdgcn.raw.ptr.buffer.load.v4p5(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)744; CHECK-NEXT:    ret <4 x ptr addrspace(5)> [[RET]]745;746  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)747  %ret = load <4 x ptr addrspace(5)>, ptr addrspace(7) %p748  ret <4 x ptr addrspace(5)> %ret749}750 751define void @store_v4p5(<4 x ptr addrspace(5)> %data, ptr addrspace(8) inreg %buf) {752; CHECK-LABEL: define void @store_v4p5(753; CHECK-SAME: <4 x ptr addrspace(5)> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {754; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4p5(<4 x ptr addrspace(5)> [[DATA]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)755; CHECK-NEXT:    ret void756;757  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)758  store <4 x ptr addrspace(5)> %data, ptr addrspace(7) %p759  ret void760}761 762;;; 3 words in a short type. These need to be bitcast to <3 x i32> to be supported.763 764define <6 x half> @load_v6f16(ptr addrspace(8) inreg %buf) {765; CHECK-LABEL: define <6 x half> @load_v6f16(766; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {767; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)768; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i32> [[RET_LOADABLE]] to <6 x half>769; CHECK-NEXT:    ret <6 x half> [[RET]]770;771  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)772  %ret = load <6 x half>, ptr addrspace(7) %p773  ret <6 x half> %ret774}775 776define void @store_v6f16(<6 x half> %data, ptr addrspace(8) inreg %buf) {777; CHECK-LABEL: define void @store_v6f16(778; CHECK-SAME: <6 x half> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {779; CHECK-NEXT:    [[DATA_STORABLE:%.*]] = bitcast <6 x half> [[DATA]] to <3 x i32>780; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA_STORABLE]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)781; CHECK-NEXT:    ret void782;783  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)784  store <6 x half> %data, ptr addrspace(7) %p785  ret void786}787 788;;; Long types (32 bit elements). Must be split into multiple operations.789 790define <5 x float> @load_v5f32(ptr addrspace(8) inreg %buf) {791; CHECK-LABEL: define <5 x float> @load_v5f32(792; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {793; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)794; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x float> [[RET_OFF_0]], <4 x float> poison, <5 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison>795; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <5 x float> poison, <5 x float> [[RET_EXT_0]], <5 x i32> <i32 5, i32 6, i32 7, i32 8, i32 4>796; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call float @llvm.amdgcn.raw.ptr.buffer.load.f32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)797; CHECK-NEXT:    [[RET:%.*]] = insertelement <5 x float> [[RET_PARTS_0]], float [[RET_OFF_16]], i64 4798; CHECK-NEXT:    ret <5 x float> [[RET]]799;800  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)801  %ret = load <5 x float>, ptr addrspace(7) %p802  ret <5 x float> %ret803}804 805define void @store_v5f32(<5 x float> %data, ptr addrspace(8) inreg %buf) {806; CHECK-LABEL: define void @store_v5f32(807; CHECK-SAME: <5 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {808; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <5 x float> [[DATA]], <5 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>809; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)810; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = extractelement <5 x float> [[DATA]], i64 4811; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.f32(float [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)812; CHECK-NEXT:    ret void813;814  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)815  store <5 x float> %data, ptr addrspace(7) %p816  ret void817}818 819define <6 x float> @load_v6f32(ptr addrspace(8) inreg %buf) {820; CHECK-LABEL: define <6 x float> @load_v6f32(821; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {822; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)823; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x float> [[RET_OFF_0]], <4 x float> poison, <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison>824; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <6 x float> poison, <6 x float> [[RET_EXT_0]], <6 x i32> <i32 6, i32 7, i32 8, i32 9, i32 4, i32 5>825; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <2 x float> @llvm.amdgcn.raw.ptr.buffer.load.v2f32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)826; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <2 x float> [[RET_OFF_16]], <2 x float> poison, <6 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison>827; CHECK-NEXT:    [[RET:%.*]] = shufflevector <6 x float> [[RET_PARTS_0]], <6 x float> [[RET_EXT_4]], <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 6, i32 7>828; CHECK-NEXT:    ret <6 x float> [[RET]]829;830  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)831  %ret = load <6 x float>, ptr addrspace(7) %p832  ret <6 x float> %ret833}834 835define void @store_v6f32(<6 x float> %data, ptr addrspace(8) inreg %buf) {836; CHECK-LABEL: define void @store_v6f32(837; CHECK-SAME: <6 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {838; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <6 x float> [[DATA]], <6 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>839; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)840; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <6 x float> [[DATA]], <6 x float> poison, <2 x i32> <i32 4, i32 5>841; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2f32(<2 x float> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)842; CHECK-NEXT:    ret void843;844  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)845  store <6 x float> %data, ptr addrspace(7) %p846  ret void847}848 849define <7 x float> @load_v7f32(ptr addrspace(8) inreg %buf) {850; CHECK-LABEL: define <7 x float> @load_v7f32(851; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {852; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)853; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x float> [[RET_OFF_0]], <4 x float> poison, <7 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison>854; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <7 x float> poison, <7 x float> [[RET_EXT_0]], <7 x i32> <i32 7, i32 8, i32 9, i32 10, i32 4, i32 5, i32 6>855; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <3 x float> @llvm.amdgcn.raw.ptr.buffer.load.v3f32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)856; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <3 x float> [[RET_OFF_16]], <3 x float> poison, <7 x i32> <i32 0, i32 1, i32 2, i32 poison, i32 poison, i32 poison, i32 poison>857; CHECK-NEXT:    [[RET:%.*]] = shufflevector <7 x float> [[RET_PARTS_0]], <7 x float> [[RET_EXT_4]], <7 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 8, i32 9>858; CHECK-NEXT:    ret <7 x float> [[RET]]859;860  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)861  %ret = load <7 x float>, ptr addrspace(7) %p862  ret <7 x float> %ret863}864 865define void @store_v7f32(<7 x float> %data, ptr addrspace(8) inreg %buf) {866; CHECK-LABEL: define void @store_v7f32(867; CHECK-SAME: <7 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {868; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <7 x float> [[DATA]], <7 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>869; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)870; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <7 x float> [[DATA]], <7 x float> poison, <3 x i32> <i32 4, i32 5, i32 6>871; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3f32(<3 x float> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)872; CHECK-NEXT:    ret void873;874  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)875  store <7 x float> %data, ptr addrspace(7) %p876  ret void877}878 879define <8 x float> @load_v8f32(ptr addrspace(8) inreg %buf) {880; CHECK-LABEL: define <8 x float> @load_v8f32(881; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {882; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)883; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x float> [[RET_OFF_0]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>884; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <8 x float> poison, <8 x float> [[RET_EXT_0]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>885; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)886; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <4 x float> [[RET_OFF_16]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>887; CHECK-NEXT:    [[RET:%.*]] = shufflevector <8 x float> [[RET_PARTS_0]], <8 x float> [[RET_EXT_4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>888; CHECK-NEXT:    ret <8 x float> [[RET]]889;890  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)891  %ret = load <8 x float>, ptr addrspace(7) %p892  ret <8 x float> %ret893}894 895define void @store_v8f32(<8 x float> %data, ptr addrspace(8) inreg %buf) {896; CHECK-LABEL: define void @store_v8f32(897; CHECK-SAME: <8 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {898; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <8 x float> [[DATA]], <8 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>899; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)900; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <8 x float> [[DATA]], <8 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>901; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)902; CHECK-NEXT:    ret void903;904  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)905  store <8 x float> %data, ptr addrspace(7) %p906  ret void907}908 909define <10 x float> @load_v10f32(ptr addrspace(8) inreg %buf) {910; CHECK-LABEL: define <10 x float> @load_v10f32(911; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {912; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 64 [[BUF]], i32 0, i32 0, i32 0)913; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x float> [[RET_OFF_0]], <4 x float> poison, <10 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>914; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <10 x float> poison, <10 x float> [[RET_EXT_0]], <10 x i32> <i32 10, i32 11, i32 12, i32 13, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9>915; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <4 x float> @llvm.amdgcn.raw.ptr.buffer.load.v4f32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)916; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <4 x float> [[RET_OFF_16]], <4 x float> poison, <10 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>917; CHECK-NEXT:    [[RET_PARTS_4:%.*]] = shufflevector <10 x float> [[RET_PARTS_0]], <10 x float> [[RET_EXT_4]], <10 x i32> <i32 0, i32 1, i32 2, i32 3, i32 10, i32 11, i32 12, i32 13, i32 8, i32 9>918; CHECK-NEXT:    [[RET_OFF_32:%.*]] = call <2 x float> @llvm.amdgcn.raw.ptr.buffer.load.v2f32(ptr addrspace(8) align 32 [[BUF]], i32 32, i32 0, i32 0)919; CHECK-NEXT:    [[RET_EXT_8:%.*]] = shufflevector <2 x float> [[RET_OFF_32]], <2 x float> poison, <10 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>920; CHECK-NEXT:    [[RET:%.*]] = shufflevector <10 x float> [[RET_PARTS_4]], <10 x float> [[RET_EXT_8]], <10 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 10, i32 11>921; CHECK-NEXT:    ret <10 x float> [[RET]]922;923  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)924  %ret = load <10 x float>, ptr addrspace(7) %p925  ret <10 x float> %ret926}927 928define void @store_v10f32(<10 x float> %data, ptr addrspace(8) inreg %buf) {929; CHECK-LABEL: define void @store_v10f32(930; CHECK-SAME: <10 x float> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {931; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <10 x float> [[DATA]], <10 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>932; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_0]], ptr addrspace(8) align 64 [[BUF]], i32 0, i32 0, i32 0)933; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <10 x float> [[DATA]], <10 x float> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>934; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4f32(<4 x float> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)935; CHECK-NEXT:    [[DATA_SLICE_8:%.*]] = shufflevector <10 x float> [[DATA]], <10 x float> poison, <2 x i32> <i32 8, i32 9>936; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2f32(<2 x float> [[DATA_SLICE_8]], ptr addrspace(8) align 32 [[BUF]], i32 32, i32 0, i32 0)937; CHECK-NEXT:    ret void938;939  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)940  store <10 x float> %data, ptr addrspace(7) %p941  ret void942}943 944define <6 x i32> @load_v6i32(ptr addrspace(8) inreg %buf) {945; CHECK-LABEL: define <6 x i32> @load_v6i32(946; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {947; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)948; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i32> [[RET_OFF_0]], <4 x i32> poison, <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison>949; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <6 x i32> poison, <6 x i32> [[RET_EXT_0]], <6 x i32> <i32 6, i32 7, i32 8, i32 9, i32 4, i32 5>950; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)951; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <2 x i32> [[RET_OFF_16]], <2 x i32> poison, <6 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison>952; CHECK-NEXT:    [[RET:%.*]] = shufflevector <6 x i32> [[RET_PARTS_0]], <6 x i32> [[RET_EXT_4]], <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 6, i32 7>953; CHECK-NEXT:    ret <6 x i32> [[RET]]954;955  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)956  %ret = load <6 x i32>, ptr addrspace(7) %p957  ret <6 x i32> %ret958}959 960define void @store_v6i32(<6 x i32> %data, ptr addrspace(8) inreg %buf) {961; CHECK-LABEL: define void @store_v6i32(962; CHECK-SAME: <6 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {963; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <6 x i32> [[DATA]], <6 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>964; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)965; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <6 x i32> [[DATA]], <6 x i32> poison, <2 x i32> <i32 4, i32 5>966; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)967; CHECK-NEXT:    ret void968;969  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)970  store <6 x i32> %data, ptr addrspace(7) %p971  ret void972}973 974define <4 x ptr addrspace(1)> @load_v4p1(ptr addrspace(8) inreg %buf) {975; CHECK-LABEL: define <4 x ptr addrspace(1)> @load_v4p1(976; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {977; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <2 x ptr addrspace(1)> @llvm.amdgcn.raw.ptr.buffer.load.v2p1(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)978; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <2 x ptr addrspace(1)> [[RET_OFF_0]], <2 x ptr addrspace(1)> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>979; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <4 x ptr addrspace(1)> poison, <4 x ptr addrspace(1)> [[RET_EXT_0]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>980; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <2 x ptr addrspace(1)> @llvm.amdgcn.raw.ptr.buffer.load.v2p1(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)981; CHECK-NEXT:    [[RET_EXT_2:%.*]] = shufflevector <2 x ptr addrspace(1)> [[RET_OFF_16]], <2 x ptr addrspace(1)> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>982; CHECK-NEXT:    [[RET:%.*]] = shufflevector <4 x ptr addrspace(1)> [[RET_PARTS_0]], <4 x ptr addrspace(1)> [[RET_EXT_2]], <4 x i32> <i32 0, i32 1, i32 4, i32 5>983; CHECK-NEXT:    ret <4 x ptr addrspace(1)> [[RET]]984;985  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)986  %ret = load <4 x ptr addrspace(1)>, ptr addrspace(7) %p987  ret <4 x ptr addrspace(1)> %ret988}989 990define void @store_v4p1(<4 x ptr addrspace(1)> %data, ptr addrspace(8) inreg %buf) {991; CHECK-LABEL: define void @store_v4p1(992; CHECK-SAME: <4 x ptr addrspace(1)> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {993; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <4 x ptr addrspace(1)> [[DATA]], <4 x ptr addrspace(1)> poison, <2 x i32> <i32 0, i32 1>994; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2p1(<2 x ptr addrspace(1)> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)995; CHECK-NEXT:    [[DATA_SLICE_2:%.*]] = shufflevector <4 x ptr addrspace(1)> [[DATA]], <4 x ptr addrspace(1)> poison, <2 x i32> <i32 2, i32 3>996; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2p1(<2 x ptr addrspace(1)> [[DATA_SLICE_2]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)997; CHECK-NEXT:    ret void998;999  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1000  store <4 x ptr addrspace(1)> %data, ptr addrspace(7) %p1001  ret void1002}1003 1004;;; Uneven types with 16-bit elements. Require splitting into multiple operations.1005 1006define <1 x i16> @load_v1i16(ptr addrspace(8) inreg %buf) {1007; CHECK-LABEL: define <1 x i16> @load_v1i16(1008; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1009; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1010; CHECK-NEXT:    [[RET:%.*]] = bitcast i16 [[RET_LOADABLE]] to <1 x i16>1011; CHECK-NEXT:    ret <1 x i16> [[RET]]1012;1013  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1014  %ret = load <1 x i16>, ptr addrspace(7) %p1015  ret <1 x i16> %ret1016}1017 1018define void @store_v1i16(<1 x i16> %data, ptr addrspace(8) inreg %buf) {1019; CHECK-LABEL: define void @store_v1i16(1020; CHECK-SAME: <1 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1021; CHECK-NEXT:    [[DATA_STORABLE:%.*]] = bitcast <1 x i16> [[DATA]] to i161022; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_STORABLE]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1023; CHECK-NEXT:    ret void1024;1025  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1026  store <1 x i16> %data, ptr addrspace(7) %p1027  ret void1028}1029 1030define <3 x i16> @load_v3i16(ptr addrspace(8) inreg %buf) {1031; CHECK-LABEL: define <3 x i16> @load_v3i16(1032; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1033; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <2 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v2i16(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1034; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <2 x i16> [[RET_OFF_0]], <2 x i16> poison, <3 x i32> <i32 0, i32 1, i32 poison>1035; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <3 x i16> poison, <3 x i16> [[RET_EXT_0]], <3 x i32> <i32 3, i32 4, i32 2>1036; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1037; CHECK-NEXT:    [[RET:%.*]] = insertelement <3 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_4]], i64 21038; CHECK-NEXT:    ret <3 x i16> [[RET]]1039;1040  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1041  %ret = load <3 x i16>, ptr addrspace(7) %p1042  ret <3 x i16> %ret1043}1044 1045define void @store_v3i16(<3 x i16> %data, ptr addrspace(8) inreg %buf) {1046; CHECK-LABEL: define void @store_v3i16(1047; CHECK-SAME: <3 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1048; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <3 x i16> [[DATA]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>1049; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i16(<2 x i16> [[DATA_SLICE_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1050; CHECK-NEXT:    [[DATA_SLICE_2:%.*]] = extractelement <3 x i16> [[DATA]], i64 21051; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_2]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1052; CHECK-NEXT:    ret void1053;1054  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1055  store <3 x i16> %data, ptr addrspace(7) %p1056  ret void1057}1058 1059define <5 x i16> @load_v5i16(ptr addrspace(8) inreg %buf) {1060; CHECK-LABEL: define <5 x i16> @load_v5i16(1061; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1062; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v4i16(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1063; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i16> [[RET_OFF_0]], <4 x i16> poison, <5 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison>1064; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <5 x i16> poison, <5 x i16> [[RET_EXT_0]], <5 x i32> <i32 5, i32 6, i32 7, i32 8, i32 4>1065; CHECK-NEXT:    [[RET_OFF_8:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)1066; CHECK-NEXT:    [[RET:%.*]] = insertelement <5 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_8]], i64 41067; CHECK-NEXT:    ret <5 x i16> [[RET]]1068;1069  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1070  %ret = load <5 x i16>, ptr addrspace(7) %p1071  ret <5 x i16> %ret1072}1073 1074define void @store_v5i16(<5 x i16> %data, ptr addrspace(8) inreg %buf) {1075; CHECK-LABEL: define void @store_v5i16(1076; CHECK-SAME: <5 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1077; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <5 x i16> [[DATA]], <5 x i16> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1078; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i16(<4 x i16> [[DATA_SLICE_0]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1079; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = extractelement <5 x i16> [[DATA]], i64 41080; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_4]], ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)1081; CHECK-NEXT:    ret void1082;1083  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1084  store <5 x i16> %data, ptr addrspace(7) %p1085  ret void1086}1087 1088define <6 x i16> @load_v6i16(ptr addrspace(8) inreg %buf) {1089; CHECK-LABEL: define <6 x i16> @load_v6i16(1090; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1091; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1092; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i32> [[RET_LOADABLE]] to <6 x i16>1093; CHECK-NEXT:    ret <6 x i16> [[RET]]1094;1095  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1096  %ret = load <6 x i16>, ptr addrspace(7) %p1097  ret <6 x i16> %ret1098}1099 1100define void @store_v6i16(<6 x i16> %data, ptr addrspace(8) inreg %buf) {1101; CHECK-LABEL: define void @store_v6i16(1102; CHECK-SAME: <6 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1103; CHECK-NEXT:    [[DATA_STORABLE:%.*]] = bitcast <6 x i16> [[DATA]] to <3 x i32>1104; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA_STORABLE]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1105; CHECK-NEXT:    ret void1106;1107  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1108  store <6 x i16> %data, ptr addrspace(7) %p1109  ret void1110}1111 1112define <7 x i16> @load_v7i16(ptr addrspace(8) inreg %buf) {1113; CHECK-LABEL: define <7 x i16> @load_v7i16(1114; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1115; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1116; CHECK-NEXT:    [[RET_OFF_0_FROM_LOADABLE:%.*]] = bitcast <3 x i32> [[RET_OFF_0]] to <6 x i16>1117; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <6 x i16> [[RET_OFF_0_FROM_LOADABLE]], <6 x i16> poison, <7 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 poison>1118; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <7 x i16> poison, <7 x i16> [[RET_EXT_0]], <7 x i32> <i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 6>1119; CHECK-NEXT:    [[RET_OFF_12:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 12, i32 0, i32 0)1120; CHECK-NEXT:    [[RET:%.*]] = insertelement <7 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_12]], i64 61121; CHECK-NEXT:    ret <7 x i16> [[RET]]1122;1123  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1124  %ret = load <7 x i16>, ptr addrspace(7) %p1125  ret <7 x i16> %ret1126}1127 1128define void @store_v7i16(<7 x i16> %data, ptr addrspace(8) inreg %buf) {1129; CHECK-LABEL: define void @store_v7i16(1130; CHECK-SAME: <7 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1131; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <7 x i16> [[DATA]], <7 x i16> poison, <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>1132; CHECK-NEXT:    [[DATA_SLICE_0_STORABLE:%.*]] = bitcast <6 x i16> [[DATA_SLICE_0]] to <3 x i32>1133; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA_SLICE_0_STORABLE]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1134; CHECK-NEXT:    [[DATA_SLICE_6:%.*]] = extractelement <7 x i16> [[DATA]], i64 61135; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_6]], ptr addrspace(8) align 4 [[BUF]], i32 12, i32 0, i32 0)1136; CHECK-NEXT:    ret void1137;1138  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1139  store <7 x i16> %data, ptr addrspace(7) %p1140  ret void1141}1142 1143define <9 x i16> @load_v9i16(ptr addrspace(8) inreg %buf) {1144; CHECK-LABEL: define <9 x i16> @load_v9i16(1145; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1146; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <8 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v8i16(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1147; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <8 x i16> [[RET_OFF_0]], <8 x i16> poison, <9 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison>1148; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <9 x i16> poison, <9 x i16> [[RET_EXT_0]], <9 x i32> <i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 8>1149; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1150; CHECK-NEXT:    [[RET:%.*]] = insertelement <9 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_16]], i64 81151; CHECK-NEXT:    ret <9 x i16> [[RET]]1152;1153  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1154  %ret = load <9 x i16>, ptr addrspace(7) %p1155  ret <9 x i16> %ret1156}1157 1158define void @store_v9i16(<9 x i16> %data, ptr addrspace(8) inreg %buf) {1159; CHECK-LABEL: define void @store_v9i16(1160; CHECK-SAME: <9 x i16> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1161; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <9 x i16> [[DATA]], <9 x i16> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1162; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v8i16(<8 x i16> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1163; CHECK-NEXT:    [[DATA_SLICE_8:%.*]] = extractelement <9 x i16> [[DATA]], i64 81164; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_8]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1165; CHECK-NEXT:    ret void1166;1167  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1168  store <9 x i16> %data, ptr addrspace(7) %p1169  ret void1170}1171 1172;;; Byte vectors. Need to be1173;;; - Split into multiple operations1174;;; - Bitcast if they have a natively supported width1175 1176define <1 x i8> @load_v1i8(ptr addrspace(8) inreg %buf) {1177; CHECK-LABEL: define <1 x i8> @load_v1i8(1178; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1179; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1180; CHECK-NEXT:    [[RET:%.*]] = bitcast i8 [[RET_LOADABLE]] to <1 x i8>1181; CHECK-NEXT:    ret <1 x i8> [[RET]]1182;1183  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1184  %ret = load <1 x i8>, ptr addrspace(7) %p1185  ret <1 x i8> %ret1186}1187 1188define void @store_v1i8(<1 x i8> %data, ptr addrspace(8) inreg %buf) {1189; CHECK-LABEL: define void @store_v1i8(1190; CHECK-SAME: <1 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1191; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <1 x i8> [[DATA]] to i81192; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_LEGAL]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1193; CHECK-NEXT:    ret void1194;1195  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1196  store <1 x i8> %data, ptr addrspace(7) %p1197  ret void1198}1199 1200define <2 x i8> @load_v2i8(ptr addrspace(8) inreg %buf) {1201; CHECK-LABEL: define <2 x i8> @load_v2i8(1202; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1203; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1204; CHECK-NEXT:    [[RET:%.*]] = bitcast i16 [[RET_LOADABLE]] to <2 x i8>1205; CHECK-NEXT:    ret <2 x i8> [[RET]]1206;1207  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1208  %ret = load <2 x i8>, ptr addrspace(7) %p1209  ret <2 x i8> %ret1210}1211 1212define void @store_v2i8(<2 x i8> %data, ptr addrspace(8) inreg %buf) {1213; CHECK-LABEL: define void @store_v2i8(1214; CHECK-SAME: <2 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1215; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <2 x i8> [[DATA]] to i161216; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_LEGAL]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1217; CHECK-NEXT:    ret void1218;1219  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1220  store <2 x i8> %data, ptr addrspace(7) %p1221  ret void1222}1223 1224define <3 x i8> @load_v3i8(ptr addrspace(8) inreg %buf) {1225; CHECK-LABEL: define <3 x i8> @load_v3i8(1226; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1227; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1228; CHECK-NEXT:    [[RET_OFF_0_FROM_LOADABLE:%.*]] = bitcast i16 [[RET_OFF_0]] to <2 x i8>1229; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <2 x i8> [[RET_OFF_0_FROM_LOADABLE]], <2 x i8> poison, <3 x i32> <i32 0, i32 1, i32 poison>1230; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <3 x i8> poison, <3 x i8> [[RET_EXT_0]], <3 x i32> <i32 3, i32 4, i32 2>1231; CHECK-NEXT:    [[RET_OFF_2:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 2 [[BUF]], i32 2, i32 0, i32 0)1232; CHECK-NEXT:    [[RET:%.*]] = insertelement <3 x i8> [[RET_PARTS_0]], i8 [[RET_OFF_2]], i64 21233; CHECK-NEXT:    ret <3 x i8> [[RET]]1234;1235  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1236  %ret = load <3 x i8>, ptr addrspace(7) %p1237  ret <3 x i8> %ret1238}1239 1240define void @store_v3i8(<3 x i8> %data, ptr addrspace(8) inreg %buf) {1241; CHECK-LABEL: define void @store_v3i8(1242; CHECK-SAME: <3 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1243; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <3 x i8> [[DATA]], <3 x i8> poison, <2 x i32> <i32 0, i32 1>1244; CHECK-NEXT:    [[DATA_SLICE_0_STORABLE:%.*]] = bitcast <2 x i8> [[DATA_SLICE_0]] to i161245; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_0_STORABLE]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1246; CHECK-NEXT:    [[DATA_SLICE_2:%.*]] = extractelement <3 x i8> [[DATA]], i64 21247; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_SLICE_2]], ptr addrspace(8) align 2 [[BUF]], i32 2, i32 0, i32 0)1248; CHECK-NEXT:    ret void1249;1250  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1251  store <3 x i8> %data, ptr addrspace(7) %p1252  ret void1253}1254 1255define <4 x i8> @load_v4i8(ptr addrspace(8) inreg %buf) {1256; CHECK-LABEL: define <4 x i8> @load_v4i8(1257; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1258; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1259; CHECK-NEXT:    [[RET:%.*]] = bitcast i32 [[RET_LOADABLE]] to <4 x i8>1260; CHECK-NEXT:    ret <4 x i8> [[RET]]1261;1262  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1263  %ret = load <4 x i8>, ptr addrspace(7) %p1264  ret <4 x i8> %ret1265}1266 1267define void @store_v4i8(<4 x i8> %data, ptr addrspace(8) inreg %buf) {1268; CHECK-LABEL: define void @store_v4i8(1269; CHECK-SAME: <4 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1270; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <4 x i8> [[DATA]] to i321271; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_LEGAL]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1272; CHECK-NEXT:    ret void1273;1274  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1275  store <4 x i8> %data, ptr addrspace(7) %p1276  ret void1277}1278 1279define <5 x i8> @load_v5i8(ptr addrspace(8) inreg %buf) {1280; CHECK-LABEL: define <5 x i8> @load_v5i8(1281; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1282; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1283; CHECK-NEXT:    [[RET_OFF_0_FROM_LOADABLE:%.*]] = bitcast i32 [[RET_OFF_0]] to <4 x i8>1284; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i8> [[RET_OFF_0_FROM_LOADABLE]], <4 x i8> poison, <5 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison>1285; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <5 x i8> poison, <5 x i8> [[RET_EXT_0]], <5 x i32> <i32 5, i32 6, i32 7, i32 8, i32 4>1286; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1287; CHECK-NEXT:    [[RET:%.*]] = insertelement <5 x i8> [[RET_PARTS_0]], i8 [[RET_OFF_4]], i64 41288; CHECK-NEXT:    ret <5 x i8> [[RET]]1289;1290  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1291  %ret = load <5 x i8>, ptr addrspace(7) %p1292  ret <5 x i8> %ret1293}1294 1295define void @store_v5i8(<5 x i8> %data, ptr addrspace(8) inreg %buf) {1296; CHECK-LABEL: define void @store_v5i8(1297; CHECK-SAME: <5 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1298; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <5 x i8> [[DATA]], <5 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1299; CHECK-NEXT:    [[DATA_SLICE_0_STORABLE:%.*]] = bitcast <4 x i8> [[DATA_SLICE_0]] to i321300; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_SLICE_0_STORABLE]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1301; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = extractelement <5 x i8> [[DATA]], i64 41302; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_SLICE_4]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1303; CHECK-NEXT:    ret void1304;1305  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1306  store <5 x i8> %data, ptr addrspace(7) %p1307  ret void1308}1309 1310define <6 x i8> @load_v6i8(ptr addrspace(8) inreg %buf) {1311; CHECK-LABEL: define <6 x i8> @load_v6i8(1312; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1313; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <2 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v2i16(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1314; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <2 x i16> [[RET_OFF_0]], <2 x i16> poison, <3 x i32> <i32 0, i32 1, i32 poison>1315; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <3 x i16> poison, <3 x i16> [[RET_EXT_0]], <3 x i32> <i32 3, i32 4, i32 2>1316; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1317; CHECK-NEXT:    [[RET_SLICE_2:%.*]] = insertelement <3 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_4]], i64 21318; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i16> [[RET_SLICE_2]] to <6 x i8>1319; CHECK-NEXT:    ret <6 x i8> [[RET]]1320;1321  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1322  %ret = load <6 x i8>, ptr addrspace(7) %p1323  ret <6 x i8> %ret1324}1325 1326define void @store_v6i8(<6 x i8> %data, ptr addrspace(8) inreg %buf) {1327; CHECK-LABEL: define void @store_v6i8(1328; CHECK-SAME: <6 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1329; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <6 x i8> [[DATA]] to <3 x i16>1330; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <3 x i16> [[DATA_LEGAL]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>1331; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i16(<2 x i16> [[DATA_SLICE_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1332; CHECK-NEXT:    [[DATA_SLICE_2:%.*]] = extractelement <3 x i16> [[DATA_LEGAL]], i64 21333; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_2]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1334; CHECK-NEXT:    ret void1335;1336  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1337  store <6 x i8> %data, ptr addrspace(7) %p1338  ret void1339}1340 1341define <7 x i8> @load_v7i8(ptr addrspace(8) inreg %buf) {1342; CHECK-LABEL: define <7 x i8> @load_v7i8(1343; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1344; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1345; CHECK-NEXT:    [[RET_OFF_0_FROM_LOADABLE:%.*]] = bitcast i32 [[RET_OFF_0]] to <4 x i8>1346; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i8> [[RET_OFF_0_FROM_LOADABLE]], <4 x i8> poison, <7 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison>1347; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <7 x i8> poison, <7 x i8> [[RET_EXT_0]], <7 x i32> <i32 7, i32 8, i32 9, i32 10, i32 4, i32 5, i32 6>1348; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1349; CHECK-NEXT:    [[RET_OFF_4_FROM_LOADABLE:%.*]] = bitcast i16 [[RET_OFF_4]] to <2 x i8>1350; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <2 x i8> [[RET_OFF_4_FROM_LOADABLE]], <2 x i8> poison, <7 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>1351; CHECK-NEXT:    [[RET_PARTS_4:%.*]] = shufflevector <7 x i8> [[RET_PARTS_0]], <7 x i8> [[RET_EXT_4]], <7 x i32> <i32 0, i32 1, i32 2, i32 3, i32 7, i32 8, i32 6>1352; CHECK-NEXT:    [[RET_OFF_6:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 2 [[BUF]], i32 6, i32 0, i32 0)1353; CHECK-NEXT:    [[RET:%.*]] = insertelement <7 x i8> [[RET_PARTS_4]], i8 [[RET_OFF_6]], i64 61354; CHECK-NEXT:    ret <7 x i8> [[RET]]1355;1356  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1357  %ret = load <7 x i8>, ptr addrspace(7) %p1358  ret <7 x i8> %ret1359}1360 1361define void @store_v7i8(<7 x i8> %data, ptr addrspace(8) inreg %buf) {1362; CHECK-LABEL: define void @store_v7i8(1363; CHECK-SAME: <7 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1364; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <7 x i8> [[DATA]], <7 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1365; CHECK-NEXT:    [[DATA_SLICE_0_STORABLE:%.*]] = bitcast <4 x i8> [[DATA_SLICE_0]] to i321366; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_SLICE_0_STORABLE]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1367; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <7 x i8> [[DATA]], <7 x i8> poison, <2 x i32> <i32 4, i32 5>1368; CHECK-NEXT:    [[DATA_SLICE_4_STORABLE:%.*]] = bitcast <2 x i8> [[DATA_SLICE_4]] to i161369; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_4_STORABLE]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1370; CHECK-NEXT:    [[DATA_SLICE_6:%.*]] = extractelement <7 x i8> [[DATA]], i64 61371; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_SLICE_6]], ptr addrspace(8) align 2 [[BUF]], i32 6, i32 0, i32 0)1372; CHECK-NEXT:    ret void1373;1374  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1375  store <7 x i8> %data, ptr addrspace(7) %p1376  ret void1377}1378 1379define <8 x i8> @load_v8i8(ptr addrspace(8) inreg %buf) {1380; CHECK-LABEL: define <8 x i8> @load_v8i8(1381; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1382; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1383; CHECK-NEXT:    [[RET:%.*]] = bitcast <2 x i32> [[RET_LOADABLE]] to <8 x i8>1384; CHECK-NEXT:    ret <8 x i8> [[RET]]1385;1386  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1387  %ret = load <8 x i8>, ptr addrspace(7) %p1388  ret <8 x i8> %ret1389}1390 1391define void @store_v8i8(<8 x i8> %data, ptr addrspace(8) inreg %buf) {1392; CHECK-LABEL: define void @store_v8i8(1393; CHECK-SAME: <8 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1394; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <8 x i8> [[DATA]] to <2 x i32>1395; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA_LEGAL]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1396; CHECK-NEXT:    ret void1397;1398  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1399  store <8 x i8> %data, ptr addrspace(7) %p1400  ret void1401}1402 1403define <12 x i8> @load_v12i8(ptr addrspace(8) inreg %buf) {1404; CHECK-LABEL: define <12 x i8> @load_v12i8(1405; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1406; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1407; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i32> [[RET_LOADABLE]] to <12 x i8>1408; CHECK-NEXT:    ret <12 x i8> [[RET]]1409;1410  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1411  %ret = load <12 x i8>, ptr addrspace(7) %p1412  ret <12 x i8> %ret1413}1414 1415define void @store_v12i8(<12 x i8> %data, ptr addrspace(8) inreg %buf) {1416; CHECK-LABEL: define void @store_v12i8(1417; CHECK-SAME: <12 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1418; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <12 x i8> [[DATA]] to <3 x i32>1419; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA_LEGAL]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1420; CHECK-NEXT:    ret void1421;1422  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1423  store <12 x i8> %data, ptr addrspace(7) %p1424  ret void1425}1426 1427define <16 x i8> @load_v16i8(ptr addrspace(8) inreg %buf) {1428; CHECK-LABEL: define <16 x i8> @load_v16i8(1429; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1430; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1431; CHECK-NEXT:    [[RET:%.*]] = bitcast <4 x i32> [[RET_LOADABLE]] to <16 x i8>1432; CHECK-NEXT:    ret <16 x i8> [[RET]]1433;1434  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1435  %ret = load <16 x i8>, ptr addrspace(7) %p1436  ret <16 x i8> %ret1437}1438 1439define void @store_v16i8(<16 x i8> %data, ptr addrspace(8) inreg %buf) {1440; CHECK-LABEL: define void @store_v16i8(1441; CHECK-SAME: <16 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1442; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <16 x i8> [[DATA]] to <4 x i32>1443; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_LEGAL]], ptr addrspace(8) align 16 [[BUF]], i32 0, i32 0, i32 0)1444; CHECK-NEXT:    ret void1445;1446  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1447  store <16 x i8> %data, ptr addrspace(7) %p1448  ret void1449}1450 1451define <32 x i8> @load_v32i8(ptr addrspace(8) inreg %buf) {1452; CHECK-LABEL: define <32 x i8> @load_v32i8(1453; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1454; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1455; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i32> [[RET_OFF_0]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1456; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <8 x i32> poison, <8 x i32> [[RET_EXT_0]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>1457; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1458; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <4 x i32> [[RET_OFF_16]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1459; CHECK-NEXT:    [[RET_PARTS_4:%.*]] = shufflevector <8 x i32> [[RET_PARTS_0]], <8 x i32> [[RET_EXT_4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1460; CHECK-NEXT:    [[RET:%.*]] = bitcast <8 x i32> [[RET_PARTS_4]] to <32 x i8>1461; CHECK-NEXT:    ret <32 x i8> [[RET]]1462;1463  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1464  %ret = load <32 x i8>, ptr addrspace(7) %p1465  ret <32 x i8> %ret1466}1467 1468define void @store_v32i8(<32 x i8> %data, ptr addrspace(8) inreg %buf) {1469; CHECK-LABEL: define void @store_v32i8(1470; CHECK-SAME: <32 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1471; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <32 x i8> [[DATA]] to <8 x i32>1472; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <8 x i32> [[DATA_LEGAL]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1473; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1474; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <8 x i32> [[DATA_LEGAL]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1475; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1476; CHECK-NEXT:    ret void1477;1478  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1479  store <32 x i8> %data, ptr addrspace(7) %p1480  ret void1481}1482 1483;;; Arrays. Need to become vectors.1484 1485define [1 x i32] @load_a1i32(ptr addrspace(8) inreg %buf) {1486; CHECK-LABEL: define [1 x i32] @load_a1i32(1487; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1488; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1489; CHECK-NEXT:    [[RET_FROM_LOADABLE:%.*]] = bitcast i32 [[RET_LOADABLE]] to <1 x i32>1490; CHECK-NEXT:    [[RET_ELEM_0:%.*]] = extractelement <1 x i32> [[RET_FROM_LOADABLE]], i64 01491; CHECK-NEXT:    [[RET:%.*]] = insertvalue [1 x i32] poison, i32 [[RET_ELEM_0]], 01492; CHECK-NEXT:    ret [1 x i32] [[RET]]1493;1494  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1495  %ret = load [1 x i32], ptr addrspace(7) %p1496  ret [1 x i32] %ret1497}1498 1499define void @store_a1i32([1 x i32] %data, ptr addrspace(8) inreg %buf) {1500; CHECK-LABEL: define void @store_a1i32(1501; CHECK-SAME: [1 x i32] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1502; CHECK-NEXT:    [[DATA_ELEM_0:%.*]] = extractvalue [1 x i32] [[DATA]], 01503; CHECK-NEXT:    [[DATA_AS_VEC_0:%.*]] = insertelement <1 x i32> poison, i32 [[DATA_ELEM_0]], i64 01504; CHECK-NEXT:    [[DATA_STORABLE:%.*]] = bitcast <1 x i32> [[DATA_AS_VEC_0]] to i321505; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_STORABLE]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1506; CHECK-NEXT:    ret void1507;1508  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1509  store [1 x i32] %data, ptr addrspace(7) %p1510  ret void1511}1512 1513define [2 x i32] @load_a2i32(ptr addrspace(8) inreg %buf) {1514; CHECK-LABEL: define [2 x i32] @load_a2i32(1515; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1516; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1517; CHECK-NEXT:    [[RET_ELEM_0:%.*]] = extractelement <2 x i32> [[RET_LOADABLE]], i64 01518; CHECK-NEXT:    [[RET_AS_ARRAY_0:%.*]] = insertvalue [2 x i32] poison, i32 [[RET_ELEM_0]], 01519; CHECK-NEXT:    [[RET_ELEM_1:%.*]] = extractelement <2 x i32> [[RET_LOADABLE]], i64 11520; CHECK-NEXT:    [[RET:%.*]] = insertvalue [2 x i32] [[RET_AS_ARRAY_0]], i32 [[RET_ELEM_1]], 11521; CHECK-NEXT:    ret [2 x i32] [[RET]]1522;1523  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1524  %ret = load [2 x i32], ptr addrspace(7) %p1525  ret [2 x i32] %ret1526}1527 1528define void @store_a2i32([2 x i32] %data, ptr addrspace(8) inreg %buf) {1529; CHECK-LABEL: define void @store_a2i32(1530; CHECK-SAME: [2 x i32] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1531; CHECK-NEXT:    [[DATA_ELEM_0:%.*]] = extractvalue [2 x i32] [[DATA]], 01532; CHECK-NEXT:    [[DATA_AS_VEC_0:%.*]] = insertelement <2 x i32> poison, i32 [[DATA_ELEM_0]], i64 01533; CHECK-NEXT:    [[DATA_ELEM_1:%.*]] = extractvalue [2 x i32] [[DATA]], 11534; CHECK-NEXT:    [[DATA_AS_VEC_1:%.*]] = insertelement <2 x i32> [[DATA_AS_VEC_0]], i32 [[DATA_ELEM_1]], i64 11535; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA_AS_VEC_1]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1536; CHECK-NEXT:    ret void1537;1538  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1539  store [2 x i32] %data, ptr addrspace(7) %p1540  ret void1541}1542 1543define [2 x half] @load_a2f16(ptr addrspace(8) inreg %buf) {1544; CHECK-LABEL: define [2 x half] @load_a2f16(1545; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1546; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <2 x half> @llvm.amdgcn.raw.ptr.buffer.load.v2f16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1547; CHECK-NEXT:    [[RET_ELEM_0:%.*]] = extractelement <2 x half> [[RET_LOADABLE]], i64 01548; CHECK-NEXT:    [[RET_AS_ARRAY_0:%.*]] = insertvalue [2 x half] poison, half [[RET_ELEM_0]], 01549; CHECK-NEXT:    [[RET_ELEM_1:%.*]] = extractelement <2 x half> [[RET_LOADABLE]], i64 11550; CHECK-NEXT:    [[RET:%.*]] = insertvalue [2 x half] [[RET_AS_ARRAY_0]], half [[RET_ELEM_1]], 11551; CHECK-NEXT:    ret [2 x half] [[RET]]1552;1553  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1554  %ret = load [2 x half], ptr addrspace(7) %p1555  ret [2 x half] %ret1556}1557 1558define void @store_a2f16([2 x half] %data, ptr addrspace(8) inreg %buf) {1559; CHECK-LABEL: define void @store_a2f16(1560; CHECK-SAME: [2 x half] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1561; CHECK-NEXT:    [[DATA_ELEM_0:%.*]] = extractvalue [2 x half] [[DATA]], 01562; CHECK-NEXT:    [[DATA_AS_VEC_0:%.*]] = insertelement <2 x half> poison, half [[DATA_ELEM_0]], i64 01563; CHECK-NEXT:    [[DATA_ELEM_1:%.*]] = extractvalue [2 x half] [[DATA]], 11564; CHECK-NEXT:    [[DATA_AS_VEC_1:%.*]] = insertelement <2 x half> [[DATA_AS_VEC_0]], half [[DATA_ELEM_1]], i64 11565; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2f16(<2 x half> [[DATA_AS_VEC_1]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1566; CHECK-NEXT:    ret void1567;1568  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1569  store [2 x half] %data, ptr addrspace(7) %p1570  ret void1571}1572 1573define [2 x ptr addrspace(1)] @load_a2p1(ptr addrspace(8) inreg %buf) {1574; CHECK-LABEL: define [2 x ptr addrspace(1)] @load_a2p1(1575; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1576; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <2 x ptr addrspace(1)> @llvm.amdgcn.raw.ptr.buffer.load.v2p1(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1577; CHECK-NEXT:    [[RET_ELEM_0:%.*]] = extractelement <2 x ptr addrspace(1)> [[RET_LOADABLE]], i64 01578; CHECK-NEXT:    [[RET_AS_ARRAY_0:%.*]] = insertvalue [2 x ptr addrspace(1)] poison, ptr addrspace(1) [[RET_ELEM_0]], 01579; CHECK-NEXT:    [[RET_ELEM_1:%.*]] = extractelement <2 x ptr addrspace(1)> [[RET_LOADABLE]], i64 11580; CHECK-NEXT:    [[RET:%.*]] = insertvalue [2 x ptr addrspace(1)] [[RET_AS_ARRAY_0]], ptr addrspace(1) [[RET_ELEM_1]], 11581; CHECK-NEXT:    ret [2 x ptr addrspace(1)] [[RET]]1582;1583  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1584  %ret = load [2 x ptr addrspace(1)], ptr addrspace(7) %p1585  ret [2 x ptr addrspace(1)] %ret1586}1587 1588define void @store_a2p1([2 x ptr addrspace(1)] %data, ptr addrspace(8) inreg %buf) {1589; CHECK-LABEL: define void @store_a2p1(1590; CHECK-SAME: [2 x ptr addrspace(1)] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1591; CHECK-NEXT:    [[DATA_ELEM_0:%.*]] = extractvalue [2 x ptr addrspace(1)] [[DATA]], 01592; CHECK-NEXT:    [[DATA_AS_VEC_0:%.*]] = insertelement <2 x ptr addrspace(1)> poison, ptr addrspace(1) [[DATA_ELEM_0]], i64 01593; CHECK-NEXT:    [[DATA_ELEM_1:%.*]] = extractvalue [2 x ptr addrspace(1)] [[DATA]], 11594; CHECK-NEXT:    [[DATA_AS_VEC_1:%.*]] = insertelement <2 x ptr addrspace(1)> [[DATA_AS_VEC_0]], ptr addrspace(1) [[DATA_ELEM_1]], i64 11595; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2p1(<2 x ptr addrspace(1)> [[DATA_AS_VEC_1]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1596; CHECK-NEXT:    ret void1597;1598  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1599  store [2 x ptr addrspace(1)] %data, ptr addrspace(7) %p1600  ret void1601}1602 1603;;; Scalars of atypical width. Need to be cast to vectors and split.1604 1605define i40 @load_i40(ptr addrspace(8) inreg %buf) {1606; CHECK-LABEL: define i40 @load_i40(1607; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1608; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1609; CHECK-NEXT:    [[RET_OFF_0_FROM_LOADABLE:%.*]] = bitcast i32 [[RET_OFF_0]] to <4 x i8>1610; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i8> [[RET_OFF_0_FROM_LOADABLE]], <4 x i8> poison, <5 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison>1611; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <5 x i8> poison, <5 x i8> [[RET_EXT_0]], <5 x i32> <i32 5, i32 6, i32 7, i32 8, i32 4>1612; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1613; CHECK-NEXT:    [[RET_SLICE_4:%.*]] = insertelement <5 x i8> [[RET_PARTS_0]], i8 [[RET_OFF_4]], i64 41614; CHECK-NEXT:    [[RET:%.*]] = bitcast <5 x i8> [[RET_SLICE_4]] to i401615; CHECK-NEXT:    ret i40 [[RET]]1616;1617  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1618  %ret = load i40, ptr addrspace(7) %p1619  ret i40 %ret1620}1621 1622define void @store_i40(i40 %data, ptr addrspace(8) inreg %buf) {1623; CHECK-LABEL: define void @store_i40(1624; CHECK-SAME: i40 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1625; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast i40 [[DATA]] to <5 x i8>1626; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <5 x i8> [[DATA_LEGAL]], <5 x i8> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1627; CHECK-NEXT:    [[DATA_SLICE_0_STORABLE:%.*]] = bitcast <4 x i8> [[DATA_SLICE_0]] to i321628; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_SLICE_0_STORABLE]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1629; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = extractelement <5 x i8> [[DATA_LEGAL]], i64 41630; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_SLICE_4]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 0)1631; CHECK-NEXT:    ret void1632;1633  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1634  store i40 %data, ptr addrspace(7) %p1635  ret void1636}1637 1638define i96 @load_i96(ptr addrspace(8) inreg %buf) {1639; CHECK-LABEL: define i96 @load_i96(1640; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1641; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call <3 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v3i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1642; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i32> [[RET_LOADABLE]] to i961643; CHECK-NEXT:    ret i96 [[RET]]1644;1645  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1646  %ret = load i96, ptr addrspace(7) %p1647  ret i96 %ret1648}1649 1650define void @store_i96(i96 %data, ptr addrspace(8) inreg %buf) {1651; CHECK-LABEL: define void @store_i96(1652; CHECK-SAME: i96 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1653; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast i96 [[DATA]] to <3 x i32>1654; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v3i32(<3 x i32> [[DATA_LEGAL]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1655; CHECK-NEXT:    ret void1656;1657  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1658  store i96 %data, ptr addrspace(7) %p1659  ret void1660}1661 1662define i160 @load_i160(ptr addrspace(8) inreg %buf) {1663; CHECK-LABEL: define i160 @load_i160(1664; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1665; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1666; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i32> [[RET_OFF_0]], <4 x i32> poison, <5 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison>1667; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <5 x i32> poison, <5 x i32> [[RET_EXT_0]], <5 x i32> <i32 5, i32 6, i32 7, i32 8, i32 4>1668; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 8 [[BUF]], i32 16, i32 0, i32 0)1669; CHECK-NEXT:    [[RET_SLICE_4:%.*]] = insertelement <5 x i32> [[RET_PARTS_0]], i32 [[RET_OFF_16]], i64 41670; CHECK-NEXT:    [[RET:%.*]] = bitcast <5 x i32> [[RET_SLICE_4]] to i1601671; CHECK-NEXT:    ret i160 [[RET]]1672;1673  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1674  %ret = load i160, ptr addrspace(7) %p1675  ret i160 %ret1676}1677 1678define void @store_i160(i160 %data, ptr addrspace(8) inreg %buf) {1679; CHECK-LABEL: define void @store_i160(1680; CHECK-SAME: i160 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1681; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast i160 [[DATA]] to <5 x i32>1682; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <5 x i32> [[DATA_LEGAL]], <5 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1683; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1684; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = extractelement <5 x i32> [[DATA_LEGAL]], i64 41685; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_SLICE_4]], ptr addrspace(8) align 8 [[BUF]], i32 16, i32 0, i32 0)1686; CHECK-NEXT:    ret void1687;1688  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1689  store i160 %data, ptr addrspace(7) %p1690  ret void1691}1692 1693define i256 @load_i256(ptr addrspace(8) inreg %buf) {1694; CHECK-LABEL: define i256 @load_i256(1695; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1696; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1697; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i32> [[RET_OFF_0]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1698; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <8 x i32> poison, <8 x i32> [[RET_EXT_0]], <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 4, i32 5, i32 6, i32 7>1699; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 8 [[BUF]], i32 16, i32 0, i32 0)1700; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <4 x i32> [[RET_OFF_16]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1701; CHECK-NEXT:    [[RET_PARTS_4:%.*]] = shufflevector <8 x i32> [[RET_PARTS_0]], <8 x i32> [[RET_EXT_4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>1702; CHECK-NEXT:    [[RET:%.*]] = bitcast <8 x i32> [[RET_PARTS_4]] to i2561703; CHECK-NEXT:    ret i256 [[RET]]1704;1705  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1706  %ret = load i256, ptr addrspace(7) %p1707  ret i256 %ret1708}1709 1710define void @store_i256(i256 %data, ptr addrspace(8) inreg %buf) {1711; CHECK-LABEL: define void @store_i256(1712; CHECK-SAME: i256 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1713; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast i256 [[DATA]] to <8 x i32>1714; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <8 x i32> [[DATA_LEGAL]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1715; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)1716; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <8 x i32> [[DATA_LEGAL]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>1717; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_4]], ptr addrspace(8) align 8 [[BUF]], i32 16, i32 0, i32 0)1718; CHECK-NEXT:    ret void1719;1720  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1721  store i256 %data, ptr addrspace(7) %p1722  ret void1723}1724 1725;;; Non-byte-sized scalars. Require zero-extension.1726 1727define i7 @load_i7(ptr addrspace(8) inreg %buf) {1728; CHECK-LABEL: define i7 @load_i7(1729; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1730; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1731; CHECK-NEXT:    [[RET:%.*]] = trunc i8 [[RET_LOADABLE]] to i71732; CHECK-NEXT:    ret i7 [[RET]]1733;1734  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1735  %ret = load i7, ptr addrspace(7) %p1736  ret i7 %ret1737}1738 1739define void @store_i7(i7 %data, ptr addrspace(8) inreg %buf) {1740; CHECK-LABEL: define void @store_i7(1741; CHECK-SAME: i7 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1742; CHECK-NEXT:    [[DATA_ZEXT:%.*]] = zext i7 [[DATA]] to i81743; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1744; CHECK-NEXT:    ret void1745;1746  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1747  store i7 %data, ptr addrspace(7) %p1748  ret void1749}1750 1751define i4 @load_i4(ptr addrspace(8) inreg %buf) {1752; CHECK-LABEL: define i4 @load_i4(1753; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1754; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1755; CHECK-NEXT:    [[RET:%.*]] = trunc i8 [[RET_LOADABLE]] to i41756; CHECK-NEXT:    ret i4 [[RET]]1757;1758  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1759  %ret = load i4, ptr addrspace(7) %p1760  ret i4 %ret1761}1762 1763define void @store_i4(i4 %data, ptr addrspace(8) inreg %buf) {1764; CHECK-LABEL: define void @store_i4(1765; CHECK-SAME: i4 [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1766; CHECK-NEXT:    [[DATA_ZEXT:%.*]] = zext i4 [[DATA]] to i81767; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1768; CHECK-NEXT:    ret void1769;1770  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1771  store i4 %data, ptr addrspace(7) %p1772  ret void1773}1774 1775;;; Byte-sized vectors of i4. Require casts.1776 1777define <2 x i4> @load_v2i4(ptr addrspace(8) inreg %buf) {1778; CHECK-LABEL: define <2 x i4> @load_v2i4(1779; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1780; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1781; CHECK-NEXT:    [[RET:%.*]] = bitcast i8 [[RET_LOADABLE]] to <2 x i4>1782; CHECK-NEXT:    ret <2 x i4> [[RET]]1783;1784  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1785  %ret = load <2 x i4>, ptr addrspace(7) %p1786  ret <2 x i4> %ret1787}1788 1789define void @store_v2i4(<2 x i4> %data, ptr addrspace(8) inreg %buf) {1790; CHECK-LABEL: define void @store_v2i4(1791; CHECK-SAME: <2 x i4> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1792; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <2 x i4> [[DATA]] to i81793; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA_LEGAL]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)1794; CHECK-NEXT:    ret void1795;1796  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1797  store <2 x i4> %data, ptr addrspace(7) %p1798  ret void1799}1800 1801define <4 x i4> @load_v4i4(ptr addrspace(8) inreg %buf) {1802; CHECK-LABEL: define <4 x i4> @load_v4i4(1803; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1804; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1805; CHECK-NEXT:    [[RET:%.*]] = bitcast i16 [[RET_LOADABLE]] to <4 x i4>1806; CHECK-NEXT:    ret <4 x i4> [[RET]]1807;1808  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1809  %ret = load <4 x i4>, ptr addrspace(7) %p1810  ret <4 x i4> %ret1811}1812 1813define void @store_v4i4(<4 x i4> %data, ptr addrspace(8) inreg %buf) {1814; CHECK-LABEL: define void @store_v4i4(1815; CHECK-SAME: <4 x i4> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1816; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <4 x i4> [[DATA]] to i161817; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_LEGAL]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1818; CHECK-NEXT:    ret void1819;1820  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1821  store <4 x i4> %data, ptr addrspace(7) %p1822  ret void1823}1824 1825define <8 x i4> @load_v8i4(ptr addrspace(8) inreg %buf) {1826; CHECK-LABEL: define <8 x i4> @load_v8i4(1827; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1828; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1829; CHECK-NEXT:    [[RET:%.*]] = bitcast i32 [[RET_LOADABLE]] to <8 x i4>1830; CHECK-NEXT:    ret <8 x i4> [[RET]]1831;1832  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1833  %ret = load <8 x i4>, ptr addrspace(7) %p1834  ret <8 x i4> %ret1835}1836 1837define void @store_v8i4(<8 x i4> %data, ptr addrspace(8) inreg %buf) {1838; CHECK-LABEL: define void @store_v8i4(1839; CHECK-SAME: <8 x i4> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1840; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <8 x i4> [[DATA]] to i321841; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_LEGAL]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1842; CHECK-NEXT:    ret void1843;1844  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1845  store <8 x i4> %data, ptr addrspace(7) %p1846  ret void1847}1848 1849;;; Vectors of non-byte-sized integers.1850 1851define <2 x i6> @load_v2i6(ptr addrspace(8) inreg %buf) {1852; CHECK-LABEL: define <2 x i6> @load_v2i6(1853; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1854; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1855; CHECK-NEXT:    [[RET_TRUNC:%.*]] = trunc i16 [[RET_LOADABLE]] to i121856; CHECK-NEXT:    [[RET:%.*]] = bitcast i12 [[RET_TRUNC]] to <2 x i6>1857; CHECK-NEXT:    ret <2 x i6> [[RET]]1858;1859  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1860  %ret = load <2 x i6>, ptr addrspace(7) %p1861  ret <2 x i6> %ret1862}1863 1864define void @store_v2i6(<2 x i6> %data, ptr addrspace(8) inreg %buf) {1865; CHECK-LABEL: define void @store_v2i6(1866; CHECK-SAME: <2 x i6> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1867; CHECK-NEXT:    [[DATA_AS_SCALAR:%.*]] = bitcast <2 x i6> [[DATA]] to i121868; CHECK-NEXT:    [[DATA_ZEXT:%.*]] = zext i12 [[DATA_AS_SCALAR]] to i161869; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_ZEXT]], ptr addrspace(8) align 2 [[BUF]], i32 0, i32 0, i32 0)1870; CHECK-NEXT:    ret void1871;1872  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1873  store <2 x i6> %data, ptr addrspace(7) %p1874  ret void1875}1876 1877;; Blocks of fp6 elements1878define <6 x i32> @load_v32i6(ptr addrspace(8) inreg %buf) {1879; CHECK-LABEL: define <6 x i32> @load_v32i6(1880; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1881; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <4 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v4i32(ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1882; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <4 x i32> [[RET_OFF_0]], <4 x i32> poison, <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison>1883; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <6 x i32> poison, <6 x i32> [[RET_EXT_0]], <6 x i32> <i32 6, i32 7, i32 8, i32 9, i32 4, i32 5>1884; CHECK-NEXT:    [[RET_OFF_16:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1885; CHECK-NEXT:    [[RET_EXT_4:%.*]] = shufflevector <2 x i32> [[RET_OFF_16]], <2 x i32> poison, <6 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison>1886; CHECK-NEXT:    [[RET_PARTS_4:%.*]] = shufflevector <6 x i32> [[RET_PARTS_0]], <6 x i32> [[RET_EXT_4]], <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 6, i32 7>1887; CHECK-NEXT:    [[RET:%.*]] = bitcast <6 x i32> [[RET_PARTS_4]] to <32 x i6>1888; CHECK-NEXT:    [[RET_CAST:%.*]] = bitcast <32 x i6> [[RET]] to <6 x i32>1889; CHECK-NEXT:    ret <6 x i32> [[RET_CAST]]1890;1891  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1892  %ret = load <32 x i6>, ptr addrspace(7) %p1893  %ret.cast = bitcast <32 x i6> %ret to <6 x i32>1894  ret <6 x i32> %ret.cast1895}1896 1897define void @store_v32i6(<6 x i32> %data.abi, ptr addrspace(8) inreg %buf) {1898; CHECK-LABEL: define void @store_v32i6(1899; CHECK-SAME: <6 x i32> [[DATA_ABI:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1900; CHECK-NEXT:    [[DATA:%.*]] = bitcast <6 x i32> [[DATA_ABI]] to <32 x i6>1901; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <6 x i32> [[DATA_ABI]], <6 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>1902; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v4i32(<4 x i32> [[DATA_SLICE_0]], ptr addrspace(8) align 32 [[BUF]], i32 0, i32 0, i32 0)1903; CHECK-NEXT:    [[DATA_SLICE_4:%.*]] = shufflevector <6 x i32> [[DATA_ABI]], <6 x i32> poison, <2 x i32> <i32 4, i32 5>1904; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA_SLICE_4]], ptr addrspace(8) align 16 [[BUF]], i32 16, i32 0, i32 0)1905; CHECK-NEXT:    ret void1906;1907  %data = bitcast <6 x i32> %data.abi to <32 x i6>1908  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1909  store <32 x i6> %data, ptr addrspace(7) %p1910  ret void1911}1912 1913;;; Modifiers1914 1915define <4 x i8> @volatile_load_v4i8(ptr addrspace(8) inreg %buf) {1916; CHECK-LABEL: define <4 x i8> @volatile_load_v4i8(1917; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1918; CHECK-NEXT:    [[RET_LOADABLE:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 -2147483648)1919; CHECK-NEXT:    [[RET:%.*]] = bitcast i32 [[RET_LOADABLE]] to <4 x i8>1920; CHECK-NEXT:    ret <4 x i8> [[RET]]1921;1922  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1923  %ret = load volatile <4 x i8>, ptr addrspace(7) %p1924  ret <4 x i8> %ret1925}1926 1927define void @volatile_store_v4i8(<4 x i8> %data, ptr addrspace(8) inreg %buf) {1928; CHECK-LABEL: define void @volatile_store_v4i8(1929; CHECK-SAME: <4 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1930; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <4 x i8> [[DATA]] to i321931; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_LEGAL]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 -2147483648)1932; CHECK-NEXT:    ret void1933;1934  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1935  store volatile <4 x i8> %data, ptr addrspace(7) %p1936  ret void1937}1938 1939define <6 x i8> @volatile_load_v6i8(ptr addrspace(8) inreg %buf) {1940; CHECK-LABEL: define <6 x i8> @volatile_load_v6i8(1941; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1942; CHECK-NEXT:    [[RET_OFF_0:%.*]] = call <2 x i16> @llvm.amdgcn.raw.ptr.buffer.load.v2i16(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 -2147483648)1943; CHECK-NEXT:    [[RET_EXT_0:%.*]] = shufflevector <2 x i16> [[RET_OFF_0]], <2 x i16> poison, <3 x i32> <i32 0, i32 1, i32 poison>1944; CHECK-NEXT:    [[RET_PARTS_0:%.*]] = shufflevector <3 x i16> poison, <3 x i16> [[RET_EXT_0]], <3 x i32> <i32 3, i32 4, i32 2>1945; CHECK-NEXT:    [[RET_OFF_4:%.*]] = call i16 @llvm.amdgcn.raw.ptr.buffer.load.i16(ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 -2147483648)1946; CHECK-NEXT:    [[RET_SLICE_2:%.*]] = insertelement <3 x i16> [[RET_PARTS_0]], i16 [[RET_OFF_4]], i64 21947; CHECK-NEXT:    [[RET:%.*]] = bitcast <3 x i16> [[RET_SLICE_2]] to <6 x i8>1948; CHECK-NEXT:    ret <6 x i8> [[RET]]1949;1950  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1951  %ret = load volatile <6 x i8>, ptr addrspace(7) %p1952  ret <6 x i8> %ret1953}1954 1955define void @volatile_store_v6i8(<6 x i8> %data, ptr addrspace(8) inreg %buf) {1956; CHECK-LABEL: define void @volatile_store_v6i8(1957; CHECK-SAME: <6 x i8> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1958; CHECK-NEXT:    [[DATA_LEGAL:%.*]] = bitcast <6 x i8> [[DATA]] to <3 x i16>1959; CHECK-NEXT:    [[DATA_SLICE_0:%.*]] = shufflevector <3 x i16> [[DATA_LEGAL]], <3 x i16> poison, <2 x i32> <i32 0, i32 1>1960; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i16(<2 x i16> [[DATA_SLICE_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 -2147483648)1961; CHECK-NEXT:    [[DATA_SLICE_2:%.*]] = extractelement <3 x i16> [[DATA_LEGAL]], i64 21962; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i16(i16 [[DATA_SLICE_2]], ptr addrspace(8) align 4 [[BUF]], i32 4, i32 0, i32 -2147483648)1963; CHECK-NEXT:    ret void1964;1965  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1966  store volatile <6 x i8> %data, ptr addrspace(7) %p1967  ret void1968}1969 1970define [2 x [2 x i32]] @load_a2a2i32(ptr addrspace(8) inreg %buf) {1971; CHECK-LABEL: define [2 x [2 x i32]] @load_a2a2i32(1972; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1973; CHECK-NEXT:    [[RET0_OFF_0:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)1974; CHECK-NEXT:    [[RET0_ELEM_0:%.*]] = extractelement <2 x i32> [[RET0_OFF_0]], i64 01975; CHECK-NEXT:    [[RET0_AS_ARRAY_0:%.*]] = insertvalue [2 x i32] poison, i32 [[RET0_ELEM_0]], 01976; CHECK-NEXT:    [[RET0_ELEM_1:%.*]] = extractelement <2 x i32> [[RET0_OFF_0]], i64 11977; CHECK-NEXT:    [[RET0_AS_ARRAY_1:%.*]] = insertvalue [2 x i32] [[RET0_AS_ARRAY_0]], i32 [[RET0_ELEM_1]], 11978; CHECK-NEXT:    [[RET0:%.*]] = insertvalue [2 x [2 x i32]] poison, [2 x i32] [[RET0_AS_ARRAY_1]], 01979; CHECK-NEXT:    [[RET1_OFF_8:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 4 [[BUF]], i32 8, i32 0, i32 0)1980; CHECK-NEXT:    [[RET1_ELEM_0:%.*]] = extractelement <2 x i32> [[RET1_OFF_8]], i64 01981; CHECK-NEXT:    [[RET1_AS_ARRAY_0:%.*]] = insertvalue [2 x i32] poison, i32 [[RET1_ELEM_0]], 01982; CHECK-NEXT:    [[RET1_ELEM_1:%.*]] = extractelement <2 x i32> [[RET1_OFF_8]], i64 11983; CHECK-NEXT:    [[RET1_AS_ARRAY_1:%.*]] = insertvalue [2 x i32] [[RET1_AS_ARRAY_0]], i32 [[RET1_ELEM_1]], 11984; CHECK-NEXT:    [[RET:%.*]] = insertvalue [2 x [2 x i32]] [[RET0]], [2 x i32] [[RET1_AS_ARRAY_1]], 11985; CHECK-NEXT:    ret [2 x [2 x i32]] [[RET]]1986;1987  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)1988  %ret = load [2 x [2 x i32]], ptr addrspace(7) %p1989  ret [2 x [2 x i32]] %ret1990}1991 1992define void @store_a2a2i32([2 x [2 x i32]] %data, ptr addrspace(8) inreg %buf) {1993; CHECK-LABEL: define void @store_a2a2i32(1994; CHECK-SAME: [2 x [2 x i32]] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {1995; CHECK-NEXT:    [[DATA0:%.*]] = extractvalue [2 x [2 x i32]] [[DATA]], 01996; CHECK-NEXT:    [[DATA0_ELEM_0:%.*]] = extractvalue [2 x i32] [[DATA0]], 01997; CHECK-NEXT:    [[DATA0_AS_VEC_0:%.*]] = insertelement <2 x i32> poison, i32 [[DATA0_ELEM_0]], i64 01998; CHECK-NEXT:    [[DATA0_ELEM_1:%.*]] = extractvalue [2 x i32] [[DATA0]], 11999; CHECK-NEXT:    [[DATA0_AS_VEC_1:%.*]] = insertelement <2 x i32> [[DATA0_AS_VEC_0]], i32 [[DATA0_ELEM_1]], i64 12000; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA0_AS_VEC_1]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)2001; CHECK-NEXT:    [[DATA1:%.*]] = extractvalue [2 x [2 x i32]] [[DATA]], 12002; CHECK-NEXT:    [[DATA1_ELEM_0:%.*]] = extractvalue [2 x i32] [[DATA1]], 02003; CHECK-NEXT:    [[DATA1_AS_VEC_0:%.*]] = insertelement <2 x i32> poison, i32 [[DATA1_ELEM_0]], i64 02004; CHECK-NEXT:    [[DATA1_ELEM_1:%.*]] = extractvalue [2 x i32] [[DATA1]], 12005; CHECK-NEXT:    [[DATA1_AS_VEC_1:%.*]] = insertelement <2 x i32> [[DATA1_AS_VEC_0]], i32 [[DATA1_ELEM_1]], i64 12006; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA1_AS_VEC_1]], ptr addrspace(8) align 4 [[BUF]], i32 8, i32 0, i32 0)2007; CHECK-NEXT:    ret void2008;2009  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2010  store [2 x [2 x i32]] %data, ptr addrspace(7) %p2011  ret void2012}2013 2014define [2 x <2 x i32>] @load_a2v2i32(ptr addrspace(8) inreg %buf) {2015; CHECK-LABEL: define [2 x <2 x i32>] @load_a2v2i32(2016; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2017; CHECK-NEXT:    [[RET0_OFF_0:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2018; CHECK-NEXT:    [[RET0:%.*]] = insertvalue [2 x <2 x i32>] poison, <2 x i32> [[RET0_OFF_0]], 02019; CHECK-NEXT:    [[RET1_OFF_8:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)2020; CHECK-NEXT:    [[RET:%.*]] = insertvalue [2 x <2 x i32>] [[RET0]], <2 x i32> [[RET1_OFF_8]], 12021; CHECK-NEXT:    ret [2 x <2 x i32>] [[RET]]2022;2023  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2024  %ret = load [2 x <2 x i32>], ptr addrspace(7) %p2025  ret [2 x <2 x i32>] %ret2026}2027 2028define void @store_a2v2i32([2 x <2 x i32>] %data, ptr addrspace(8) inreg %buf) {2029; CHECK-LABEL: define void @store_a2v2i32(2030; CHECK-SAME: [2 x <2 x i32>] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2031; CHECK-NEXT:    [[DATA0:%.*]] = extractvalue [2 x <2 x i32>] [[DATA]], 02032; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2033; CHECK-NEXT:    [[DATA1:%.*]] = extractvalue [2 x <2 x i32>] [[DATA]], 12034; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA1]], ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)2035; CHECK-NEXT:    ret void2036;2037  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2038  store [2 x <2 x i32>] %data, ptr addrspace(7) %p2039  ret void2040}2041 2042define { i32 } @load_sl_i32s(ptr addrspace(8) inreg %buf) {2043; CHECK-LABEL: define { i32 } @load_sl_i32s(2044; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2045; CHECK-NEXT:    [[RET_0_OFF_0:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)2046; CHECK-NEXT:    [[RET:%.*]] = insertvalue { i32 } poison, i32 [[RET_0_OFF_0]], 02047; CHECK-NEXT:    ret { i32 } [[RET]]2048;2049  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2050  %ret = load { i32 }, ptr addrspace(7) %p2051  ret { i32 } %ret2052}2053 2054define void @store_sl_i32s({ i32 } %data, ptr addrspace(8) inreg %buf) {2055; CHECK-LABEL: define void @store_sl_i32s(2056; CHECK-SAME: { i32 } [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2057; CHECK-NEXT:    [[DATA_0:%.*]] = extractvalue { i32 } [[DATA]], 02058; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_0]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)2059; CHECK-NEXT:    ret void2060;2061  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2062  store { i32 } %data, ptr addrspace(7) %p2063  ret void2064}2065 2066define { { float } } @load_sl_sl_f32ss(ptr addrspace(8) inreg %buf) {2067; CHECK-LABEL: define { { float } } @load_sl_sl_f32ss(2068; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2069; CHECK-NEXT:    [[RET_0_0_OFF_0:%.*]] = call float @llvm.amdgcn.raw.ptr.buffer.load.f32(ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)2070; CHECK-NEXT:    [[RET:%.*]] = insertvalue { { float } } poison, float [[RET_0_0_OFF_0]], 0, 02071; CHECK-NEXT:    ret { { float } } [[RET]]2072;2073  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2074  %ret = load { { float } }, ptr addrspace(7) %p2075  ret { { float } } %ret2076}2077 2078define void @store_sl_sl_f32ss({ { float } } %data, ptr addrspace(8) inreg %buf) {2079; CHECK-LABEL: define void @store_sl_sl_f32ss(2080; CHECK-SAME: { { float } } [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2081; CHECK-NEXT:    [[DATA_0_0:%.*]] = extractvalue { { float } } [[DATA]], 0, 02082; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.f32(float [[DATA_0_0]], ptr addrspace(8) align 4 [[BUF]], i32 0, i32 0, i32 0)2083; CHECK-NEXT:    ret void2084;2085  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2086  store { { float } } %data, ptr addrspace(7) %p2087  ret void2088}2089 2090define { <2 x i32> } @load_sl_v2i32s(ptr addrspace(8) inreg %buf) {2091; CHECK-LABEL: define { <2 x i32> } @load_sl_v2i32s(2092; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2093; CHECK-NEXT:    [[RET_0_OFF_0:%.*]] = call <2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.v2i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2094; CHECK-NEXT:    [[RET:%.*]] = insertvalue { <2 x i32> } poison, <2 x i32> [[RET_0_OFF_0]], 02095; CHECK-NEXT:    ret { <2 x i32> } [[RET]]2096;2097  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2098  %ret = load { <2 x i32> }, ptr addrspace(7) %p2099  ret { <2 x i32> } %ret2100}2101 2102define void @store_sl_v2i32s({ <2 x i32> } %data, ptr addrspace(8) inreg %buf) {2103; CHECK-LABEL: define void @store_sl_v2i32s(2104; CHECK-SAME: { <2 x i32> } [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2105; CHECK-NEXT:    [[DATA_0:%.*]] = extractvalue { <2 x i32> } [[DATA]], 02106; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.v2i32(<2 x i32> [[DATA_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2107; CHECK-NEXT:    ret void2108;2109  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2110  store { <2 x i32> } %data, ptr addrspace(7) %p2111  ret void2112}2113 2114define { i64, i32 } @load_sl_i64i32s(ptr addrspace(8) inreg %buf) {2115; CHECK-LABEL: define { i64, i32 } @load_sl_i64i32s(2116; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2117; CHECK-NEXT:    [[RET_0_OFF_0:%.*]] = call i64 @llvm.amdgcn.raw.ptr.buffer.load.i64(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2118; CHECK-NEXT:    [[RET_0:%.*]] = insertvalue { i64, i32 } poison, i64 [[RET_0_OFF_0]], 02119; CHECK-NEXT:    [[RET_1_OFF_8:%.*]] = call i32 @llvm.amdgcn.raw.ptr.buffer.load.i32(ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)2120; CHECK-NEXT:    [[RET:%.*]] = insertvalue { i64, i32 } [[RET_0]], i32 [[RET_1_OFF_8]], 12121; CHECK-NEXT:    ret { i64, i32 } [[RET]]2122;2123  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2124  %ret = load { i64, i32 }, ptr addrspace(7) %p2125  ret { i64, i32 } %ret2126}2127 2128define void @store_sl_i64i32s({ i64, i32 } %data, ptr addrspace(8) inreg %buf) {2129; CHECK-LABEL: define void @store_sl_i64i32s(2130; CHECK-SAME: { i64, i32 } [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2131; CHECK-NEXT:    [[DATA_0:%.*]] = extractvalue { i64, i32 } [[DATA]], 02132; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i64(i64 [[DATA_0]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2133; CHECK-NEXT:    [[DATA_1:%.*]] = extractvalue { i64, i32 } [[DATA]], 12134; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i32(i32 [[DATA_1]], ptr addrspace(8) align 8 [[BUF]], i32 8, i32 0, i32 0)2135; CHECK-NEXT:    ret void2136;2137  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2138  store { i64, i32 } %data, ptr addrspace(7) %p2139  ret void2140}2141 2142define [4 x i7] @load_a4i7(ptr addrspace(8) inreg %buf) {2143; CHECK-LABEL: define [4 x i7] @load_a4i7(2144; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2145; CHECK-NEXT:    [[RET0_OFF_0:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)2146; CHECK-NEXT:    [[RET0_TRUNC:%.*]] = trunc i8 [[RET0_OFF_0]] to i72147; CHECK-NEXT:    [[RET0:%.*]] = insertvalue [4 x i7] poison, i7 [[RET0_TRUNC]], 02148; CHECK-NEXT:    [[RET1_OFF_1:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 1, i32 0, i32 0)2149; CHECK-NEXT:    [[RET1_TRUNC:%.*]] = trunc i8 [[RET1_OFF_1]] to i72150; CHECK-NEXT:    [[RET1:%.*]] = insertvalue [4 x i7] [[RET0]], i7 [[RET1_TRUNC]], 12151; CHECK-NEXT:    [[RET2_OFF_2:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 2, i32 0, i32 0)2152; CHECK-NEXT:    [[RET2_TRUNC:%.*]] = trunc i8 [[RET2_OFF_2]] to i72153; CHECK-NEXT:    [[RET2:%.*]] = insertvalue [4 x i7] [[RET1]], i7 [[RET2_TRUNC]], 22154; CHECK-NEXT:    [[RET3_OFF_3:%.*]] = call i8 @llvm.amdgcn.raw.ptr.buffer.load.i8(ptr addrspace(8) align 1 [[BUF]], i32 3, i32 0, i32 0)2155; CHECK-NEXT:    [[RET3_TRUNC:%.*]] = trunc i8 [[RET3_OFF_3]] to i72156; CHECK-NEXT:    [[RET:%.*]] = insertvalue [4 x i7] [[RET2]], i7 [[RET3_TRUNC]], 32157; CHECK-NEXT:    ret [4 x i7] [[RET]]2158;2159  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2160  %ret = load [4 x i7], ptr addrspace(7) %p2161  ret [4 x i7] %ret2162}2163 2164define void @store_a4i7([4 x i7] %data, ptr addrspace(8) inreg %buf) {2165; CHECK-LABEL: define void @store_a4i7(2166; CHECK-SAME: [4 x i7] [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2167; CHECK-NEXT:    [[DATA0:%.*]] = extractvalue [4 x i7] [[DATA]], 02168; CHECK-NEXT:    [[DATA0_ZEXT:%.*]] = zext i7 [[DATA0]] to i82169; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA0_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 0, i32 0, i32 0)2170; CHECK-NEXT:    [[DATA1:%.*]] = extractvalue [4 x i7] [[DATA]], 12171; CHECK-NEXT:    [[DATA1_ZEXT:%.*]] = zext i7 [[DATA1]] to i82172; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA1_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 1, i32 0, i32 0)2173; CHECK-NEXT:    [[DATA2:%.*]] = extractvalue [4 x i7] [[DATA]], 22174; CHECK-NEXT:    [[DATA2_ZEXT:%.*]] = zext i7 [[DATA2]] to i82175; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA2_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 2, i32 0, i32 0)2176; CHECK-NEXT:    [[DATA3:%.*]] = extractvalue [4 x i7] [[DATA]], 32177; CHECK-NEXT:    [[DATA3_ZEXT:%.*]] = zext i7 [[DATA3]] to i82178; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.i8(i8 [[DATA3_ZEXT]], ptr addrspace(8) align 1 [[BUF]], i32 3, i32 0, i32 0)2179; CHECK-NEXT:    ret void2180;2181  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2182  store [4 x i7] %data, ptr addrspace(7) %p2183  ret void2184}2185 2186;;; Scalable vector. This isn't semantically meaningful but shouldn't crash.2187 2188define <vscale x 2 x i32> @load_nxv2i32(ptr addrspace(8) inreg %buf) {2189; CHECK-LABEL: define <vscale x 2 x i32> @load_nxv2i32(2190; CHECK-SAME: ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2191; CHECK-NEXT:    [[RET:%.*]] = call <vscale x 2 x i32> @llvm.amdgcn.raw.ptr.buffer.load.nxv2i32(ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2192; CHECK-NEXT:    ret <vscale x 2 x i32> [[RET]]2193;2194  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2195  %ret = load <vscale x 2 x i32>, ptr addrspace(7) %p2196  ret <vscale x 2 x i32> %ret2197}2198 2199define void @store_nxv2i32(<vscale x 2 x i32> %data, ptr addrspace(8) inreg %buf) {2200; CHECK-LABEL: define void @store_nxv2i32(2201; CHECK-SAME: <vscale x 2 x i32> [[DATA:%.*]], ptr addrspace(8) inreg [[BUF:%.*]]) #[[ATTR0]] {2202; CHECK-NEXT:    call void @llvm.amdgcn.raw.ptr.buffer.store.nxv2i32(<vscale x 2 x i32> [[DATA]], ptr addrspace(8) align 8 [[BUF]], i32 0, i32 0, i32 0)2203; CHECK-NEXT:    ret void2204;2205  %p = addrspacecast ptr addrspace(8) %buf to ptr addrspace(7)2206  store <vscale x 2 x i32> %data, ptr addrspace(7) %p2207  ret void2208}2209