1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 -verify-machineinstrs -run-pass=si-optimize-exec-masking-pre-ra,si-optimize-exec-masking-pre-ra -o - %s | FileCheck %s
4 # FIXME: Second run of the pass is a workaround for a bug in
5 # -run-pass. The verifier doesn't detect broken LiveIntervals, see bug
9 # Cannot fold this without moving the def of %7 after the and.
11 name: no_fold_andn2_select_condition_live_out_phi
12 tracksRegLiveness: true
14 ; CHECK-LABEL: name: no_fold_andn2_select_condition_live_out_phi
16 ; CHECK: successors: %bb.2(0x80000000)
17 ; CHECK: [[S_MOV_B64_:%[0-9]+]]:sreg_64_xexec = S_MOV_B64 -1
18 ; CHECK: undef %1.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
19 ; CHECK: S_BRANCH %bb.2
23 ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000)
24 ; CHECK: [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, [[S_MOV_B64_]], implicit $exec
25 ; CHECK: V_CMP_NE_U32_e32 1, [[V_CNDMASK_B32_e64_]], implicit-def $vcc, implicit $exec
26 ; CHECK: %1.sub1:vreg_64 = COPY %1.sub0
27 ; CHECK: DS_WRITE_B64_gfx9 undef %3:vgpr_32, %1, 0, 0, implicit $exec :: (store (s64), addrspace 3)
28 ; CHECK: ATOMIC_FENCE 4, 2
29 ; CHECK: [[S_MOV_B64_1:%[0-9]+]]:sreg_64_xexec = S_MOV_B64 0
30 ; CHECK: $vcc = S_AND_B64 $exec, $vcc, implicit-def dead $scc
31 ; CHECK: S_CBRANCH_VCCNZ %bb.1, implicit $vcc
32 ; CHECK: S_BRANCH %bb.2
36 %7:sreg_64_xexec = S_MOV_B64 -1
37 undef %5.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
44 successors: %bb.1, %bb.2
46 %4:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %7, implicit $exec
47 V_CMP_NE_U32_e32 1, %4, implicit-def $vcc, implicit $exec
48 %5.sub1:vreg_64 = COPY %5.sub0
49 DS_WRITE_B64_gfx9 undef %6:vgpr_32, %5, 0, 0, implicit $exec :: (store (s64), addrspace 3)
51 %7:sreg_64_xexec = S_MOV_B64 0
52 $vcc = S_AND_B64 $exec, killed $vcc, implicit-def dead $scc
53 S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
58 # It's OK to fold this, since the phi def is after the andn2 insert point.
60 name: fold_andn2_select_condition_live_out_phi_reorder
61 tracksRegLiveness: true
63 ; CHECK-LABEL: name: fold_andn2_select_condition_live_out_phi_reorder
65 ; CHECK: successors: %bb.2(0x80000000)
66 ; CHECK: [[S_MOV_B64_:%[0-9]+]]:sreg_64_xexec = S_MOV_B64 -1
67 ; CHECK: undef %1.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
68 ; CHECK: S_BRANCH %bb.2
72 ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000)
73 ; CHECK: %1.sub1:vreg_64 = COPY %1.sub0
74 ; CHECK: DS_WRITE_B64_gfx9 undef %3:vgpr_32, %1, 0, 0, implicit $exec :: (store (s64), addrspace 3)
75 ; CHECK: ATOMIC_FENCE 4, 2
76 ; CHECK: $vcc = S_ANDN2_B64 $exec, [[S_MOV_B64_]], implicit-def dead $scc
77 ; CHECK: [[S_MOV_B64_1:%[0-9]+]]:sreg_64_xexec = S_MOV_B64 0
78 ; CHECK: S_CBRANCH_VCCNZ %bb.1, implicit $vcc
79 ; CHECK: S_BRANCH %bb.2
83 %7:sreg_64_xexec = S_MOV_B64 -1
84 undef %5.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
91 successors: %bb.1, %bb.2
93 %4:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %7, implicit $exec
94 V_CMP_NE_U32_e32 1, %4, implicit-def $vcc, implicit $exec
95 %5.sub1:vreg_64 = COPY %5.sub0
96 DS_WRITE_B64_gfx9 undef %6:vgpr_32, %5, 0, 0, implicit $exec :: (store (s64), addrspace 3)
98 $vcc = S_AND_B64 $exec, killed $vcc, implicit-def dead $scc
99 %7:sreg_64_xexec = S_MOV_B64 0
100 S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
106 name: no_fold_andn2_select_condition_live_out_phi_physreg
107 tracksRegLiveness: true
109 ; CHECK-LABEL: name: no_fold_andn2_select_condition_live_out_phi_physreg
111 ; CHECK: successors: %bb.2(0x80000000)
112 ; CHECK: $sgpr4_sgpr5 = S_MOV_B64 -1
113 ; CHECK: undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
114 ; CHECK: S_BRANCH %bb.2
118 ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000)
119 ; CHECK: liveins: $sgpr4_sgpr5
120 ; CHECK: [[V_CNDMASK_B32_e64_:%[0-9]+]]:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, $sgpr4_sgpr5, implicit $exec
121 ; CHECK: V_CMP_NE_U32_e32 1, [[V_CNDMASK_B32_e64_]], implicit-def $vcc, implicit $exec
122 ; CHECK: %0.sub1:vreg_64 = COPY %0.sub0
123 ; CHECK: DS_WRITE_B64_gfx9 undef %2:vgpr_32, %0, 0, 0, implicit $exec :: (store (s64), addrspace 3)
124 ; CHECK: ATOMIC_FENCE 4, 2
125 ; CHECK: $sgpr4_sgpr5 = S_MOV_B64 0
126 ; CHECK: $vcc = S_AND_B64 $exec, $vcc, implicit-def dead $scc
127 ; CHECK: S_CBRANCH_VCCNZ %bb.1, implicit $vcc
128 ; CHECK: S_BRANCH %bb.2
132 $sgpr4_sgpr5 = S_MOV_B64 -1
133 undef %5.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
140 successors: %bb.1, %bb.2
141 liveins: $sgpr4_sgpr5
143 %4:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, $sgpr4_sgpr5, implicit $exec
144 V_CMP_NE_U32_e32 1, %4, implicit-def $vcc, implicit $exec
145 %5.sub1:vreg_64 = COPY %5.sub0
146 DS_WRITE_B64_gfx9 undef %6:vgpr_32, %5, 0, 0, implicit $exec :: (store (s64), addrspace 3)
148 $sgpr4_sgpr5 = S_MOV_B64 0
149 $vcc = S_AND_B64 $exec, killed $vcc, implicit-def dead $scc
150 S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
156 name: fold_andn2_select_condition_live_out_phi_physreg_reorder
157 tracksRegLiveness: true
159 ; CHECK-LABEL: name: fold_andn2_select_condition_live_out_phi_physreg_reorder
161 ; CHECK: successors: %bb.2(0x80000000)
162 ; CHECK: $sgpr4_sgpr5 = S_MOV_B64 -1
163 ; CHECK: undef %0.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
164 ; CHECK: S_BRANCH %bb.2
168 ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000)
169 ; CHECK: liveins: $sgpr4_sgpr5
170 ; CHECK: %0.sub1:vreg_64 = COPY %0.sub0
171 ; CHECK: DS_WRITE_B64_gfx9 undef %2:vgpr_32, %0, 0, 0, implicit $exec :: (store (s64), addrspace 3)
172 ; CHECK: ATOMIC_FENCE 4, 2
173 ; CHECK: $vcc = S_ANDN2_B64 $exec, $sgpr4_sgpr5, implicit-def dead $scc
174 ; CHECK: $sgpr4_sgpr5 = S_MOV_B64 0
175 ; CHECK: S_CBRANCH_VCCNZ %bb.1, implicit $vcc
176 ; CHECK: S_BRANCH %bb.2
180 $sgpr4_sgpr5 = S_MOV_B64 -1
181 undef %5.sub0:vreg_64 = V_MOV_B32_e32 0, implicit $exec
188 successors: %bb.1, %bb.2
189 liveins: $sgpr4_sgpr5
191 %4:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, $sgpr4_sgpr5, implicit $exec
192 V_CMP_NE_U32_e32 1, %4, implicit-def $vcc, implicit $exec
193 %5.sub1:vreg_64 = COPY %5.sub0
194 DS_WRITE_B64_gfx9 undef %6:vgpr_32, %5, 0, 0, implicit $exec :: (store (s64), addrspace 3)
196 $vcc = S_AND_B64 $exec, killed $vcc, implicit-def dead $scc
197 $sgpr4_sgpr5 = S_MOV_B64 0
198 S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc