xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/vector-gep.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-linux -mcpu=corei7-avx | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -instsimplify -disable-output < %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP0:
5*9880d681SAndroid Build Coastguard Workerdefine <4 x i32*> @AGEP0(i32* %ptr) nounwind {
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP0
8*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcast
9*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpaddd
10*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: ret
11*9880d681SAndroid Build Coastguard Worker  %vecinit.i = insertelement <4 x i32*> undef, i32* %ptr, i32 0
12*9880d681SAndroid Build Coastguard Worker  %vecinit2.i = insertelement <4 x i32*> %vecinit.i, i32* %ptr, i32 1
13*9880d681SAndroid Build Coastguard Worker  %vecinit4.i = insertelement <4 x i32*> %vecinit2.i, i32* %ptr, i32 2
14*9880d681SAndroid Build Coastguard Worker  %vecinit6.i = insertelement <4 x i32*> %vecinit4.i, i32* %ptr, i32 3
15*9880d681SAndroid Build Coastguard Worker  %A2 = getelementptr i32, <4 x i32*> %vecinit6.i, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
16*9880d681SAndroid Build Coastguard Worker  %A3 = getelementptr i32, <4 x i32*> %A2, <4 x i32> <i32 10, i32 14, i32 19, i32 233>
17*9880d681SAndroid Build Coastguard Worker  ret <4 x i32*> %A3
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP1:
21*9880d681SAndroid Build Coastguard Workerdefine i32 @AGEP1(<4 x i32*> %param) nounwind {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP1
24*9880d681SAndroid Build Coastguard Worker;CHECK: vpaddd
25*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpextrd
26*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: movl
27*9880d681SAndroid Build Coastguard Worker  %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> <i32 1, i32 2, i32 3, i32 4>
28*9880d681SAndroid Build Coastguard Worker  %k = extractelement <4 x i32*> %A2, i32 3
29*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %k
30*9880d681SAndroid Build Coastguard Worker  ret i32 %v
31*9880d681SAndroid Build Coastguard Worker;CHECK: ret
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP2:
35*9880d681SAndroid Build Coastguard Workerdefine i32 @AGEP2(<4 x i32*> %param, <4 x i32> %off) nounwind {
36*9880d681SAndroid Build Coastguard Workerentry:
37*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP2
38*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld $2
39*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd
40*9880d681SAndroid Build Coastguard Worker  %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> %off
41*9880d681SAndroid Build Coastguard Worker  %k = extractelement <4 x i32*> %A2, i32 3
42*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %k
43*9880d681SAndroid Build Coastguard Worker  ret i32 %v
44*9880d681SAndroid Build Coastguard Worker;CHECK: ret
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP3:
48*9880d681SAndroid Build Coastguard Workerdefine <4 x i32*> @AGEP3(<4 x i32*> %param, <4 x i32> %off) nounwind {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP3
51*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld $2
52*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd
53*9880d681SAndroid Build Coastguard Worker  %A2 = getelementptr i32, <4 x i32*> %param, <4 x i32> %off
54*9880d681SAndroid Build Coastguard Worker  %v = alloca i32
55*9880d681SAndroid Build Coastguard Worker  %k = insertelement <4 x i32*> %A2, i32* %v, i32 3
56*9880d681SAndroid Build Coastguard Worker  ret <4 x i32*> %k
57*9880d681SAndroid Build Coastguard Worker;CHECK: ret
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP4:
61*9880d681SAndroid Build Coastguard Workerdefine <4 x i16*> @AGEP4(<4 x i16*> %param, <4 x i32> %off) nounwind {
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP4
64*9880d681SAndroid Build Coastguard Worker; Multiply offset by two (add it to itself).
65*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd
66*9880d681SAndroid Build Coastguard Worker; add the base to the offset
67*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd
68*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i16, <4 x i16*> %param, <4 x i32> %off
69*9880d681SAndroid Build Coastguard Worker  ret <4 x i16*> %A
70*9880d681SAndroid Build Coastguard Worker;CHECK: ret
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP5:
74*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP5(<4 x i8*> %param, <4 x i8> %off) nounwind {
75*9880d681SAndroid Build Coastguard Workerentry:
76*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP5
77*9880d681SAndroid Build Coastguard Worker;CHECK: vpaddd
78*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i8, <4 x i8*> %param, <4 x i8> %off
79*9880d681SAndroid Build Coastguard Worker  ret <4 x i8*> %A
80*9880d681SAndroid Build Coastguard Worker;CHECK: ret
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; The size of each element is 1 byte. No need to multiply by element size.
85*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP6:
86*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP6(<4 x i8*> %param, <4 x i32> %off) nounwind {
87*9880d681SAndroid Build Coastguard Workerentry:
88*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP6
89*9880d681SAndroid Build Coastguard Worker;CHECK-NOT: pslld
90*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i8, <4 x i8*> %param, <4 x i32> %off
91*9880d681SAndroid Build Coastguard Worker  ret <4 x i8*> %A
92*9880d681SAndroid Build Coastguard Worker;CHECK: ret
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP7:
96*9880d681SAndroid Build Coastguard Workerdefine <4 x i8*> @AGEP7(<4 x i8*> %param, i32 %off) nounwind {
97*9880d681SAndroid Build Coastguard Workerentry:
98*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss
99*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd
100*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i8, <4 x i8*> %param, i32 %off
101*9880d681SAndroid Build Coastguard Worker  ret <4 x i8*> %A
102*9880d681SAndroid Build Coastguard Worker;CHECK: ret
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP8:
106*9880d681SAndroid Build Coastguard Workerdefine <4 x i16*> @AGEP8(i16* %param, <4 x i32> %off) nounwind {
107*9880d681SAndroid Build Coastguard Workerentry:
108*9880d681SAndroid Build Coastguard Worker; Multiply offset by two (add it to itself).
109*9880d681SAndroid Build Coastguard Worker;CHECK: vpadd
110*9880d681SAndroid Build Coastguard Worker; add the base to the offset
111*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss
112*9880d681SAndroid Build Coastguard Worker;CHECK-NEXT: vpadd
113*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i16, i16* %param, <4 x i32> %off
114*9880d681SAndroid Build Coastguard Worker  ret <4 x i16*> %A
115*9880d681SAndroid Build Coastguard Worker;CHECK: ret
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: AGEP9:
119*9880d681SAndroid Build Coastguard Workerdefine <64 x i16*> @AGEP9(i16* %param, <64 x i32> %off) nounwind {
120*9880d681SAndroid Build Coastguard Workerentry:
121*9880d681SAndroid Build Coastguard Worker;CHECK: vbroadcastss
122*9880d681SAndroid Build Coastguard Worker  %A = getelementptr i16, i16* %param, <64 x i32> %off
123*9880d681SAndroid Build Coastguard Worker  ret <64 x i16*> %A
124*9880d681SAndroid Build Coastguard Worker;CHECK: ret
125*9880d681SAndroid Build Coastguard Worker}
126