1 ; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa %s | FileCheck -check-prefixes=GCN,CI %s
2 ; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=fiji %s | FileCheck -check-prefixes=GCN,GFX89 %s
3 ; RUN: opt -cost-model -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=gfx900 %s | FileCheck -check-prefixes=GCN,GFX89 %s
4 ; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa %s | FileCheck -check-prefixes=GCN,CI %s
5 ; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=fiji %s | FileCheck -check-prefixes=GCN,GFX89 %s
6 ; RUN: opt -cost-model -cost-kind=code-size -analyze -mtriple=amdgcn-unknown-amdhsa -mcpu=gfx900 %s | FileCheck -check-prefixes=GCN,GFX89 %s
9 ; GCN: 'extractelement_v2i32'
10 ; GCN: estimated cost of 0 for {{.*}} extractelement <2 x i32>
11 define amdgpu_kernel void @extractelement_v2i32(i32 addrspace(1)* %out, <2 x i32> addrspace(1)* %vaddr) {
12 %vec = load <2 x i32>, <2 x i32> addrspace(1)* %vaddr
13 %elt = extractelement <2 x i32> %vec, i32 1
14 store i32 %elt, i32 addrspace(1)* %out
18 ; GCN: 'extractelement_v2f32'
19 ; GCN: estimated cost of 0 for {{.*}} extractelement <2 x float>
20 define amdgpu_kernel void @extractelement_v2f32(float addrspace(1)* %out, <2 x float> addrspace(1)* %vaddr) {
21 %vec = load <2 x float>, <2 x float> addrspace(1)* %vaddr
22 %elt = extractelement <2 x float> %vec, i32 1
23 store float %elt, float addrspace(1)* %out
27 ; GCN: 'extractelement_v3i32'
28 ; GCN: estimated cost of 0 for {{.*}} extractelement <3 x i32>
29 define amdgpu_kernel void @extractelement_v3i32(i32 addrspace(1)* %out, <3 x i32> addrspace(1)* %vaddr) {
30 %vec = load <3 x i32>, <3 x i32> addrspace(1)* %vaddr
31 %elt = extractelement <3 x i32> %vec, i32 1
32 store i32 %elt, i32 addrspace(1)* %out
36 ; GCN: 'extractelement_v4i32'
37 ; GCN: estimated cost of 0 for {{.*}} extractelement <4 x i32>
38 define amdgpu_kernel void @extractelement_v4i32(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %vaddr) {
39 %vec = load <4 x i32>, <4 x i32> addrspace(1)* %vaddr
40 %elt = extractelement <4 x i32> %vec, i32 1
41 store i32 %elt, i32 addrspace(1)* %out
45 ; GCN: 'extractelement_v5i32'
46 ; GCN: estimated cost of 0 for {{.*}} extractelement <5 x i32>
47 define amdgpu_kernel void @extractelement_v5i32(i32 addrspace(1)* %out, <5 x i32> addrspace(1)* %vaddr) {
48 %vec = load <5 x i32>, <5 x i32> addrspace(1)* %vaddr
49 %elt = extractelement <5 x i32> %vec, i32 1
50 store i32 %elt, i32 addrspace(1)* %out
54 ; GCN: 'extractelement_v8i32'
55 ; GCN: estimated cost of 0 for {{.*}} extractelement <8 x i32>
56 define amdgpu_kernel void @extractelement_v8i32(i32 addrspace(1)* %out, <8 x i32> addrspace(1)* %vaddr) {
57 %vec = load <8 x i32>, <8 x i32> addrspace(1)* %vaddr
58 %elt = extractelement <8 x i32> %vec, i32 1
59 store i32 %elt, i32 addrspace(1)* %out
63 ; FIXME: Should be non-0
64 ; GCN: 'extractelement_v8i32_dynindex'
65 ; GCN: estimated cost of 2 for {{.*}} extractelement <8 x i32>
66 define amdgpu_kernel void @extractelement_v8i32_dynindex(i32 addrspace(1)* %out, <8 x i32> addrspace(1)* %vaddr, i32 %idx) {
67 %vec = load <8 x i32>, <8 x i32> addrspace(1)* %vaddr
68 %elt = extractelement <8 x i32> %vec, i32 %idx
69 store i32 %elt, i32 addrspace(1)* %out
73 ; GCN: 'extractelement_v2i64'
74 ; GCN: estimated cost of 0 for {{.*}} extractelement <2 x i64>
75 define amdgpu_kernel void @extractelement_v2i64(i64 addrspace(1)* %out, <2 x i64> addrspace(1)* %vaddr) {
76 %vec = load <2 x i64>, <2 x i64> addrspace(1)* %vaddr
77 %elt = extractelement <2 x i64> %vec, i64 1
78 store i64 %elt, i64 addrspace(1)* %out
82 ; GCN: 'extractelement_v3i64'
83 ; GCN: estimated cost of 0 for {{.*}} extractelement <3 x i64>
84 define amdgpu_kernel void @extractelement_v3i64(i64 addrspace(1)* %out, <3 x i64> addrspace(1)* %vaddr) {
85 %vec = load <3 x i64>, <3 x i64> addrspace(1)* %vaddr
86 %elt = extractelement <3 x i64> %vec, i64 1
87 store i64 %elt, i64 addrspace(1)* %out
91 ; GCN: 'extractelement_v4i64'
92 ; GCN: estimated cost of 0 for {{.*}} extractelement <4 x i64>
93 define amdgpu_kernel void @extractelement_v4i64(i64 addrspace(1)* %out, <4 x i64> addrspace(1)* %vaddr) {
94 %vec = load <4 x i64>, <4 x i64> addrspace(1)* %vaddr
95 %elt = extractelement <4 x i64> %vec, i64 1
96 store i64 %elt, i64 addrspace(1)* %out
100 ; GCN: 'extractelement_v8i64'
101 ; GCN: estimated cost of 0 for {{.*}} extractelement <8 x i64>
102 define amdgpu_kernel void @extractelement_v8i64(i64 addrspace(1)* %out, <8 x i64> addrspace(1)* %vaddr) {
103 %vec = load <8 x i64>, <8 x i64> addrspace(1)* %vaddr
104 %elt = extractelement <8 x i64> %vec, i64 1
105 store i64 %elt, i64 addrspace(1)* %out
109 ; GCN: 'extractelement_v4i8'
110 ; GCN: estimated cost of 1 for {{.*}} extractelement <4 x i8>
111 define amdgpu_kernel void @extractelement_v4i8(i8 addrspace(1)* %out, <4 x i8> addrspace(1)* %vaddr) {
112 %vec = load <4 x i8>, <4 x i8> addrspace(1)* %vaddr
113 %elt = extractelement <4 x i8> %vec, i8 1
114 store i8 %elt, i8 addrspace(1)* %out
118 ; GCN: 'extractelement_0_v2i16':
119 ; CI: estimated cost of 1 for {{.*}} extractelement <2 x i16> %vec, i16 0
120 ; GFX89: estimated cost of 0 for {{.*}} extractelement <2 x i16>
121 define amdgpu_kernel void @extractelement_0_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr) {
122 %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
123 %elt = extractelement <2 x i16> %vec, i16 0
124 store i16 %elt, i16 addrspace(1)* %out
128 ; GCN: 'extractelement_1_v2i16':
129 ; GCN: estimated cost of 1 for {{.*}} extractelement <2 x i16>
130 define amdgpu_kernel void @extractelement_1_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr) {
131 %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
132 %elt = extractelement <2 x i16> %vec, i16 1
133 store i16 %elt, i16 addrspace(1)* %out
137 ; GCN: 'extractelement_var_v2i16'
138 ; GCN: estimated cost of 1 for {{.*}} extractelement <2 x i16>
139 define amdgpu_kernel void @extractelement_var_v2i16(i16 addrspace(1)* %out, <2 x i16> addrspace(1)* %vaddr, i32 %idx) {
140 %vec = load <2 x i16>, <2 x i16> addrspace(1)* %vaddr
141 %elt = extractelement <2 x i16> %vec, i32 %idx
142 store i16 %elt, i16 addrspace(1)* %out