brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.4 KiB · 802795d Raw
137 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt -mtriple=amdgcn-amd-amdhsa -passes=load-store-vectorizer -S -o - %s | FileCheck %s3 4define void @onevec(ptr %ptr) {5; CHECK-LABEL: define void @onevec(6; CHECK-SAME: ptr [[PTR:%.*]]) {7; CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[PTR]], align 48; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i32 [[TMP1]] to <1 x i32>9; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i32 1610; CHECK-NEXT:    [[TMP3:%.*]] = load i32, ptr [[GEP1]], align 411; CHECK-NEXT:    [[TMP4:%.*]] = bitcast i32 [[TMP3]] to <1 x i32>12; CHECK-NEXT:    [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i32 3213; CHECK-NEXT:    [[TMP5:%.*]] = load i32, ptr [[GEP2]], align 414; CHECK-NEXT:    [[TMP6:%.*]] = bitcast i32 [[TMP5]] to <1 x i32>15; CHECK-NEXT:    [[TMP7:%.*]] = bitcast i32 [[TMP5]] to <1 x i32>16; CHECK-NEXT:    ret void17;18  %ld0 = load <1 x i32>, ptr %ptr, align 419  %ld1 = load i32, ptr %ptr, align 420 21  %gep1 = getelementptr inbounds i8, ptr %ptr, i32 1622  %ld2 = load i32, ptr %gep1, align 423  %ld3 = load <1 x i32>, ptr %gep1, align 424 25  %gep2 = getelementptr inbounds i8, ptr %ptr, i32 3226  %ld4 = load <1 x i32>, ptr %gep2, align 427  %ld5 = load <1 x i32>, ptr %gep2, align 428  ret void29}30 31define void @test(ptr %ptr) {32; CHECK-LABEL: define void @test(33; CHECK-SAME: ptr [[PTR:%.*]]) {34; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[PTR]], align 435; CHECK-NEXT:    [[LD01:%.*]] = extractelement <4 x i32> [[TMP1]], i32 036; CHECK-NEXT:    [[LD12:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <2 x i32> <i32 1, i32 2>37; CHECK-NEXT:    [[LD23:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <2 x i32> <i32 2, i32 3>38; CHECK-NEXT:    [[LD34:%.*]] = extractelement <4 x i32> [[TMP1]], i32 239; CHECK-NEXT:    ret void40;41  %ld0 = load i32, ptr %ptr, align 442  %gep1 = getelementptr inbounds i8, ptr %ptr, i32 443  %ld1 = load <2 x i32>, ptr %gep1, align 444  %gep2 = getelementptr inbounds i8, ptr %ptr, i32 845  %ld2 = load <2 x i32>, ptr %gep2, align 446  %gep3 = getelementptr inbounds i8, ptr %ptr, i32 847  %ld3 = load i32, ptr %gep3, align 448  ret void49}50 51@ptr = external local_unnamed_addr addrspace(1) global <8 x float>, align 452 53define void @test2() {54; CHECK-LABEL: define void @test2() {55; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x float>, ptr addrspace(1) @ptr, align 456; CHECK-NEXT:    [[VECINS1:%.*]] = shufflevector <8 x float> [[TMP1]], <8 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>57; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <8 x float> [[TMP1]], i32 158; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <8 x float> [[TMP1]], i32 259; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <8 x float> [[TMP1]], i32 360; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <8 x float> [[TMP1]], i32 461; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <8 x float> [[TMP1]], i32 562; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <8 x float> [[TMP1]], i32 663; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <8 x float> [[TMP1]], i32 764; CHECK-NEXT:    [[VECINS_1:%.*]] = insertelement <8 x float> [[VECINS1]], float [[TMP2]], i64 165; CHECK-NEXT:    [[VECINS_2:%.*]] = insertelement <8 x float> [[VECINS_1]], float [[TMP3]], i64 266; CHECK-NEXT:    [[VECINS_3:%.*]] = insertelement <8 x float> [[VECINS_2]], float [[TMP4]], i64 367; CHECK-NEXT:    [[VECINS_4:%.*]] = insertelement <8 x float> [[VECINS_3]], float [[TMP5]], i64 468; CHECK-NEXT:    [[VECINS_5:%.*]] = insertelement <8 x float> [[VECINS_4]], float [[TMP6]], i64 569; CHECK-NEXT:    [[VECINS_6:%.*]] = insertelement <8 x float> [[VECINS_5]], float [[TMP7]], i64 670; CHECK-NEXT:    [[VECINS_7:%.*]] = insertelement <8 x float> [[VECINS_6]], float [[TMP8]], i64 771; CHECK-NEXT:    ret void72;73  %vecins = load <8 x float>, ptr addrspace(1) @ptr, align 474  %5 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 4), align 475  %vecins.1 = insertelement <8 x float> %vecins, float %5, i64 176  %6 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 8), align 477  %vecins.2 = insertelement <8 x float> %vecins.1, float %6, i64 278  %7 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 12), align 479  %vecins.3 = insertelement <8 x float> %vecins.2, float %7, i64 380  %8 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 16), align 481  %vecins.4 = insertelement <8 x float> %vecins.3, float %8, i64 482  %9 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 20), align 483  %vecins.5 = insertelement <8 x float> %vecins.4, float %9, i64 584  %10 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 24), align 485  %vecins.6 = insertelement <8 x float> %vecins.5, float %10, i64 686  %11 = load float, ptr addrspace(1) getelementptr inbounds nuw (i8, ptr addrspace(1) @ptr, i32 28), align 487  %vecins.7 = insertelement <8 x float> %vecins.6, float %11, i64 788  ret void89}90 91define void @vect_zext_bitcast_i8_st4_to_i32_idx(ptr addrspace(1) %arg1, i32 %base) {92; CHECK-LABEL: define void @vect_zext_bitcast_i8_st4_to_i32_idx(93; CHECK-SAME: ptr addrspace(1) [[ARG1:%.*]], i32 [[BASE:%.*]]) {94; CHECK-NEXT:    [[ADD1:%.*]] = add nuw i32 [[BASE]], 095; CHECK-NEXT:    [[ZEXT1:%.*]] = zext i32 [[ADD1]] to i6496; CHECK-NEXT:    [[GEP1:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[ARG1]], i64 [[ZEXT1]]97; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i32>, ptr addrspace(1) [[GEP1]], align 498; CHECK-NEXT:    [[LOAD11:%.*]] = extractelement <2 x i32> [[TMP1]], i32 099; CHECK-NEXT:    [[LOAD22:%.*]] = extractelement <2 x i32> [[TMP1]], i32 1100; CHECK-NEXT:    [[ADD25:%.*]] = add nuw i32 [[BASE]], 6101; CHECK-NEXT:    [[ZEXT25:%.*]] = zext i32 [[ADD25]] to i64102; CHECK-NEXT:    [[GEP25:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[ARG1]], i64 [[ZEXT25]]103; CHECK-NEXT:    [[LOAD25:%.*]] = load i32, ptr addrspace(1) [[GEP25]], align 4104; CHECK-NEXT:    [[ADD3:%.*]] = add nuw i32 [[BASE]], 8105; CHECK-NEXT:    [[ZEXT3:%.*]] = zext i32 [[ADD3]] to i64106; CHECK-NEXT:    [[GEP3:%.*]] = getelementptr inbounds i8, ptr addrspace(1) [[ARG1]], i64 [[ZEXT3]]107; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i32>, ptr addrspace(1) [[GEP3]], align 4108; CHECK-NEXT:    [[LOAD33:%.*]] = extractelement <2 x i32> [[TMP2]], i32 0109; CHECK-NEXT:    [[LOAD44:%.*]] = extractelement <2 x i32> [[TMP2]], i32 1110; CHECK-NEXT:    ret void111;112  %add1 = add nuw i32 %base, 0113  %zext1 = zext i32 %add1 to i64114  %gep1 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext1115  %load1 = load i32, ptr addrspace(1) %gep1, align 4116  %add2 = add nuw i32 %base, 4117  %zext2 = zext i32 %add2 to i64118  %gep2 = getelementptr inbounds i8,ptr addrspace(1) %arg1, i64 %zext2119  %load2 = load i32, ptr addrspace(1) %gep2, align 4120 121  ; A load with 2-byte overlap breaks continuity.122  %add25 = add nuw i32 %base, 6123  %zext25 = zext i32 %add25 to i64124  %gep25 = getelementptr inbounds i8,ptr addrspace(1) %arg1, i64 %zext25125  %load25 = load i32, ptr addrspace(1) %gep25, align 4126 127  %add3 = add nuw i32 %base, 8128  %zext3 = zext i32 %add3 to i64129  %gep3 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext3130  %load3 = load i32, ptr addrspace(1) %gep3, align 4131  %add4 = add nuw i32 %base, 12132  %zext4 = zext i32 %add4 to i64133  %gep4 = getelementptr inbounds i8, ptr addrspace(1) %arg1, i64 %zext4134  %load4 = load i32, ptr addrspace(1) %gep4, align 4135  ret void136}137