annotate llvm/test/CodeGen/AMDGPU/select-opt.ll @ 206:f17a3b42b08b

Added tag before-12 for changeset b7591485f4cd
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 07 Jun 2021 21:25:57 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 ; Make sure to test with f32 and i32 compares. If we have to use float
anatofuz
parents:
diff changeset
4 ; compares, we always have multiple condition registers. If we can do
anatofuz
parents:
diff changeset
5 ; scalar compares, we don't want to use multiple condition registers.
anatofuz
parents:
diff changeset
6
anatofuz
parents:
diff changeset
7 ; GCN-LABEL: {{^}}opt_select_i32_and_cmp_i32:
anatofuz
parents:
diff changeset
8 ; GCN-DAG: v_cmp_ne_u32_e32 vcc,
anatofuz
parents:
diff changeset
9 ; GCN-DAG: v_cmp_ne_u32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
10 ; GCN: s_and_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
11 ; GCN: v_cndmask_b32_e32 [[RESULT:v[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
12 ; GCN-NOT: [[RESULT]]
anatofuz
parents:
diff changeset
13 ; GCN: buffer_store_dword [[RESULT]]
anatofuz
parents:
diff changeset
14 define amdgpu_kernel void @opt_select_i32_and_cmp_i32(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i32 %x, i32 %y) #0 {
anatofuz
parents:
diff changeset
15 %icmp0 = icmp ne i32 %a, %b
anatofuz
parents:
diff changeset
16 %icmp1 = icmp ne i32 %a, %c
anatofuz
parents:
diff changeset
17 %and = and i1 %icmp0, %icmp1
anatofuz
parents:
diff changeset
18 %select = select i1 %and, i32 %x, i32 %y
anatofuz
parents:
diff changeset
19 store i32 %select, i32 addrspace(1)* %out
anatofuz
parents:
diff changeset
20 ret void
anatofuz
parents:
diff changeset
21 }
anatofuz
parents:
diff changeset
22
anatofuz
parents:
diff changeset
23 ; GCN-LABEL: {{^}}opt_select_i32_and_cmp_f32:
anatofuz
parents:
diff changeset
24 ; GCN-DAG: v_cmp_lg_f32_e32 vcc
anatofuz
parents:
diff changeset
25 ; GCN-DAG: v_cmp_lg_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
26 ; GCN: s_and_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
27 ; GCN: v_cndmask_b32_e32 [[RESULT:v[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
28 ; GCN-NOT: [[RESULT]]
anatofuz
parents:
diff changeset
29 ; GCN: buffer_store_dword [[RESULT]]
anatofuz
parents:
diff changeset
30 define amdgpu_kernel void @opt_select_i32_and_cmp_f32(i32 addrspace(1)* %out, float %a, float %b, float %c, i32 %x, i32 %y) #0 {
anatofuz
parents:
diff changeset
31 %fcmp0 = fcmp one float %a, %b
anatofuz
parents:
diff changeset
32 %fcmp1 = fcmp one float %a, %c
anatofuz
parents:
diff changeset
33 %and = and i1 %fcmp0, %fcmp1
anatofuz
parents:
diff changeset
34 %select = select i1 %and, i32 %x, i32 %y
anatofuz
parents:
diff changeset
35 store i32 %select, i32 addrspace(1)* %out
anatofuz
parents:
diff changeset
36 ret void
anatofuz
parents:
diff changeset
37 }
anatofuz
parents:
diff changeset
38
anatofuz
parents:
diff changeset
39 ; GCN-LABEL: {{^}}opt_select_i64_and_cmp_i32:
anatofuz
parents:
diff changeset
40 ; GCN-DAG: v_cmp_ne_u32_e32 vcc,
anatofuz
parents:
diff changeset
41 ; GCN-DAG: v_cmp_ne_u32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
42 ; GCN: s_and_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
43 ; GCN: v_cndmask_b32_e32 v[[RESULT1:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
44 ; GCN: v_cndmask_b32_e32 v[[RESULT0:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
45 ; GCN: buffer_store_dwordx2 v{{\[}}[[RESULT0]]:[[RESULT1]]{{\]}}
anatofuz
parents:
diff changeset
46 define amdgpu_kernel void @opt_select_i64_and_cmp_i32(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i64 %x, i64 %y) #0 {
anatofuz
parents:
diff changeset
47 %icmp0 = icmp ne i32 %a, %b
anatofuz
parents:
diff changeset
48 %icmp1 = icmp ne i32 %a, %c
anatofuz
parents:
diff changeset
49 %and = and i1 %icmp0, %icmp1
anatofuz
parents:
diff changeset
50 %select = select i1 %and, i64 %x, i64 %y
anatofuz
parents:
diff changeset
51 store i64 %select, i64 addrspace(1)* %out
anatofuz
parents:
diff changeset
52 ret void
anatofuz
parents:
diff changeset
53 }
anatofuz
parents:
diff changeset
54
anatofuz
parents:
diff changeset
55 ; GCN-LABEL: {{^}}opt_select_i64_and_cmp_f32:
anatofuz
parents:
diff changeset
56 ; GCN-DAG: v_cmp_lg_f32_e32 vcc,
anatofuz
parents:
diff changeset
57 ; GCN-DAG: v_cmp_lg_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
58 ; GCN: s_and_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
59 ; GCN: v_cndmask_b32_e32 v[[RESULT1:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
60 ; GCN: v_cndmask_b32_e32 v[[RESULT0:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
61 ; GCN: buffer_store_dwordx2 v{{\[}}[[RESULT0]]:[[RESULT1]]{{\]}}
anatofuz
parents:
diff changeset
62 define amdgpu_kernel void @opt_select_i64_and_cmp_f32(i64 addrspace(1)* %out, float %a, float %b, float %c, i64 %x, i64 %y) #0 {
anatofuz
parents:
diff changeset
63 %fcmp0 = fcmp one float %a, %b
anatofuz
parents:
diff changeset
64 %fcmp1 = fcmp one float %a, %c
anatofuz
parents:
diff changeset
65 %and = and i1 %fcmp0, %fcmp1
anatofuz
parents:
diff changeset
66 %select = select i1 %and, i64 %x, i64 %y
anatofuz
parents:
diff changeset
67 store i64 %select, i64 addrspace(1)* %out
anatofuz
parents:
diff changeset
68 ret void
anatofuz
parents:
diff changeset
69 }
anatofuz
parents:
diff changeset
70
anatofuz
parents:
diff changeset
71 ; GCN-LABEL: {{^}}opt_select_i32_or_cmp_i32:
anatofuz
parents:
diff changeset
72 ; GCN-DAG: v_cmp_ne_u32_e32 vcc,
anatofuz
parents:
diff changeset
73 ; GCN-DAG: v_cmp_ne_u32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
74 ; GCN: s_or_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
75 ; GCN: v_cndmask_b32_e32 [[RESULT:v[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
76 ; GCN-NOT: [[RESULT]]
anatofuz
parents:
diff changeset
77 ; GCN: buffer_store_dword [[RESULT]]
anatofuz
parents:
diff changeset
78 ; GCN: s_endpgm
anatofuz
parents:
diff changeset
79 define amdgpu_kernel void @opt_select_i32_or_cmp_i32(i32 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i32 %x, i32 %y) #0 {
anatofuz
parents:
diff changeset
80 %icmp0 = icmp ne i32 %a, %b
anatofuz
parents:
diff changeset
81 %icmp1 = icmp ne i32 %a, %c
anatofuz
parents:
diff changeset
82 %or = or i1 %icmp0, %icmp1
anatofuz
parents:
diff changeset
83 %select = select i1 %or, i32 %x, i32 %y
anatofuz
parents:
diff changeset
84 store i32 %select, i32 addrspace(1)* %out
anatofuz
parents:
diff changeset
85 ret void
anatofuz
parents:
diff changeset
86 }
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 ; GCN-LABEL: {{^}}opt_select_i32_or_cmp_f32:
anatofuz
parents:
diff changeset
89 ; GCN-DAG: v_cmp_lg_f32_e32 vcc
anatofuz
parents:
diff changeset
90 ; GCN-DAG: v_cmp_lg_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
91 ; GCN: s_or_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
92 ; GCN: v_cndmask_b32_e32 [[RESULT:v[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
93 ; GCN-NOT: [[RESULT]]
anatofuz
parents:
diff changeset
94 ; GCN: buffer_store_dword [[RESULT]]
anatofuz
parents:
diff changeset
95 define amdgpu_kernel void @opt_select_i32_or_cmp_f32(i32 addrspace(1)* %out, float %a, float %b, float %c, i32 %x, i32 %y) #0 {
anatofuz
parents:
diff changeset
96 %fcmp0 = fcmp one float %a, %b
anatofuz
parents:
diff changeset
97 %fcmp1 = fcmp one float %a, %c
anatofuz
parents:
diff changeset
98 %or = or i1 %fcmp0, %fcmp1
anatofuz
parents:
diff changeset
99 %select = select i1 %or, i32 %x, i32 %y
anatofuz
parents:
diff changeset
100 store i32 %select, i32 addrspace(1)* %out
anatofuz
parents:
diff changeset
101 ret void
anatofuz
parents:
diff changeset
102 }
anatofuz
parents:
diff changeset
103
anatofuz
parents:
diff changeset
104 ; GCN-LABEL: {{^}}opt_select_i64_or_cmp_i32:
anatofuz
parents:
diff changeset
105 ; GCN-DAG: v_cmp_ne_u32_e32 vcc,
anatofuz
parents:
diff changeset
106 ; GCN-DAG: v_cmp_ne_u32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
107 ; GCN: s_or_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
108 ; GCN: v_cndmask_b32_e32 v[[RESULT1:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
109 ; GCN: v_cndmask_b32_e32 v[[RESULT0:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
110 ; GCN: buffer_store_dwordx2 v{{\[}}[[RESULT0]]:[[RESULT1]]{{\]}}
anatofuz
parents:
diff changeset
111 define amdgpu_kernel void @opt_select_i64_or_cmp_i32(i64 addrspace(1)* %out, i32 %a, i32 %b, i32 %c, i64 %x, i64 %y) #0 {
anatofuz
parents:
diff changeset
112 %icmp0 = icmp ne i32 %a, %b
anatofuz
parents:
diff changeset
113 %icmp1 = icmp ne i32 %a, %c
anatofuz
parents:
diff changeset
114 %or = or i1 %icmp0, %icmp1
anatofuz
parents:
diff changeset
115 %select = select i1 %or, i64 %x, i64 %y
anatofuz
parents:
diff changeset
116 store i64 %select, i64 addrspace(1)* %out
anatofuz
parents:
diff changeset
117 ret void
anatofuz
parents:
diff changeset
118 }
anatofuz
parents:
diff changeset
119
anatofuz
parents:
diff changeset
120 ; GCN-LABEL: {{^}}opt_select_i64_or_cmp_f32:
anatofuz
parents:
diff changeset
121 ; GCN-DAG: v_cmp_lg_f32_e32 vcc,
anatofuz
parents:
diff changeset
122 ; GCN-DAG: v_cmp_lg_f32_e64 [[CMP1:s\[[0-9]+:[0-9]+\]]]
anatofuz
parents:
diff changeset
123 ; GCN: s_or_b64 vcc, vcc, [[CMP1]]
anatofuz
parents:
diff changeset
124 ; GCN: v_cndmask_b32_e32 v[[RESULT1:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
125 ; GCN: v_cndmask_b32_e32 v[[RESULT0:[0-9]+]], {{v[0-9]+}}, {{v[0-9]+}}, vcc
anatofuz
parents:
diff changeset
126 ; GCN: buffer_store_dwordx2 v{{\[}}[[RESULT0]]:[[RESULT1]]{{\]}}
anatofuz
parents:
diff changeset
127 define amdgpu_kernel void @opt_select_i64_or_cmp_f32(i64 addrspace(1)* %out, float %a, float %b, float %c, i64 %x, i64 %y) #0 {
anatofuz
parents:
diff changeset
128 %fcmp0 = fcmp one float %a, %b
anatofuz
parents:
diff changeset
129 %fcmp1 = fcmp one float %a, %c
anatofuz
parents:
diff changeset
130 %or = or i1 %fcmp0, %fcmp1
anatofuz
parents:
diff changeset
131 %select = select i1 %or, i64 %x, i64 %y
anatofuz
parents:
diff changeset
132 store i64 %select, i64 addrspace(1)* %out
anatofuz
parents:
diff changeset
133 ret void
anatofuz
parents:
diff changeset
134 }
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 ; GCN-LABEL: {{^}}regression:
anatofuz
parents:
diff changeset
137 ; GCN: v_cmp_neq_f32_e64 s{{\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}, 1.0
anatofuz
parents:
diff changeset
138 ; GCN: v_cmp_neq_f32_e64 s{{\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}, 0
anatofuz
parents:
diff changeset
139 ; GCN: v_cmp_eq_f32_e64 s{{\[[0-9]+:[0-9]+\]}}, s{{[0-9]+}}, 0
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 define amdgpu_kernel void @regression(float addrspace(1)* %out, float %c0, float %c1) #0 {
anatofuz
parents:
diff changeset
142 entry:
anatofuz
parents:
diff changeset
143 %cmp0 = fcmp oeq float %c0, 1.0
anatofuz
parents:
diff changeset
144 br i1 %cmp0, label %if0, label %endif
anatofuz
parents:
diff changeset
145
anatofuz
parents:
diff changeset
146 if0:
anatofuz
parents:
diff changeset
147 %cmp1 = fcmp oeq float %c1, 0.0
anatofuz
parents:
diff changeset
148 br i1 %cmp1, label %if1, label %endif
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 if1:
anatofuz
parents:
diff changeset
151 %cmp2 = xor i1 %cmp1, true
anatofuz
parents:
diff changeset
152 br label %endif
anatofuz
parents:
diff changeset
153
anatofuz
parents:
diff changeset
154 endif:
anatofuz
parents:
diff changeset
155 %tmp0 = phi i1 [ true, %entry ], [ %cmp2, %if1 ], [ false, %if0 ]
anatofuz
parents:
diff changeset
156 %tmp2 = select i1 %tmp0, float 4.0, float 0.0
anatofuz
parents:
diff changeset
157 store float %tmp2, float addrspace(1)* %out
anatofuz
parents:
diff changeset
158 ret void
anatofuz
parents:
diff changeset
159 }
anatofuz
parents:
diff changeset
160
anatofuz
parents:
diff changeset
161 attributes #0 = { nounwind }