115 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=load-store-vectorizer -S -o - %s | FileCheck %s3 4define void @merge_i32_v2i16_f32_v4i8(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {5; CHECK-LABEL: define void @merge_i32_v2i16_f32_v4i8(6; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {7; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(1) [[PTR1]], i64 08; CHECK-NEXT: [[LOAD1:%.*]] = load i32, ptr addrspace(1) [[GEP1]], align 49; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x i16>, ptr addrspace(1) [[PTR1]], i64 110; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x i16>, ptr addrspace(1) [[GEP2]], align 411; CHECK-NEXT: [[GEP3:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[PTR1]], i64 212; CHECK-NEXT: [[LOAD3:%.*]] = load float, ptr addrspace(1) [[GEP3]], align 413; CHECK-NEXT: [[GEP4:%.*]] = getelementptr inbounds <4 x i8>, ptr addrspace(1) [[PTR1]], i64 314; CHECK-NEXT: [[LOAD4:%.*]] = load <4 x i8>, ptr addrspace(1) [[GEP4]], align 415; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 016; CHECK-NEXT: store i32 [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 417; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x i16>, ptr addrspace(2) [[PTR2]], i64 118; CHECK-NEXT: store <2 x i16> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 419; CHECK-NEXT: [[STORE_GEP3:%.*]] = getelementptr inbounds float, ptr addrspace(2) [[PTR2]], i64 220; CHECK-NEXT: store float [[LOAD3]], ptr addrspace(2) [[STORE_GEP3]], align 421; CHECK-NEXT: [[STORE_GEP4:%.*]] = getelementptr inbounds <4 x i8>, ptr addrspace(2) [[PTR2]], i64 322; CHECK-NEXT: store <4 x i8> [[LOAD4]], ptr addrspace(2) [[STORE_GEP4]], align 423; CHECK-NEXT: ret void24;25 %gep1 = getelementptr inbounds i32, ptr addrspace(1) %ptr1, i64 026 %load1 = load i32, ptr addrspace(1) %gep1, align 427 %gep2 = getelementptr inbounds <2 x i16>, ptr addrspace(1) %ptr1, i64 128 %load2 = load <2 x i16>, ptr addrspace(1) %gep2, align 429 %gep3 = getelementptr inbounds float, ptr addrspace(1) %ptr1, i64 230 %load3 = load float, ptr addrspace(1) %gep3, align 431 %gep4 = getelementptr inbounds <4 x i8>, ptr addrspace(1) %ptr1, i64 332 %load4 = load <4 x i8>, ptr addrspace(1) %gep4, align 433 %store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 034 store i32 %load1, ptr addrspace(2) %store.gep1, align 435 %store.gep2 = getelementptr inbounds <2 x i16>, ptr addrspace(2) %ptr2, i64 136 store <2 x i16> %load2, ptr addrspace(2) %store.gep2, align 437 %store.gep3 = getelementptr inbounds float, ptr addrspace(2) %ptr2, i64 238 store float %load3, ptr addrspace(2) %store.gep3, align 439 %store.gep4 = getelementptr inbounds <4 x i8>, ptr addrspace(2) %ptr2, i64 340 store <4 x i8> %load4, ptr addrspace(2) %store.gep4, align 441 ret void42}43 44define void @merge_f32_v2f16_type(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {45; CHECK-LABEL: define void @merge_f32_v2f16_type(46; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {47; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[PTR1]], i64 048; CHECK-NEXT: [[LOAD1:%.*]] = load float, ptr addrspace(1) [[GEP1]], align 449; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(1) [[PTR1]], i64 150; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[GEP2]], align 451; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 052; CHECK-NEXT: store float [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 453; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(2) [[PTR2]], i64 154; CHECK-NEXT: store <2 x half> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 455; CHECK-NEXT: ret void56;57 %gep1 = getelementptr inbounds float, ptr addrspace(1) %ptr1, i64 058 %load1 = load float, ptr addrspace(1) %gep1, align 459 %gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %ptr1, i64 160 %load2 = load <2 x half>, ptr addrspace(1) %gep2, align 461 %store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 062 store float %load1, ptr addrspace(2) %store.gep1, align 463 %store.gep2 = getelementptr inbounds <2 x half>, ptr addrspace(2) %ptr2, i64 164 store <2 x half> %load2, ptr addrspace(2) %store.gep2, align 465 ret void66}67 68define void @merge_v2f16_bfloat_type(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {69; CHECK-LABEL: define void @merge_v2f16_bfloat_type(70; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {71; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds bfloat, ptr addrspace(1) [[PTR1]], i64 072; CHECK-NEXT: [[LOAD1:%.*]] = load bfloat, ptr addrspace(1) [[GEP1]], align 473; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(1) [[PTR1]], i64 174; CHECK-NEXT: [[LOAD2:%.*]] = load <2 x half>, ptr addrspace(1) [[GEP2]], align 475; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 076; CHECK-NEXT: store bfloat [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 477; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds <2 x half>, ptr addrspace(2) [[PTR2]], i64 178; CHECK-NEXT: store <2 x half> [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 479; CHECK-NEXT: ret void80;81 %gep1 = getelementptr inbounds bfloat, ptr addrspace(1) %ptr1, i64 082 %load1 = load bfloat, ptr addrspace(1) %gep1, align 483 %gep2 = getelementptr inbounds <2 x half>, ptr addrspace(1) %ptr1, i64 184 %load2 = load <2 x half>, ptr addrspace(1) %gep2, align 485 %store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 086 store bfloat %load1, ptr addrspace(2) %store.gep1, align 487 %store.gep2 = getelementptr inbounds <2 x half>, ptr addrspace(2) %ptr2, i64 188 store <2 x half> %load2, ptr addrspace(2) %store.gep2, align 489 ret void90}91 92define void @no_merge_mixed_ptr_addrspaces(ptr addrspace(1) %ptr1, ptr addrspace(2) %ptr2) {93; CHECK-LABEL: define void @no_merge_mixed_ptr_addrspaces(94; CHECK-SAME: ptr addrspace(1) [[PTR1:%.*]], ptr addrspace(2) [[PTR2:%.*]]) {95; CHECK-NEXT: [[GEP1:%.*]] = getelementptr inbounds ptr addrspace(1), ptr addrspace(1) [[PTR1]], i64 096; CHECK-NEXT: [[LOAD1:%.*]] = load ptr addrspace(1), ptr addrspace(1) [[GEP1]], align 497; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds ptr addrspace(2), ptr addrspace(1) [[PTR1]], i64 198; CHECK-NEXT: [[LOAD2:%.*]] = load ptr addrspace(2), ptr addrspace(1) [[GEP2]], align 499; CHECK-NEXT: [[STORE_GEP1:%.*]] = getelementptr inbounds i32, ptr addrspace(2) [[PTR2]], i64 0100; CHECK-NEXT: store ptr addrspace(1) [[LOAD1]], ptr addrspace(2) [[STORE_GEP1]], align 4101; CHECK-NEXT: [[STORE_GEP2:%.*]] = getelementptr inbounds ptr addrspace(2), ptr addrspace(2) [[PTR2]], i64 1102; CHECK-NEXT: store ptr addrspace(2) [[LOAD2]], ptr addrspace(2) [[STORE_GEP2]], align 4103; CHECK-NEXT: ret void104;105 %gep1 = getelementptr inbounds ptr addrspace(1), ptr addrspace(1) %ptr1, i64 0106 %load1 = load ptr addrspace(1), ptr addrspace(1) %gep1, align 4107 %gep2 = getelementptr inbounds ptr addrspace(2), ptr addrspace(1) %ptr1, i64 1108 %load2 = load ptr addrspace(2), ptr addrspace(1) %gep2, align 4109 %store.gep1 = getelementptr inbounds i32, ptr addrspace(2) %ptr2, i64 0110 store ptr addrspace(1) %load1, ptr addrspace(2) %store.gep1, align 4111 %store.gep2 = getelementptr inbounds ptr addrspace(2), ptr addrspace(2) %ptr2, i64 1112 store ptr addrspace(2) %load2, ptr addrspace(2) %store.gep2, align 4113 ret void114}115