brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.4 KiB · 3d8f199 Raw
153 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes='function(scalarizer)' %s | FileCheck %s3 4; Check that the scalarizer can handle vector GEPs with scalar indices5 6@vec = global <4 x ptr> <ptr null, ptr null, ptr null, ptr null>7@index = global i16 18@ptr = global [4 x i16] [i16 1, i16 2, i16 3, i16 4]9@ptrptr = global ptr null10 11; constant index12define void @test1() {13; CHECK-LABEL: @test1(14; CHECK-NEXT:  bb:15; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x ptr>, ptr @vec, align 3216; CHECK-NEXT:    [[DOTI0:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 017; CHECK-NEXT:    [[DOTI01:%.*]] = getelementptr i16, ptr [[DOTI0]], i16 118; CHECK-NEXT:    [[DOTI1:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 119; CHECK-NEXT:    [[DOTI12:%.*]] = getelementptr i16, ptr [[DOTI1]], i16 120; CHECK-NEXT:    [[DOTI2:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 221; CHECK-NEXT:    [[DOTI23:%.*]] = getelementptr i16, ptr [[DOTI2]], i16 122; CHECK-NEXT:    [[DOTI3:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 323; CHECK-NEXT:    [[DOTI34:%.*]] = getelementptr i16, ptr [[DOTI3]], i16 124; CHECK-NEXT:    ret void25;26bb:27  %0 = load <4 x ptr>, ptr @vec28  %1 = getelementptr i16, <4 x ptr> %0, i16 129 30  ret void31}32 33; non-constant index34define void @test2() {35; CHECK-LABEL: @test2(36; CHECK-NEXT:  bb:37; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x ptr>, ptr @vec, align 3238; CHECK-NEXT:    [[DOTI0:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 039; CHECK-NEXT:    [[DOTI1:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 140; CHECK-NEXT:    [[DOTI2:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 241; CHECK-NEXT:    [[DOTI3:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 342; CHECK-NEXT:    [[INDEX:%.*]] = load i16, ptr @index, align 243; CHECK-NEXT:    [[DOTI01:%.*]] = getelementptr i16, ptr [[DOTI0]], i16 [[INDEX]]44; CHECK-NEXT:    [[DOTI12:%.*]] = getelementptr i16, ptr [[DOTI1]], i16 [[INDEX]]45; CHECK-NEXT:    [[DOTI23:%.*]] = getelementptr i16, ptr [[DOTI2]], i16 [[INDEX]]46; CHECK-NEXT:    [[DOTI34:%.*]] = getelementptr i16, ptr [[DOTI3]], i16 [[INDEX]]47; CHECK-NEXT:    ret void48;49bb:50  %0 = load <4 x ptr>, ptr @vec51  %index = load i16, ptr @index52  %1 = getelementptr i16, <4 x ptr> %0, i16 %index53 54  ret void55}56 57; Check that the scalarizer can handle vector GEPs with scalar pointer58 59; constant pointer60define <4 x ptr> @test3_constexpr() {61; CHECK-LABEL: @test3_constexpr(62; CHECK-NEXT:  bb:63; CHECK-NEXT:    ret <4 x ptr> getelementptr (i16, ptr @ptr, <4 x i64> <i64 0, i64 1, i64 2, i64 3>)64;65bb:66  ret <4 x ptr> getelementptr (i16, ptr @ptr, <4 x i64> <i64 0, i64 1, i64 2, i64 3>)67}68 69 70define <4 x ptr> @test3_constbase(i16 %idx) {71; CHECK-LABEL: @test3_constbase(72; CHECK-NEXT:  bb:73; CHECK-NEXT:    [[OFFSET:%.*]] = getelementptr [4 x i16], ptr @ptr, i16 0, i16 [[IDX:%.*]]74; CHECK-NEXT:    [[GEP_I0:%.*]] = getelementptr i16, ptr [[OFFSET]], i16 075; CHECK-NEXT:    [[GEP_I1:%.*]] = getelementptr i16, ptr [[OFFSET]], i16 176; CHECK-NEXT:    [[GEP_I2:%.*]] = getelementptr i16, ptr [[OFFSET]], i16 277; CHECK-NEXT:    [[GEP_I3:%.*]] = getelementptr i16, ptr [[OFFSET]], i16 378; CHECK-NEXT:    [[GEP_UPTO0:%.*]] = insertelement <4 x ptr> poison, ptr [[GEP_I0]], i64 079; CHECK-NEXT:    [[GEP_UPTO1:%.*]] = insertelement <4 x ptr> [[GEP_UPTO0]], ptr [[GEP_I1]], i64 180; CHECK-NEXT:    [[GEP_UPTO2:%.*]] = insertelement <4 x ptr> [[GEP_UPTO1]], ptr [[GEP_I2]], i64 281; CHECK-NEXT:    [[GEP:%.*]] = insertelement <4 x ptr> [[GEP_UPTO2]], ptr [[GEP_I3]], i64 382; CHECK-NEXT:    ret <4 x ptr> [[GEP]]83;84bb:85  %offset = getelementptr [4 x i16], ptr @ptr, i16 0, i16 %idx86  %gep = getelementptr i16, ptr %offset, <4 x i16> <i16 0, i16 1, i16 2, i16 3>87  ret <4 x ptr> %gep88}89 90; Constant pointer with a variable vector offset91define <4 x ptr> @test3_varoffset(<4 x i16> %offset) {92; CHECK-LABEL: @test3_varoffset(93; CHECK-NEXT:  bb:94; CHECK-NEXT:    [[OFFSET_I0:%.*]] = extractelement <4 x i16> [[OFFSET:%.*]], i64 095; CHECK-NEXT:    [[GEP_I0:%.*]] = getelementptr i16, ptr @ptr, i16 [[OFFSET_I0]]96; CHECK-NEXT:    [[OFFSET_I1:%.*]] = extractelement <4 x i16> [[OFFSET]], i64 197; CHECK-NEXT:    [[GEP_I1:%.*]] = getelementptr i16, ptr @ptr, i16 [[OFFSET_I1]]98; CHECK-NEXT:    [[OFFSET_I2:%.*]] = extractelement <4 x i16> [[OFFSET]], i64 299; CHECK-NEXT:    [[GEP_I2:%.*]] = getelementptr i16, ptr @ptr, i16 [[OFFSET_I2]]100; CHECK-NEXT:    [[OFFSET_I3:%.*]] = extractelement <4 x i16> [[OFFSET]], i64 3101; CHECK-NEXT:    [[GEP_I3:%.*]] = getelementptr i16, ptr @ptr, i16 [[OFFSET_I3]]102; CHECK-NEXT:    [[GEP_UPTO0:%.*]] = insertelement <4 x ptr> poison, ptr [[GEP_I0]], i64 0103; CHECK-NEXT:    [[GEP_UPTO1:%.*]] = insertelement <4 x ptr> [[GEP_UPTO0]], ptr [[GEP_I1]], i64 1104; CHECK-NEXT:    [[GEP_UPTO2:%.*]] = insertelement <4 x ptr> [[GEP_UPTO1]], ptr [[GEP_I2]], i64 2105; CHECK-NEXT:    [[GEP:%.*]] = insertelement <4 x ptr> [[GEP_UPTO2]], ptr [[GEP_I3]], i64 3106; CHECK-NEXT:    ret <4 x ptr> [[GEP]]107;108bb:109  %gep = getelementptr i16, ptr @ptr, <4 x i16> %offset110  ret <4 x ptr> %gep111}112 113; non-constant pointer114define void @test4() {115; CHECK-LABEL: @test4(116; CHECK-NEXT:  bb:117; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr @ptrptr, align 8118; CHECK-NEXT:    [[DOTI0:%.*]] = getelementptr i16, ptr [[TMP0]], i16 0119; CHECK-NEXT:    [[DOTI1:%.*]] = getelementptr i16, ptr [[TMP0]], i16 1120; CHECK-NEXT:    [[DOTI2:%.*]] = getelementptr i16, ptr [[TMP0]], i16 2121; CHECK-NEXT:    [[DOTI3:%.*]] = getelementptr i16, ptr [[TMP0]], i16 3122; CHECK-NEXT:    ret void123;124bb:125  %0 = load ptr, ptr @ptrptr126  %1 = getelementptr i16, ptr %0, <4 x i16> <i16 0, i16 1, i16 2, i16 3>127 128  ret void129}130 131; constant index, inbounds132define void @test5() {133; CHECK-LABEL: @test5(134; CHECK-NEXT:  bb:135; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x ptr>, ptr @vec, align 32136; CHECK-NEXT:    [[DOTI0:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 0137; CHECK-NEXT:    [[DOTI01:%.*]] = getelementptr inbounds i16, ptr [[DOTI0]], i16 1138; CHECK-NEXT:    [[DOTI1:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 1139; CHECK-NEXT:    [[DOTI12:%.*]] = getelementptr inbounds i16, ptr [[DOTI1]], i16 1140; CHECK-NEXT:    [[DOTI2:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 2141; CHECK-NEXT:    [[DOTI23:%.*]] = getelementptr inbounds i16, ptr [[DOTI2]], i16 1142; CHECK-NEXT:    [[DOTI3:%.*]] = extractelement <4 x ptr> [[TMP0]], i64 3143; CHECK-NEXT:    [[DOTI34:%.*]] = getelementptr inbounds i16, ptr [[DOTI3]], i16 1144; CHECK-NEXT:    ret void145;146bb:147  %0 = load <4 x ptr>, ptr @vec148  %1 = getelementptr inbounds i16, <4 x ptr> %0, i16 1149 150  ret void151}152 153