173 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=instcombine %s -S | FileCheck %s3; RUN: opt -passes=instcombine -use-constant-int-for-fixed-length-splat %s -S | FileCheck %s4 5define ptr @vector_splat_indices_v2i64_ext0(ptr %a) {6; CHECK-LABEL: @vector_splat_indices_v2i64_ext0(7; CHECK-NEXT: [[RES:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 168; CHECK-NEXT: ret ptr [[RES]]9;10 %gep = getelementptr i32, ptr %a, <2 x i64> <i64 4, i64 4>11 %res = extractelement <2 x ptr> %gep, i32 012 ret ptr %res13}14 15define ptr @vector_splat_indices_nxv2i64_ext0_inbounds(ptr %a) {16; CHECK-LABEL: @vector_splat_indices_nxv2i64_ext0_inbounds(17; CHECK-NEXT: [[RES:%.*]] = getelementptr inbounds nuw i8, ptr [[A:%.*]], i64 1618; CHECK-NEXT: ret ptr [[RES]]19;20 %tmp = insertelement <vscale x 2 x i64> poison, i64 4, i32 021 %splatof4 = shufflevector <vscale x 2 x i64> %tmp, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer22 %gep = getelementptr inbounds i32, ptr %a, <vscale x 2 x i64> %splatof423 %res = extractelement <vscale x 2 x ptr> %gep, i32 024 ret ptr %res25}26 27define ptr @vector_splat_indices_nxv2i64_ext0_nuw(ptr %a) {28; CHECK-LABEL: @vector_splat_indices_nxv2i64_ext0_nuw(29; CHECK-NEXT: [[RES:%.*]] = getelementptr nuw i8, ptr [[A:%.*]], i64 1630; CHECK-NEXT: ret ptr [[RES]]31;32 %tmp = insertelement <vscale x 2 x i64> poison, i64 4, i32 033 %splatof4 = shufflevector <vscale x 2 x i64> %tmp, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer34 %gep = getelementptr nuw i32, ptr %a, <vscale x 2 x i64> %splatof435 %res = extractelement <vscale x 2 x ptr> %gep, i32 036 ret ptr %res37}38 39define ptr @vector_splat_indices_nxv2i64_ext0_nusw(ptr %a) {40; CHECK-LABEL: @vector_splat_indices_nxv2i64_ext0_nusw(41; CHECK-NEXT: [[RES:%.*]] = getelementptr nusw nuw i8, ptr [[A:%.*]], i64 1642; CHECK-NEXT: ret ptr [[RES]]43;44 %tmp = insertelement <vscale x 2 x i64> poison, i64 4, i32 045 %splatof4 = shufflevector <vscale x 2 x i64> %tmp, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer46 %gep = getelementptr nusw i32, ptr %a, <vscale x 2 x i64> %splatof447 %res = extractelement <vscale x 2 x ptr> %gep, i32 048 ret ptr %res49}50 51define ptr @vector_indices_v2i64_ext0(ptr %a, <2 x i64> %indices) {52; CHECK-LABEL: @vector_indices_v2i64_ext0(53; CHECK-NEXT: [[TMP1:%.*]] = extractelement <2 x i64> [[INDICES:%.*]], i64 054; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[TMP1]]55; CHECK-NEXT: ret ptr [[RES]]56;57 %gep = getelementptr i32, ptr %a, <2 x i64> %indices58 %res = extractelement <2 x ptr> %gep, i32 059 ret ptr %res60}61 62define ptr @vector_indices_nxv1i64_ext0(ptr %a, <vscale x 1 x i64> %indices) {63; CHECK-LABEL: @vector_indices_nxv1i64_ext0(64; CHECK-NEXT: [[TMP1:%.*]] = extractelement <vscale x 1 x i64> [[INDICES:%.*]], i64 065; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[TMP1]]66; CHECK-NEXT: ret ptr [[RES]]67;68 %gep = getelementptr i32, ptr %a, <vscale x 1 x i64> %indices69 %res = extractelement <vscale x 1 x ptr> %gep, i32 070 ret ptr %res71}72 73 74define ptr @vector_splat_ptrs_v2i64_ext0(ptr %a, i64 %index) {75; CHECK-LABEL: @vector_splat_ptrs_v2i64_ext0(76; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[INDEX:%.*]]77; CHECK-NEXT: ret ptr [[RES]]78;79 %tmp = insertelement <2 x ptr> poison, ptr %a, i32 080 %splatofa = shufflevector <2 x ptr> %tmp, <2 x ptr> poison, <2 x i32> zeroinitializer81 %gep = getelementptr i32, <2 x ptr> %splatofa, i64 %index82 %res = extractelement <2 x ptr> %gep, i32 083 ret ptr %res84}85 86 87define ptr @vector_splat_ptrs_nxv2i64_ext0(ptr %a, i64 %index) {88; CHECK-LABEL: @vector_splat_ptrs_nxv2i64_ext0(89; CHECK-NEXT: [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[INDEX:%.*]]90; CHECK-NEXT: ret ptr [[RES]]91;92 %tmp = insertelement <vscale x 2 x ptr> poison, ptr %a, i32 093 %splatofa = shufflevector <vscale x 2 x ptr> %tmp, <vscale x 2 x ptr> poison, <vscale x 2 x i32> zeroinitializer94 %gep = getelementptr i32, <vscale x 2 x ptr> %splatofa, i64 %index95 %res = extractelement <vscale x 2 x ptr> %gep, i32 096 ret ptr %res97}98 99 100define ptr @vector_struct1_splat_indices_v4i64_ext1(ptr %a) {101; CHECK-LABEL: @vector_struct1_splat_indices_v4i64_ext1(102; CHECK-NEXT: [[RES:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 32103; CHECK-NEXT: ret ptr [[RES]]104;105 %gep = getelementptr {float, float}, ptr %a, <4 x i32> <i32 4, i32 4, i32 4, i32 4>, i32 0106 %res = extractelement <4 x ptr> %gep, i32 1107 ret ptr %res108}109 110 111define ptr @vector_struct2_splat_indices_v4i64_ext1(ptr %a) {112; CHECK-LABEL: @vector_struct2_splat_indices_v4i64_ext1(113; CHECK-NEXT: [[RES:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 92114; CHECK-NEXT: ret ptr [[RES]]115;116 %gep = getelementptr {float, [8 x float]}, ptr %a, i32 2, i32 1, <4 x i32> <i32 4, i32 4, i32 4, i32 4>117 %res = extractelement <4 x ptr> %gep, i32 1118 ret ptr %res119}120 121 122; Negative tests123 124define ptr @vector_indices_nxv2i64_ext3(ptr %a, <vscale x 2 x i64> %indices) {125; CHECK-LABEL: @vector_indices_nxv2i64_ext3(126; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]127; CHECK-NEXT: [[RES:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 3128; CHECK-NEXT: ret ptr [[RES]]129;130 %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices131 %res = extractelement <vscale x 2 x ptr> %gep, i32 3132 ret ptr %res133}134 135define ptr @vector_indices_nxv2i64_extN(ptr %a, <vscale x 2 x i64> %indices, i32 %N) {136; CHECK-LABEL: @vector_indices_nxv2i64_extN(137; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]138; CHECK-NEXT: [[RES:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i32 [[N:%.*]]139; CHECK-NEXT: ret ptr [[RES]]140;141 %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices142 %res = extractelement <vscale x 2 x ptr> %gep, i32 %N143 ret ptr %res144}145 146define void @vector_indices_nxv2i64_mulitple_use(ptr %a, <vscale x 2 x i64> %indices, ptr %b, ptr %c) {147; CHECK-LABEL: @vector_indices_nxv2i64_mulitple_use(148; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]149; CHECK-NEXT: [[LANE0:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 0150; CHECK-NEXT: [[LANE1:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 1151; CHECK-NEXT: store ptr [[LANE0]], ptr [[B:%.*]], align 8152; CHECK-NEXT: store ptr [[LANE1]], ptr [[C:%.*]], align 8153; CHECK-NEXT: ret void154;155 %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices156 %lane0 = extractelement <vscale x 2 x ptr> %gep, i32 0157 %lane1 = extractelement <vscale x 2 x ptr> %gep, i32 1158 store ptr %lane0, ptr %b, align 8159 store ptr %lane1, ptr %c, align 8160 ret void161}162 163define ptr @vector_ptrs_and_indices_ext0(<vscale x 4 x ptr> %a, <vscale x 4 x i64> %indices) {164; CHECK-LABEL: @vector_ptrs_and_indices_ext0(165; CHECK-NEXT: [[GEP:%.*]] = getelementptr i32, <vscale x 4 x ptr> [[A:%.*]], <vscale x 4 x i64> [[INDICES:%.*]]166; CHECK-NEXT: [[RES:%.*]] = extractelement <vscale x 4 x ptr> [[GEP]], i64 0167; CHECK-NEXT: ret ptr [[RES]]168;169 %gep = getelementptr i32, <vscale x 4 x ptr> %a, <vscale x 4 x i64> %indices170 %res = extractelement <vscale x 4 x ptr> %gep, i32 0171 ret ptr %res172}173