1# RUN: llc -run-pass si-insert-waitcnts -march=amdgcn -mcpu=tahiti -o - %s | FileCheck %s
2--- |
3
4  define amdgpu_kernel void @vccz_corrupt_workaround(float %cond, i32 addrspace(1)* %out) #0 {
5  entry:
6    %cmp0 = fcmp oeq float %cond, 0.000000e+00
7    br i1 %cmp0, label %if, label %else, !structurizecfg.uniform !0, !amdgpu.uniform !0
8
9  else:                                             ; preds = %entry
10    store volatile i32 100, i32 addrspace(1)* undef
11    br label %done, !structurizecfg.uniform !0
12
13  if:                                               ; preds = %entry
14    store volatile i32 9, i32 addrspace(1)* undef
15    br label %done, !structurizecfg.uniform !0
16
17  done:                                             ; preds = %if, %else
18    %value = phi i32 [ 0, %if ], [ 1, %else ]
19    store i32 %value, i32 addrspace(1)* %out
20    ret void
21  }
22
23  define amdgpu_kernel void @vccz_corrupt_undef_vcc(float %cond, i32 addrspace(1)* %out) #0 {
24  entry:
25    br i1 undef, label %if, label %else, !structurizecfg.uniform !0, !amdgpu.uniform !0
26
27  else:                                             ; preds = %entry
28    store volatile i32 100, i32 addrspace(1)* undef
29    br label %done, !structurizecfg.uniform !0
30
31  if:                                               ; preds = %entry
32    store volatile i32 9, i32 addrspace(1)* undef
33    br label %done, !structurizecfg.uniform !0
34
35  done:                                             ; preds = %if, %else
36    %value = phi i32 [ 0, %if ], [ 1, %else ]
37    store i32 %value, i32 addrspace(1)* %out
38    ret void
39  }
40
41  attributes #0 = { nounwind }
42  attributes #1 = { readnone }
43
44  !0 = !{}
45
46...
47---
48# CHECK-LABEL: name: vccz_corrupt_workaround
49# CHECK: $vcc = V_CMP_EQ_F32
50# CHECK-NEXT: S_WAITCNT 0
51# CHECK-NEXT: $vcc = S_MOV_B64 $vcc
52# CHECK-NEXT: S_CBRANCH_VCCZ %bb.2, implicit killed $vcc
53
54name:            vccz_corrupt_workaround
55alignment:       0
56exposesReturnsTwice: false
57legalized:       false
58regBankSelected: false
59selected:        false
60tracksRegLiveness: true
61liveins:
62  - { reg: '$sgpr0_sgpr1' }
63frameInfo:
64  isFrameAddressTaken: false
65  isReturnAddressTaken: false
66  hasStackMap:     false
67  hasPatchPoint:   false
68  stackSize:       0
69  offsetAdjustment: 0
70  maxAlignment:    0
71  adjustsStack:    false
72  hasCalls:        false
73  maxCallFrameSize: 0
74  hasOpaqueSPAdjustment: false
75  hasVAStart:      false
76  hasMustTailInVarArgFunc: false
77body:             |
78  bb.0.entry:
79    liveins: $sgpr0_sgpr1, $vcc
80
81    $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed $sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(4)* undef`)
82    $sgpr7 = S_MOV_B32 61440
83    $sgpr6 = S_MOV_B32 -1
84    $vcc = V_CMP_EQ_F32_e64 0, 0, 0, undef $sgpr2, 0, implicit $exec
85    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
86
87  bb.2.if:
88    liveins: $sgpr6, $sgpr7, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
89
90    $vgpr0 = V_MOV_B32_e32 9, implicit $exec
91    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, 0, implicit $exec :: (volatile store 4 into `i32 addrspace(1)* undef`)
92    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
93    S_BRANCH %bb.3
94
95  bb.1.else:
96    liveins: $sgpr6, $sgpr7, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
97
98    $vgpr0 = V_MOV_B32_e32 100, implicit $exec
99    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, 0, implicit $exec :: (volatile store 4 into `i32 addrspace(1)* undef`)
100    $vgpr0 = V_MOV_B32_e32 1, implicit $exec
101
102  bb.3.done:
103    liveins: $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
104
105    $sgpr3 = S_MOV_B32 61440
106    $sgpr2 = S_MOV_B32 -1
107    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, 0, implicit $exec :: (store 4 into %ir.out)
108    S_ENDPGM
109
110...
111---
112# CHECK-LABEL: name: vccz_corrupt_undef_vcc
113# CHECK: S_WAITCNT 3855
114# CHECK-NEXT: $vgpr0 = V_MOV_B32_e32
115
116name:            vccz_corrupt_undef_vcc
117alignment:       0
118exposesReturnsTwice: false
119legalized:       false
120regBankSelected: false
121selected:        false
122tracksRegLiveness: true
123liveins:
124  - { reg: '$sgpr0_sgpr1' }
125frameInfo:
126  isFrameAddressTaken: false
127  isReturnAddressTaken: false
128  hasStackMap:     false
129  hasPatchPoint:   false
130  stackSize:       0
131  offsetAdjustment: 0
132  maxAlignment:    0
133  adjustsStack:    false
134  hasCalls:        false
135  maxCallFrameSize: 0
136  hasOpaqueSPAdjustment: false
137  hasVAStart:      false
138  hasMustTailInVarArgFunc: false
139body:             |
140  bb.0.entry:
141    liveins: $sgpr0_sgpr1
142
143    $sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed $sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(4)* undef`)
144    $sgpr7 = S_MOV_B32 61440
145    $sgpr6 = S_MOV_B32 -1
146    S_CBRANCH_VCCZ %bb.1, implicit undef $vcc
147
148  bb.2.if:
149    liveins: $sgpr6, $sgpr7, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
150
151    $vgpr0 = V_MOV_B32_e32 9, implicit $exec
152    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, 0, implicit $exec :: (volatile store 4 into `i32 addrspace(1)* undef`)
153    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
154    S_BRANCH %bb.3
155
156  bb.1.else:
157    liveins: $sgpr6, $sgpr7, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
158
159    $vgpr0 = V_MOV_B32_e32 100, implicit $exec
160    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, 0, implicit $exec :: (volatile store 4 into `i32 addrspace(1)* undef`)
161    $vgpr0 = V_MOV_B32_e32 1, implicit $exec
162
163  bb.3.done:
164    liveins: $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
165
166    $sgpr3 = S_MOV_B32 61440
167    $sgpr2 = S_MOV_B32 -1
168    BUFFER_STORE_DWORD_OFFSET killed $vgpr0, killed $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, 0, implicit $exec :: (store 4 into %ir.out)
169    S_ENDPGM
170
171...
172