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