479 lines · plain
1; RUN: llc -mtriple=amdgcn-- < %s | FileCheck -check-prefixes=GCN,SICIVI,FUNC %s2; RUN: llc -mtriple=amdgcn-- -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,SICIVI,FUNC %s3; RUN: llc -mtriple=amdgcn-- -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,FUNC %s4; RUN: llc -mtriple=r600-- -mcpu=cypress < %s | FileCheck -check-prefixes=EG,FUNC %s5 6; FUNC-LABEL: {{^}}local_load_i1:7; SICIVI: s_mov_b32 m08; GFX9-NOT: m09 10; GCN: ds_read_u811; GCN: v_and_b32_e32 v{{[0-9]+}}, 112; GCN: ds_write_b813 14; EG: LDS_UBYTE_READ_RET15; EG: AND_INT16; EG: LDS_BYTE_WRITE17define amdgpu_kernel void @local_load_i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {18 %load = load i1, ptr addrspace(3) %in19 store i1 %load, ptr addrspace(3) %out20 ret void21}22 23; FUNC-LABEL: {{^}}local_load_v2i1:24; SICIVI: s_mov_b32 m025; GFX9-NOT: m026define amdgpu_kernel void @local_load_v2i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {27 %load = load <2 x i1>, ptr addrspace(3) %in28 store <2 x i1> %load, ptr addrspace(3) %out29 ret void30}31 32; FUNC-LABEL: {{^}}local_load_v3i1:33; SICIVI: s_mov_b32 m034; GFX9-NOT: m035define amdgpu_kernel void @local_load_v3i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {36 %load = load <3 x i1>, ptr addrspace(3) %in37 store <3 x i1> %load, ptr addrspace(3) %out38 ret void39}40 41; FUNC-LABEL: {{^}}local_load_v4i1:42; SICIVI: s_mov_b32 m043; GFX9-NOT: m044define amdgpu_kernel void @local_load_v4i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {45 %load = load <4 x i1>, ptr addrspace(3) %in46 store <4 x i1> %load, ptr addrspace(3) %out47 ret void48}49 50; FUNC-LABEL: {{^}}local_load_v8i1:51; SICIVI: s_mov_b32 m052; GFX9-NOT: m053define amdgpu_kernel void @local_load_v8i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {54 %load = load <8 x i1>, ptr addrspace(3) %in55 store <8 x i1> %load, ptr addrspace(3) %out56 ret void57}58 59; FUNC-LABEL: {{^}}local_load_v16i1:60; SICIVI: s_mov_b32 m061; GFX9-NOT: m062define amdgpu_kernel void @local_load_v16i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {63 %load = load <16 x i1>, ptr addrspace(3) %in64 store <16 x i1> %load, ptr addrspace(3) %out65 ret void66}67 68; FUNC-LABEL: {{^}}local_load_v32i1:69; SICIVI: s_mov_b32 m070; GFX9-NOT: m071define amdgpu_kernel void @local_load_v32i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {72 %load = load <32 x i1>, ptr addrspace(3) %in73 store <32 x i1> %load, ptr addrspace(3) %out74 ret void75}76 77; FUNC-LABEL: {{^}}local_load_v64i1:78; SICIVI: s_mov_b32 m079; GFX9-NOT: m080define amdgpu_kernel void @local_load_v64i1(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {81 %load = load <64 x i1>, ptr addrspace(3) %in82 store <64 x i1> %load, ptr addrspace(3) %out83 ret void84}85 86; FUNC-LABEL: {{^}}local_zextload_i1_to_i32:87; SICIVI: s_mov_b32 m088; GFX9-NOT: m089 90; GCN: ds_read_u891; GCN: ds_write_b3292define amdgpu_kernel void @local_zextload_i1_to_i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {93 %a = load i1, ptr addrspace(3) %in94 %ext = zext i1 %a to i3295 store i32 %ext, ptr addrspace(3) %out96 ret void97}98 99; FUNC-LABEL: {{^}}local_sextload_i1_to_i32:100; SICIVI: s_mov_b32 m0101; GFX9-NOT: m0102 103; GCN: ds_read_u8104; GCN: v_bfe_i32 {{v[0-9]+}}, {{v[0-9]+}}, 0, 1{{$}}105; GCN: ds_write_b32106 107; EG: LDS_UBYTE_READ_RET108; EG: BFE_INT109define amdgpu_kernel void @local_sextload_i1_to_i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {110 %a = load i1, ptr addrspace(3) %in111 %ext = sext i1 %a to i32112 store i32 %ext, ptr addrspace(3) %out113 ret void114}115 116; FUNC-LABEL: {{^}}local_zextload_v1i1_to_v1i32:117; SICIVI: s_mov_b32 m0118; GFX9-NOT: m0119define amdgpu_kernel void @local_zextload_v1i1_to_v1i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {120 %load = load <1 x i1>, ptr addrspace(3) %in121 %ext = zext <1 x i1> %load to <1 x i32>122 store <1 x i32> %ext, ptr addrspace(3) %out123 ret void124}125 126; FUNC-LABEL: {{^}}local_sextload_v1i1_to_v1i32:127; SICIVI: s_mov_b32 m0128; GFX9-NOT: m0129define amdgpu_kernel void @local_sextload_v1i1_to_v1i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {130 %load = load <1 x i1>, ptr addrspace(3) %in131 %ext = sext <1 x i1> %load to <1 x i32>132 store <1 x i32> %ext, ptr addrspace(3) %out133 ret void134}135 136; FUNC-LABEL: {{^}}local_zextload_v2i1_to_v2i32:137; SICIVI: s_mov_b32 m0138; GFX9-NOT: m0139define amdgpu_kernel void @local_zextload_v2i1_to_v2i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {140 %load = load <2 x i1>, ptr addrspace(3) %in141 %ext = zext <2 x i1> %load to <2 x i32>142 store <2 x i32> %ext, ptr addrspace(3) %out143 ret void144}145 146; FUNC-LABEL: {{^}}local_sextload_v2i1_to_v2i32:147; SICIVI: s_mov_b32 m0148; GFX9-NOT: m0149define amdgpu_kernel void @local_sextload_v2i1_to_v2i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {150 %load = load <2 x i1>, ptr addrspace(3) %in151 %ext = sext <2 x i1> %load to <2 x i32>152 store <2 x i32> %ext, ptr addrspace(3) %out153 ret void154}155 156; FUNC-LABEL: {{^}}local_zextload_v3i1_to_v3i32:157; SICIVI: s_mov_b32 m0158; GFX9-NOT: m0159define amdgpu_kernel void @local_zextload_v3i1_to_v3i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {160 %load = load <3 x i1>, ptr addrspace(3) %in161 %ext = zext <3 x i1> %load to <3 x i32>162 store <3 x i32> %ext, ptr addrspace(3) %out163 ret void164}165 166; FUNC-LABEL: {{^}}local_sextload_v3i1_to_v3i32:167; SICIVI: s_mov_b32 m0168; GFX9-NOT: m0169define amdgpu_kernel void @local_sextload_v3i1_to_v3i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {170 %load = load <3 x i1>, ptr addrspace(3) %in171 %ext = sext <3 x i1> %load to <3 x i32>172 store <3 x i32> %ext, ptr addrspace(3) %out173 ret void174}175 176; FUNC-LABEL: {{^}}local_zextload_v4i1_to_v4i32:177; SICIVI: s_mov_b32 m0178; GFX9-NOT: m0179define amdgpu_kernel void @local_zextload_v4i1_to_v4i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {180 %load = load <4 x i1>, ptr addrspace(3) %in181 %ext = zext <4 x i1> %load to <4 x i32>182 store <4 x i32> %ext, ptr addrspace(3) %out183 ret void184}185 186; FUNC-LABEL: {{^}}local_sextload_v4i1_to_v4i32:187; SICIVI: s_mov_b32 m0188; GFX9-NOT: m0189define amdgpu_kernel void @local_sextload_v4i1_to_v4i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {190 %load = load <4 x i1>, ptr addrspace(3) %in191 %ext = sext <4 x i1> %load to <4 x i32>192 store <4 x i32> %ext, ptr addrspace(3) %out193 ret void194}195 196; FUNC-LABEL: {{^}}local_zextload_v8i1_to_v8i32:197; SICIVI: s_mov_b32 m0198; GFX9-NOT: m0199define amdgpu_kernel void @local_zextload_v8i1_to_v8i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {200 %load = load <8 x i1>, ptr addrspace(3) %in201 %ext = zext <8 x i1> %load to <8 x i32>202 store <8 x i32> %ext, ptr addrspace(3) %out203 ret void204}205 206; FUNC-LABEL: {{^}}local_sextload_v8i1_to_v8i32:207; SICIVI: s_mov_b32 m0208; GFX9-NOT: m0209define amdgpu_kernel void @local_sextload_v8i1_to_v8i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {210 %load = load <8 x i1>, ptr addrspace(3) %in211 %ext = sext <8 x i1> %load to <8 x i32>212 store <8 x i32> %ext, ptr addrspace(3) %out213 ret void214}215 216; FUNC-LABEL: {{^}}local_zextload_v16i1_to_v16i32:217; SICIVI: s_mov_b32 m0218; GFX9-NOT: m0219define amdgpu_kernel void @local_zextload_v16i1_to_v16i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {220 %load = load <16 x i1>, ptr addrspace(3) %in221 %ext = zext <16 x i1> %load to <16 x i32>222 store <16 x i32> %ext, ptr addrspace(3) %out223 ret void224}225 226; FUNC-LABEL: {{^}}local_sextload_v16i1_to_v16i32:227; SICIVI: s_mov_b32 m0228; GFX9-NOT: m0229define amdgpu_kernel void @local_sextload_v16i1_to_v16i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {230 %load = load <16 x i1>, ptr addrspace(3) %in231 %ext = sext <16 x i1> %load to <16 x i32>232 store <16 x i32> %ext, ptr addrspace(3) %out233 ret void234}235 236; FUNC-LABEL: {{^}}local_zextload_v32i1_to_v32i32:237; SICIVI: s_mov_b32 m0238; GFX9-NOT: m0239define amdgpu_kernel void @local_zextload_v32i1_to_v32i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {240 %load = load <32 x i1>, ptr addrspace(3) %in241 %ext = zext <32 x i1> %load to <32 x i32>242 store <32 x i32> %ext, ptr addrspace(3) %out243 ret void244}245 246; FUNC-LABEL: {{^}}local_sextload_v32i1_to_v32i32:247; SICIVI: s_mov_b32 m0248; GFX9-NOT: m0249define amdgpu_kernel void @local_sextload_v32i1_to_v32i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {250 %load = load <32 x i1>, ptr addrspace(3) %in251 %ext = sext <32 x i1> %load to <32 x i32>252 store <32 x i32> %ext, ptr addrspace(3) %out253 ret void254}255 256; FUNC-LABEL: {{^}}local_zextload_v64i1_to_v64i32:257; SICIVI: s_mov_b32 m0258; GFX9-NOT: m0259define amdgpu_kernel void @local_zextload_v64i1_to_v64i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {260 %load = load <64 x i1>, ptr addrspace(3) %in261 %ext = zext <64 x i1> %load to <64 x i32>262 store <64 x i32> %ext, ptr addrspace(3) %out263 ret void264}265 266; FUNC-LABEL: {{^}}local_sextload_v64i1_to_v64i32:267; SICIVI: s_mov_b32 m0268; GFX9-NOT: m0269define amdgpu_kernel void @local_sextload_v64i1_to_v64i32(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {270 %load = load <64 x i1>, ptr addrspace(3) %in271 %ext = sext <64 x i1> %load to <64 x i32>272 store <64 x i32> %ext, ptr addrspace(3) %out273 ret void274}275 276; FUNC-LABEL: {{^}}local_zextload_i1_to_i64:277; SICIVI: s_mov_b32 m0278; GFX9-NOT: m0279 280; GCN-DAG: ds_read_u8 [[LOAD:v[0-9]+]],281; GCN-DAG: v_mov_b32_e32 {{v[0-9]+}}, 0{{$}}282; GCN: ds_write_b64283define amdgpu_kernel void @local_zextload_i1_to_i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {284 %a = load i1, ptr addrspace(3) %in285 %ext = zext i1 %a to i64286 store i64 %ext, ptr addrspace(3) %out287 ret void288}289 290; FUNC-LABEL: {{^}}local_sextload_i1_to_i64:291; SICIVI: s_mov_b32 m0292; GFX9-NOT: m0293 294; GCN: ds_read_u8 [[LOAD:v[0-9]+]],295; GCN: v_bfe_i32 [[BFE:v[0-9]+]], {{v[0-9]+}}, 0, 1{{$}}296; GCN: v_ashrrev_i32_e32 v{{[0-9]+}}, 31, [[BFE]]297; GCN: ds_write_b64298define amdgpu_kernel void @local_sextload_i1_to_i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {299 %a = load i1, ptr addrspace(3) %in300 %ext = sext i1 %a to i64301 store i64 %ext, ptr addrspace(3) %out302 ret void303}304 305; FUNC-LABEL: {{^}}local_zextload_v1i1_to_v1i64:306; SICIVI: s_mov_b32 m0307; GFX9-NOT: m0308define amdgpu_kernel void @local_zextload_v1i1_to_v1i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {309 %load = load <1 x i1>, ptr addrspace(3) %in310 %ext = zext <1 x i1> %load to <1 x i64>311 store <1 x i64> %ext, ptr addrspace(3) %out312 ret void313}314 315; FUNC-LABEL: {{^}}local_sextload_v1i1_to_v1i64:316; SICIVI: s_mov_b32 m0317; GFX9-NOT: m0318define amdgpu_kernel void @local_sextload_v1i1_to_v1i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {319 %load = load <1 x i1>, ptr addrspace(3) %in320 %ext = sext <1 x i1> %load to <1 x i64>321 store <1 x i64> %ext, ptr addrspace(3) %out322 ret void323}324 325; FUNC-LABEL: {{^}}local_zextload_v2i1_to_v2i64:326; SICIVI: s_mov_b32 m0327; GFX9-NOT: m0328define amdgpu_kernel void @local_zextload_v2i1_to_v2i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {329 %load = load <2 x i1>, ptr addrspace(3) %in330 %ext = zext <2 x i1> %load to <2 x i64>331 store <2 x i64> %ext, ptr addrspace(3) %out332 ret void333}334 335; FUNC-LABEL: {{^}}local_sextload_v2i1_to_v2i64:336; SICIVI: s_mov_b32 m0337; GFX9-NOT: m0338define amdgpu_kernel void @local_sextload_v2i1_to_v2i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {339 %load = load <2 x i1>, ptr addrspace(3) %in340 %ext = sext <2 x i1> %load to <2 x i64>341 store <2 x i64> %ext, ptr addrspace(3) %out342 ret void343}344 345; FUNC-LABEL: {{^}}local_zextload_v3i1_to_v3i64:346; SICIVI: s_mov_b32 m0347; GFX9-NOT: m0348define amdgpu_kernel void @local_zextload_v3i1_to_v3i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {349 %load = load <3 x i1>, ptr addrspace(3) %in350 %ext = zext <3 x i1> %load to <3 x i64>351 store <3 x i64> %ext, ptr addrspace(3) %out352 ret void353}354 355; FUNC-LABEL: {{^}}local_sextload_v3i1_to_v3i64:356; SICIVI: s_mov_b32 m0357; GFX9-NOT: m0358define amdgpu_kernel void @local_sextload_v3i1_to_v3i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {359 %load = load <3 x i1>, ptr addrspace(3) %in360 %ext = sext <3 x i1> %load to <3 x i64>361 store <3 x i64> %ext, ptr addrspace(3) %out362 ret void363}364 365; FUNC-LABEL: {{^}}local_zextload_v4i1_to_v4i64:366; SICIVI: s_mov_b32 m0367; GFX9-NOT: m0368define amdgpu_kernel void @local_zextload_v4i1_to_v4i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {369 %load = load <4 x i1>, ptr addrspace(3) %in370 %ext = zext <4 x i1> %load to <4 x i64>371 store <4 x i64> %ext, ptr addrspace(3) %out372 ret void373}374 375; FUNC-LABEL: {{^}}local_sextload_v4i1_to_v4i64:376; SICIVI: s_mov_b32 m0377; GFX9-NOT: m0378define amdgpu_kernel void @local_sextload_v4i1_to_v4i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {379 %load = load <4 x i1>, ptr addrspace(3) %in380 %ext = sext <4 x i1> %load to <4 x i64>381 store <4 x i64> %ext, ptr addrspace(3) %out382 ret void383}384 385; FUNC-LABEL: {{^}}local_zextload_v8i1_to_v8i64:386; SICIVI: s_mov_b32 m0387; GFX9-NOT: m0388define amdgpu_kernel void @local_zextload_v8i1_to_v8i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {389 %load = load <8 x i1>, ptr addrspace(3) %in390 %ext = zext <8 x i1> %load to <8 x i64>391 store <8 x i64> %ext, ptr addrspace(3) %out392 ret void393}394 395; FUNC-LABEL: {{^}}local_sextload_v8i1_to_v8i64:396; SICIVI: s_mov_b32 m0397; GFX9-NOT: m0398define amdgpu_kernel void @local_sextload_v8i1_to_v8i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {399 %load = load <8 x i1>, ptr addrspace(3) %in400 %ext = sext <8 x i1> %load to <8 x i64>401 store <8 x i64> %ext, ptr addrspace(3) %out402 ret void403}404 405; FUNC-LABEL: {{^}}local_zextload_v16i1_to_v16i64:406; SICIVI: s_mov_b32 m0407; GFX9-NOT: m0408define amdgpu_kernel void @local_zextload_v16i1_to_v16i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {409 %load = load <16 x i1>, ptr addrspace(3) %in410 %ext = zext <16 x i1> %load to <16 x i64>411 store <16 x i64> %ext, ptr addrspace(3) %out412 ret void413}414 415; FUNC-LABEL: {{^}}local_sextload_v16i1_to_v16i64:416; SICIVI: s_mov_b32 m0417; GFX9-NOT: m0418define amdgpu_kernel void @local_sextload_v16i1_to_v16i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {419 %load = load <16 x i1>, ptr addrspace(3) %in420 %ext = sext <16 x i1> %load to <16 x i64>421 store <16 x i64> %ext, ptr addrspace(3) %out422 ret void423}424 425; FUNC-LABEL: {{^}}local_zextload_v32i1_to_v32i64:426; SICIVI: s_mov_b32 m0427; GFX9-NOT: m0428define amdgpu_kernel void @local_zextload_v32i1_to_v32i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {429 %load = load <32 x i1>, ptr addrspace(3) %in430 %ext = zext <32 x i1> %load to <32 x i64>431 store <32 x i64> %ext, ptr addrspace(3) %out432 ret void433}434 435; FUNC-LABEL: {{^}}local_sextload_v32i1_to_v32i64:436; SICIVI: s_mov_b32 m0437; GFX9-NOT: m0438define amdgpu_kernel void @local_sextload_v32i1_to_v32i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {439 %load = load <32 x i1>, ptr addrspace(3) %in440 %ext = sext <32 x i1> %load to <32 x i64>441 store <32 x i64> %ext, ptr addrspace(3) %out442 ret void443}444 445; FUNC-LABEL: {{^}}local_zextload_v64i1_to_v64i64:446; SICIVI: s_mov_b32 m0447; GFX9-NOT: m0448define amdgpu_kernel void @local_zextload_v64i1_to_v64i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {449 %load = load <64 x i1>, ptr addrspace(3) %in450 %ext = zext <64 x i1> %load to <64 x i64>451 store <64 x i64> %ext, ptr addrspace(3) %out452 ret void453}454 455; FUNC-LABEL: {{^}}local_sextload_v64i1_to_v64i64:456; SICIVI: s_mov_b32 m0457; GFX9-NOT: m0458define amdgpu_kernel void @local_sextload_v64i1_to_v64i64(ptr addrspace(3) %out, ptr addrspace(3) %in) #0 {459 %load = load <64 x i1>, ptr addrspace(3) %in460 %ext = sext <64 x i1> %load to <64 x i64>461 store <64 x i64> %ext, ptr addrspace(3) %out462 ret void463}464 465; FUNC-LABEL: {{^}}local_load_i1_misaligned:466; SICIVI: s_mov_b32 m0467; GFX9-NOT: m0468define amdgpu_kernel void @local_load_i1_misaligned(ptr addrspace(3) %in, ptr addrspace (3) %out) #0 {469 %in.gep.1 = getelementptr i1, ptr addrspace(3) %in, i32 1470 %load.1 = load <16 x i1>, ptr addrspace(3) %in.gep.1, align 4471 %load.2 = load <8 x i1>, ptr addrspace(3) %in, align 1472 %out.gep.1 = getelementptr i1, ptr addrspace(3) %out, i32 16473 store <16 x i1> %load.1, ptr addrspace(3) %out474 store <8 x i1> %load.2, ptr addrspace(3) %out.gep.1475 ret void476}477 478attributes #0 = { nounwind }479