xref: /llvm-project/llvm/test/Transforms/InstCombine/gep-vector-indices.ll (revision 462cb3cd6cecd0511ecaf0e3ebcaba455ece587d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instcombine %s -S | FileCheck %s
3; RUN: opt -passes=instcombine -use-constant-int-for-fixed-length-splat %s -S | FileCheck %s
4
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 16
8; 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 0
12  ret ptr %res
13}
14
15define ptr @vector_splat_indices_nxv2i64_ext0(ptr %a) {
16; CHECK-LABEL: @vector_splat_indices_nxv2i64_ext0(
17; CHECK-NEXT:    [[RES:%.*]] = getelementptr inbounds nuw i8, ptr [[A:%.*]], i64 16
18; CHECK-NEXT:    ret ptr [[RES]]
19;
20  %tmp = insertelement <vscale x 2 x i64> poison, i64 4, i32 0
21  %splatof4 = shufflevector <vscale x 2 x i64> %tmp, <vscale x 2 x i64> poison, <vscale x 2 x i32> zeroinitializer
22  %gep = getelementptr inbounds i32, ptr %a, <vscale x 2 x i64> %splatof4
23  %res = extractelement <vscale x 2 x ptr> %gep, i32 0
24  ret ptr %res
25}
26
27define ptr @vector_indices_v2i64_ext0(ptr %a, <2 x i64> %indices) {
28; CHECK-LABEL: @vector_indices_v2i64_ext0(
29; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i64> [[INDICES:%.*]], i64 0
30; CHECK-NEXT:    [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[TMP1]]
31; CHECK-NEXT:    ret ptr [[RES]]
32;
33  %gep = getelementptr i32, ptr %a, <2 x i64> %indices
34  %res = extractelement <2 x ptr> %gep, i32 0
35  ret ptr %res
36}
37
38define ptr @vector_indices_nxv1i64_ext0(ptr %a, <vscale x 1 x i64> %indices) {
39; CHECK-LABEL: @vector_indices_nxv1i64_ext0(
40; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <vscale x 1 x i64> [[INDICES:%.*]], i64 0
41; CHECK-NEXT:    [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[TMP1]]
42; CHECK-NEXT:    ret ptr [[RES]]
43;
44  %gep = getelementptr i32, ptr %a, <vscale x 1 x i64> %indices
45  %res = extractelement <vscale x 1 x ptr> %gep, i32 0
46  ret ptr %res
47}
48
49
50define ptr @vector_splat_ptrs_v2i64_ext0(ptr %a, i64 %index) {
51; CHECK-LABEL: @vector_splat_ptrs_v2i64_ext0(
52; CHECK-NEXT:    [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[INDEX:%.*]]
53; CHECK-NEXT:    ret ptr [[RES]]
54;
55  %tmp = insertelement <2 x ptr> poison, ptr %a, i32 0
56  %splatofa = shufflevector <2 x ptr> %tmp, <2 x ptr> poison, <2 x i32> zeroinitializer
57  %gep = getelementptr i32, <2 x ptr> %splatofa, i64 %index
58  %res = extractelement <2 x ptr> %gep, i32 0
59  ret ptr %res
60}
61
62
63define ptr @vector_splat_ptrs_nxv2i64_ext0(ptr %a, i64 %index) {
64; CHECK-LABEL: @vector_splat_ptrs_nxv2i64_ext0(
65; CHECK-NEXT:    [[RES:%.*]] = getelementptr i32, ptr [[A:%.*]], i64 [[INDEX:%.*]]
66; CHECK-NEXT:    ret ptr [[RES]]
67;
68  %tmp = insertelement <vscale x 2 x ptr> poison, ptr %a, i32 0
69  %splatofa = shufflevector <vscale x 2 x ptr> %tmp, <vscale x 2 x ptr> poison, <vscale x 2 x i32> zeroinitializer
70  %gep = getelementptr i32, <vscale x 2 x ptr> %splatofa, i64 %index
71  %res = extractelement <vscale x 2 x ptr> %gep, i32 0
72  ret ptr %res
73}
74
75
76define ptr @vector_struct1_splat_indices_v4i64_ext1(ptr %a) {
77; CHECK-LABEL: @vector_struct1_splat_indices_v4i64_ext1(
78; CHECK-NEXT:    [[RES:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 32
79; CHECK-NEXT:    ret ptr [[RES]]
80;
81  %gep = getelementptr {float, float}, ptr %a, <4 x i32> <i32 4, i32 4, i32 4, i32 4>, i32 0
82  %res = extractelement <4 x ptr> %gep, i32 1
83  ret ptr %res
84}
85
86
87define ptr @vector_struct2_splat_indices_v4i64_ext1(ptr %a) {
88; CHECK-LABEL: @vector_struct2_splat_indices_v4i64_ext1(
89; CHECK-NEXT:    [[RES:%.*]] = getelementptr i8, ptr [[A:%.*]], i64 92
90; CHECK-NEXT:    ret ptr [[RES]]
91;
92  %gep = getelementptr {float, [8 x float]}, ptr %a, i32 2, i32 1, <4 x i32> <i32 4, i32 4, i32 4, i32 4>
93  %res = extractelement <4 x ptr> %gep, i32 1
94  ret ptr %res
95}
96
97
98; Negative tests
99
100define ptr @vector_indices_nxv2i64_ext3(ptr %a, <vscale x 2 x i64> %indices) {
101; CHECK-LABEL: @vector_indices_nxv2i64_ext3(
102; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]
103; CHECK-NEXT:    [[RES:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 3
104; CHECK-NEXT:    ret ptr [[RES]]
105;
106  %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices
107  %res = extractelement <vscale x 2 x ptr> %gep, i32 3
108  ret ptr %res
109}
110
111define ptr @vector_indices_nxv2i64_extN(ptr %a, <vscale x 2 x i64> %indices, i32 %N) {
112; CHECK-LABEL: @vector_indices_nxv2i64_extN(
113; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]
114; CHECK-NEXT:    [[RES:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i32 [[N:%.*]]
115; CHECK-NEXT:    ret ptr [[RES]]
116;
117  %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices
118  %res = extractelement <vscale x 2 x ptr> %gep, i32 %N
119  ret ptr %res
120}
121
122define void @vector_indices_nxv2i64_mulitple_use(ptr %a, <vscale x 2 x i64> %indices, ptr %b, ptr %c) {
123; CHECK-LABEL: @vector_indices_nxv2i64_mulitple_use(
124; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, ptr [[A:%.*]], <vscale x 2 x i64> [[INDICES:%.*]]
125; CHECK-NEXT:    [[LANE0:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 0
126; CHECK-NEXT:    [[LANE1:%.*]] = extractelement <vscale x 2 x ptr> [[GEP]], i64 1
127; CHECK-NEXT:    store ptr [[LANE0]], ptr [[B:%.*]], align 8
128; CHECK-NEXT:    store ptr [[LANE1]], ptr [[C:%.*]], align 8
129; CHECK-NEXT:    ret void
130;
131  %gep = getelementptr i32, ptr %a, <vscale x 2 x i64> %indices
132  %lane0 = extractelement <vscale x 2 x ptr> %gep, i32 0
133  %lane1 = extractelement <vscale x 2 x ptr> %gep, i32 1
134  store ptr %lane0, ptr %b, align 8
135  store ptr %lane1, ptr %c, align 8
136  ret void
137}
138
139define ptr @vector_ptrs_and_indices_ext0(<vscale x 4 x ptr> %a, <vscale x 4 x i64> %indices) {
140; CHECK-LABEL: @vector_ptrs_and_indices_ext0(
141; CHECK-NEXT:    [[GEP:%.*]] = getelementptr i32, <vscale x 4 x ptr> [[A:%.*]], <vscale x 4 x i64> [[INDICES:%.*]]
142; CHECK-NEXT:    [[RES:%.*]] = extractelement <vscale x 4 x ptr> [[GEP]], i64 0
143; CHECK-NEXT:    ret ptr [[RES]]
144;
145  %gep = getelementptr i32, <vscale x 4 x ptr> %a, <vscale x 4 x i64> %indices
146  %res = extractelement <vscale x 4 x ptr> %gep, i32 0
147  ret ptr %res
148}
149