xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/valu-i1.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs -enable-misched -asm-verbose < %s | FileCheck -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; SI-LABEL: @test_if
6*9880d681SAndroid Build Coastguard Worker; Make sure the i1 values created by the cfg structurizer pass are
7*9880d681SAndroid Build Coastguard Worker; moved using VALU instructions
8*9880d681SAndroid Build Coastguard Worker; SI-NOT: s_mov_b64 s[{{[0-9]:[0-9]}}], -1
9*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 v{{[0-9]}}, -1
10*9880d681SAndroid Build Coastguard Workerdefine void @test_if(i32 %b, i32 addrspace(1)* %src, i32 addrspace(1)* %dst) #1 {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
13*9880d681SAndroid Build Coastguard Worker  switch i32 %tid, label %default [
14*9880d681SAndroid Build Coastguard Worker    i32 0, label %case0
15*9880d681SAndroid Build Coastguard Worker    i32 1, label %case1
16*9880d681SAndroid Build Coastguard Worker  ]
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workercase0:
19*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr i32, i32 addrspace(1)* %dst, i32 %b
20*9880d681SAndroid Build Coastguard Worker  store i32 0, i32 addrspace(1)* %arrayidx1, align 4
21*9880d681SAndroid Build Coastguard Worker  br label %end
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workercase1:
24*9880d681SAndroid Build Coastguard Worker  %arrayidx5 = getelementptr i32, i32 addrspace(1)* %dst, i32 %b
25*9880d681SAndroid Build Coastguard Worker  store i32 1, i32 addrspace(1)* %arrayidx5, align 4
26*9880d681SAndroid Build Coastguard Worker  br label %end
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefault:
29*9880d681SAndroid Build Coastguard Worker  %cmp8 = icmp eq i32 %tid, 2
30*9880d681SAndroid Build Coastguard Worker  %arrayidx10 = getelementptr i32, i32 addrspace(1)* %dst, i32 %b
31*9880d681SAndroid Build Coastguard Worker  br i1 %cmp8, label %if, label %else
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerif:
34*9880d681SAndroid Build Coastguard Worker  store i32 2, i32 addrspace(1)* %arrayidx10, align 4
35*9880d681SAndroid Build Coastguard Worker  br label %end
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerelse:
38*9880d681SAndroid Build Coastguard Worker  store i32 3, i32 addrspace(1)* %arrayidx10, align 4
39*9880d681SAndroid Build Coastguard Worker  br label %end
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerend:
42*9880d681SAndroid Build Coastguard Worker  ret void
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; SI-LABEL: @simple_test_v_if
46*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ne_i32_e32 vcc, 0, v{{[0-9]+}}
47*9880d681SAndroid Build Coastguard Worker; SI: s_and_saveexec_b64 [[BR_SREG:s\[[0-9]+:[0-9]+\]]], vcc
48*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[BR_SREG]], exec, [[BR_SREG]]
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; SI: ; BB#1
51*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword
52*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; SI: BB1_2:
55*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 exec, exec, [[BR_SREG]]
56*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
57*9880d681SAndroid Build Coastguard Workerdefine void @simple_test_v_if(i32 addrspace(1)* %dst, i32 addrspace(1)* %src) #1 {
58*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
59*9880d681SAndroid Build Coastguard Worker  %is.0 = icmp ne i32 %tid, 0
60*9880d681SAndroid Build Coastguard Worker  br i1 %is.0, label %store, label %exit
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerstore:
63*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr i32, i32 addrspace(1)* %dst, i32 %tid
64*9880d681SAndroid Build Coastguard Worker  store i32 999, i32 addrspace(1)* %gep
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerexit:
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; SI-LABEL: @simple_test_v_loop
72*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ne_i32_e32 vcc, 0, v{{[0-9]+}}
73*9880d681SAndroid Build Coastguard Worker; SI: s_and_saveexec_b64 [[BR_SREG:s\[[0-9]+:[0-9]+\]]], vcc
74*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[BR_SREG]], exec, [[BR_SREG]]
75*9880d681SAndroid Build Coastguard Worker; SI: s_cbranch_execz [[LABEL_EXIT:BB[0-9]+_[0-9]+]]
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b64 {{s\[[0-9]+:[0-9]+\]}}, 0{{$}}
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker; SI: [[LABEL_LOOP:BB[0-9]+_[0-9]+]]:
80*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword
81*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_store_dword
82*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_eq_i32_e32 vcc,
83*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_and_b64 vcc, exec, vcc
84*9880d681SAndroid Build Coastguard Worker; SI: s_cbranch_vccz [[LABEL_LOOP]]
85*9880d681SAndroid Build Coastguard Worker; SI: [[LABEL_EXIT]]:
86*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine void @simple_test_v_loop(i32 addrspace(1)* %dst, i32 addrspace(1)* %src) #1 {
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
91*9880d681SAndroid Build Coastguard Worker  %is.0 = icmp ne i32 %tid, 0
92*9880d681SAndroid Build Coastguard Worker  %limit = add i32 %tid, 64
93*9880d681SAndroid Build Coastguard Worker  br i1 %is.0, label %loop, label %exit
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerloop:
96*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [%tid, %entry], [%i.inc, %loop]
97*9880d681SAndroid Build Coastguard Worker  %gep.src = getelementptr i32, i32 addrspace(1)* %src, i32 %i
98*9880d681SAndroid Build Coastguard Worker  %gep.dst = getelementptr i32, i32 addrspace(1)* %dst, i32 %i
99*9880d681SAndroid Build Coastguard Worker  %load = load i32, i32 addrspace(1)* %src
100*9880d681SAndroid Build Coastguard Worker  store i32 %load, i32 addrspace(1)* %gep.dst
101*9880d681SAndroid Build Coastguard Worker  %i.inc = add nsw i32 %i, 1
102*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %limit, %i.inc
103*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %exit, label %loop
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerexit:
106*9880d681SAndroid Build Coastguard Worker  ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; SI-LABEL: @multi_vcond_loop
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Load loop limit from buffer
112*9880d681SAndroid Build Coastguard Worker; Branch to exit if uniformly not taken
113*9880d681SAndroid Build Coastguard Worker; SI: ; BB#0:
114*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[VBOUND:v[0-9]+]]
115*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_lt_i32_e32 vcc
116*9880d681SAndroid Build Coastguard Worker; SI: s_and_saveexec_b64 [[OUTER_CMP_SREG:s\[[0-9]+:[0-9]+\]]], vcc
117*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[OUTER_CMP_SREG]], exec, [[OUTER_CMP_SREG]]
118*9880d681SAndroid Build Coastguard Worker; SI: s_cbranch_execz [[LABEL_EXIT:BB[0-9]+_[0-9]+]]
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; Initialize inner condition to false
121*9880d681SAndroid Build Coastguard Worker; SI: ; BB#1:
122*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b64 [[ZERO:s\[[0-9]+:[0-9]+\]]], 0{{$}}
123*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b64 [[COND_STATE:s\[[0-9]+:[0-9]+\]]], [[ZERO]]
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker; Clear exec bits for workitems that load -1s
126*9880d681SAndroid Build Coastguard Worker; SI: [[LABEL_LOOP:BB[0-9]+_[0-9]+]]:
127*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[B:v[0-9]+]]
128*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dword [[A:v[0-9]+]]
129*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_ne_i32_e64 [[NEG1_CHECK_0:s\[[0-9]+:[0-9]+\]]], -1, [[A]]
130*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_ne_i32_e32 [[NEG1_CHECK_1:vcc]], -1, [[B]]
131*9880d681SAndroid Build Coastguard Worker; SI: s_and_b64 [[ORNEG1:s\[[0-9]+:[0-9]+\]]], [[NEG1_CHECK_1]], [[NEG1_CHECK_0]]
132*9880d681SAndroid Build Coastguard Worker; SI: s_and_saveexec_b64 [[ORNEG2:s\[[0-9]+:[0-9]+\]]], [[ORNEG1]]
133*9880d681SAndroid Build Coastguard Worker; SI: s_xor_b64 [[ORNEG2]], exec, [[ORNEG2]]
134*9880d681SAndroid Build Coastguard Worker; SI: s_cbranch_execz [[LABEL_FLOW:BB[0-9]+_[0-9]+]]
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; SI: BB#3:
137*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword
138*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_ge_i64_e32 [[CMP:s\[[0-9]+:[0-9]+\]|vcc]]
139*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 [[TMP:s\[[0-9]+:[0-9]+\]]], [[CMP]], [[COND_STATE]]
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; SI: [[LABEL_FLOW]]:
142*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 exec, exec, [[ORNEG2]]
143*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 [[COND_STATE]], [[ORNEG2]], [[TMP]]
144*9880d681SAndroid Build Coastguard Worker; SI: s_andn2_b64 exec, exec, [[COND_STATE]]
145*9880d681SAndroid Build Coastguard Worker; SI: s_cbranch_execnz [[LABEL_LOOP]]
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; SI: BB#5
148*9880d681SAndroid Build Coastguard Worker; SI: s_or_b64 exec, exec, [[COND_STATE]]
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; SI: [[LABEL_EXIT]]:
151*9880d681SAndroid Build Coastguard Worker; SI-NOT: [[COND_STATE]]
152*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdefine void @multi_vcond_loop(i32 addrspace(1)* noalias nocapture %arg, i32 addrspace(1)* noalias nocapture readonly %arg1, i32 addrspace(1)* noalias nocapture readonly %arg2, i32 addrspace(1)* noalias nocapture readonly %arg3) #1 {
155*9880d681SAndroid Build Coastguard Workerbb:
156*9880d681SAndroid Build Coastguard Worker  %tmp = tail call i32 @llvm.amdgcn.workitem.id.x() #0
157*9880d681SAndroid Build Coastguard Worker  %tmp4 = sext i32 %tmp to i64
158*9880d681SAndroid Build Coastguard Worker  %tmp5 = getelementptr inbounds i32, i32 addrspace(1)* %arg3, i64 %tmp4
159*9880d681SAndroid Build Coastguard Worker  %tmp6 = load i32, i32 addrspace(1)* %tmp5, align 4
160*9880d681SAndroid Build Coastguard Worker  %tmp7 = icmp sgt i32 %tmp6, 0
161*9880d681SAndroid Build Coastguard Worker  %tmp8 = sext i32 %tmp6 to i64
162*9880d681SAndroid Build Coastguard Worker  br i1 %tmp7, label %bb10, label %bb26
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerbb10:                                             ; preds = %bb, %bb20
165*9880d681SAndroid Build Coastguard Worker  %tmp11 = phi i64 [ %tmp23, %bb20 ], [ 0, %bb ]
166*9880d681SAndroid Build Coastguard Worker  %tmp12 = add nsw i64 %tmp11, %tmp4
167*9880d681SAndroid Build Coastguard Worker  %tmp13 = getelementptr inbounds i32, i32 addrspace(1)* %arg1, i64 %tmp12
168*9880d681SAndroid Build Coastguard Worker  %tmp14 = load i32, i32 addrspace(1)* %tmp13, align 4
169*9880d681SAndroid Build Coastguard Worker  %tmp15 = getelementptr inbounds i32, i32 addrspace(1)* %arg2, i64 %tmp12
170*9880d681SAndroid Build Coastguard Worker  %tmp16 = load i32, i32 addrspace(1)* %tmp15, align 4
171*9880d681SAndroid Build Coastguard Worker  %tmp17 = icmp ne i32 %tmp14, -1
172*9880d681SAndroid Build Coastguard Worker  %tmp18 = icmp ne i32 %tmp16, -1
173*9880d681SAndroid Build Coastguard Worker  %tmp19 = and i1 %tmp17, %tmp18
174*9880d681SAndroid Build Coastguard Worker  br i1 %tmp19, label %bb20, label %bb26
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerbb20:                                             ; preds = %bb10
177*9880d681SAndroid Build Coastguard Worker  %tmp21 = add nsw i32 %tmp16, %tmp14
178*9880d681SAndroid Build Coastguard Worker  %tmp22 = getelementptr inbounds i32, i32 addrspace(1)* %arg, i64 %tmp12
179*9880d681SAndroid Build Coastguard Worker  store i32 %tmp21, i32 addrspace(1)* %tmp22, align 4
180*9880d681SAndroid Build Coastguard Worker  %tmp23 = add nuw nsw i64 %tmp11, 1
181*9880d681SAndroid Build Coastguard Worker  %tmp24 = icmp slt i64 %tmp23, %tmp8
182*9880d681SAndroid Build Coastguard Worker  br i1 %tmp24, label %bb10, label %bb26
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerbb26:                                             ; preds = %bb10, %bb20, %bb
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
189*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
190