1# RUN: llc -run-pass si-insert-waits -march=amdgcn -mcpu=tahiti -o - %s | FileCheck %s
2--- |
3
4  define 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 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: %vcc = S_MOV_B64 %vcc
51# CHECK-NEXT: S_CBRANCH_VCCZ %bb.2.else, implicit killed %vcc
52
53name:            vccz_corrupt_workaround
54alignment:       0
55exposesReturnsTwice: false
56legalized:       false
57regBankSelected: false
58selected:        false
59tracksRegLiveness: true
60liveins:
61  - { reg: '%sgpr0_sgpr1' }
62frameInfo:
63  isFrameAddressTaken: false
64  isReturnAddressTaken: false
65  hasStackMap:     false
66  hasPatchPoint:   false
67  stackSize:       0
68  offsetAdjustment: 0
69  maxAlignment:    0
70  adjustsStack:    false
71  hasCalls:        false
72  maxCallFrameSize: 0
73  hasOpaqueSPAdjustment: false
74  hasVAStart:      false
75  hasMustTailInVarArgFunc: false
76body:             |
77  bb.0.entry:
78    successors: %bb.2.if, %bb.1.else
79    liveins: %sgpr0_sgpr1
80
81    %sgpr2 = S_LOAD_DWORD_IMM %sgpr0_sgpr1, 9, 0 :: (non-temporal dereferenceable invariant load 4 from `float addrspace(2)* undef`)
82    %sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed %sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
83    %sgpr7 = S_MOV_B32 61440
84    %sgpr6 = S_MOV_B32 -1
85    %vcc = V_CMP_EQ_F32_e64 0, 0, 0, %sgpr2, 0, 0, implicit %exec
86    S_CBRANCH_VCCZ %bb.1.else, implicit killed %vcc
87
88  bb.2.if:
89    successors: %bb.3.done
90    liveins: %sgpr6, %sgpr7, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
91
92    %vgpr0 = V_MOV_B32_e32 9, implicit %exec
93    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`)
94    %vgpr0 = V_MOV_B32_e32 0, implicit %exec
95    S_BRANCH %bb.3.done
96
97  bb.1.else:
98    successors: %bb.3.done
99    liveins: %sgpr6, %sgpr7, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
100
101    %vgpr0 = V_MOV_B32_e32 100, implicit %exec
102    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`)
103    %vgpr0 = V_MOV_B32_e32 1, implicit %exec
104
105  bb.3.done:
106    liveins: %vgpr0, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
107
108    %sgpr3 = S_MOV_B32 61440
109    %sgpr2 = S_MOV_B32 -1
110    BUFFER_STORE_DWORD_OFFSET killed %vgpr0, killed %sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, 0, implicit %exec :: (store 4 into %ir.out)
111    S_ENDPGM
112
113...
114---
115# CHECK-LABEL: name: vccz_corrupt_undef_vcc
116# CHECK: S_WAITCNT
117# CHECK-NEXT: S_CBRANCH_VCCZ %bb.2.else, implicit undef %vcc
118
119name:            vccz_corrupt_undef_vcc
120alignment:       0
121exposesReturnsTwice: false
122legalized:       false
123regBankSelected: false
124selected:        false
125tracksRegLiveness: true
126liveins:
127  - { reg: '%sgpr0_sgpr1' }
128frameInfo:
129  isFrameAddressTaken: false
130  isReturnAddressTaken: false
131  hasStackMap:     false
132  hasPatchPoint:   false
133  stackSize:       0
134  offsetAdjustment: 0
135  maxAlignment:    0
136  adjustsStack:    false
137  hasCalls:        false
138  maxCallFrameSize: 0
139  hasOpaqueSPAdjustment: false
140  hasVAStart:      false
141  hasMustTailInVarArgFunc: false
142body:             |
143  bb.0.entry:
144    successors: %bb.2.if, %bb.1.else
145    liveins: %sgpr0_sgpr1
146
147    %sgpr0_sgpr1 = S_LOAD_DWORDX2_IMM killed %sgpr0_sgpr1, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`)
148    %sgpr7 = S_MOV_B32 61440
149    %sgpr6 = S_MOV_B32 -1
150    S_CBRANCH_VCCZ %bb.1.else, implicit undef %vcc
151
152  bb.2.if:
153    successors: %bb.3.done
154    liveins: %sgpr6, %sgpr7, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
155
156    %vgpr0 = V_MOV_B32_e32 9, implicit %exec
157    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`)
158    %vgpr0 = V_MOV_B32_e32 0, implicit %exec
159    S_BRANCH %bb.3.done
160
161  bb.1.else:
162    successors: %bb.3.done
163    liveins: %sgpr6, %sgpr7, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
164
165    %vgpr0 = V_MOV_B32_e32 100, implicit %exec
166    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`)
167    %vgpr0 = V_MOV_B32_e32 1, implicit %exec
168
169  bb.3.done:
170    liveins: %vgpr0, %sgpr0_sgpr1_sgpr2_sgpr3:0x00000003
171
172    %sgpr3 = S_MOV_B32 61440
173    %sgpr2 = S_MOV_B32 -1
174    BUFFER_STORE_DWORD_OFFSET killed %vgpr0, killed %sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, 0, implicit %exec :: (store 4 into %ir.out)
175    S_ENDPGM
176
177...
178