1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -global-isel -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs -o - %s | FileCheck %s 3 4--- 5name: test_sdiv_srem 6tracksRegLiveness: true 7body: | 8 bb.0: 9 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 10 ; CHECK-LABEL: name: test_sdiv_srem 11 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 12 ; CHECK-NEXT: {{ $}} 13 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 14 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 15 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 16 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 17 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_SDIVREM %src1, %src2 18 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 19 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 20 %src1:_(s32) = COPY $vgpr0 21 %src2:_(s32) = COPY $vgpr1 22 %ptr1:_(p1) = COPY $vgpr2_vgpr3 23 %ptr2:_(p1) = COPY $vgpr4_vgpr5 24 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 25 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 26 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 27 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 28... 29--- 30name: test_sdiv_srem_v2 31tracksRegLiveness: true 32body: | 33 bb.0: 34 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 35 ; CHECK-LABEL: name: test_sdiv_srem_v2 36 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 37 ; CHECK-NEXT: {{ $}} 38 ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 39 ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 40 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5 41 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7 42 ; CHECK-NEXT: %div:_(<2 x s32>), %rem:_ = G_SDIVREM %src1, %src2 43 ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 44 ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 45 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 46 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 47 %ptr1:_(p1) = COPY $vgpr4_vgpr5 48 %ptr2:_(p1) = COPY $vgpr6_vgpr7 49 %div:_(<2 x s32>) = G_SDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 50 G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 51 %rem:_(<2 x s32>) = G_SREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 52 G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 53... 54--- 55name: test_sdiv_srem_v4 56tracksRegLiveness: true 57body: | 58 bb.0: 59 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 60 ; CHECK-LABEL: name: test_sdiv_srem_v4 61 ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 62 ; CHECK-NEXT: {{ $}} 63 ; CHECK-NEXT: %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 64 ; CHECK-NEXT: %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 65 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr8_vgpr9 66 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr10_vgpr11 67 ; CHECK-NEXT: %div:_(<4 x s32>), %rem:_ = G_SDIVREM %src1, %src2 68 ; CHECK-NEXT: G_STORE %div(<4 x s32>), %ptr1(p1) :: (store (<4 x s32>), align 4, addrspace 1) 69 ; CHECK-NEXT: G_STORE %rem(<4 x s32>), %ptr2(p1) :: (store (<4 x s32>), align 4, addrspace 1) 70 %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 71 %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 72 %ptr1:_(p1) = COPY $vgpr8_vgpr9 73 %ptr2:_(p1) = COPY $vgpr10_vgpr11 74 %div:_(<4 x s32>) = G_SDIV %src1:_(<4 x s32>), %src2:_(<4 x s32>) 75 G_STORE %div:_(<4 x s32>), %ptr1:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 76 %rem:_(<4 x s32>) = G_SREM %src1:_(<4 x s32>), %src2:_(<4 x s32>) 77 G_STORE %rem:_(<4 x s32>), %ptr2:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 78... 79--- 80name: test_srem_sdiv 81tracksRegLiveness: true 82body: | 83 bb.0: 84 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 85 ; CHECK-LABEL: name: test_srem_sdiv 86 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 87 ; CHECK-NEXT: {{ $}} 88 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 89 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 90 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 91 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 92 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_SDIVREM %src1, %src2 93 ; CHECK-NEXT: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1) 94 ; CHECK-NEXT: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1) 95 %src1:_(s32) = COPY $vgpr0 96 %src2:_(s32) = COPY $vgpr1 97 %ptr1:_(p1) = COPY $vgpr2_vgpr3 98 %ptr2:_(p1) = COPY $vgpr4_vgpr5 99 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 100 G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 101 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 102 G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 103... 104--- 105name: test_srem_sdiv_v2 106tracksRegLiveness: true 107body: | 108 bb.0: 109 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 110 ; CHECK-LABEL: name: test_srem_sdiv_v2 111 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 112 ; CHECK-NEXT: {{ $}} 113 ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 114 ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 115 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5 116 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7 117 ; CHECK-NEXT: %div:_(<2 x s32>), %rem:_ = G_SDIVREM %src1, %src2 118 ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 119 ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 120 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 121 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 122 %ptr1:_(p1) = COPY $vgpr4_vgpr5 123 %ptr2:_(p1) = COPY $vgpr6_vgpr7 124 %rem:_(<2 x s32>) = G_SREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 125 G_STORE %rem:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 126 %div:_(<2 x s32>) = G_SDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 127 G_STORE %div:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 128... 129--- 130name: test_srem_sdiv_v4 131tracksRegLiveness: true 132body: | 133 bb.0: 134 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 135 ; CHECK-LABEL: name: test_srem_sdiv_v4 136 ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 137 ; CHECK-NEXT: {{ $}} 138 ; CHECK-NEXT: %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 139 ; CHECK-NEXT: %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 140 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr8_vgpr9 141 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr10_vgpr11 142 ; CHECK-NEXT: %div:_(<4 x s32>), %rem:_ = G_SDIVREM %src1, %src2 143 ; CHECK-NEXT: G_STORE %rem(<4 x s32>), %ptr1(p1) :: (store (<4 x s32>), align 4, addrspace 1) 144 ; CHECK-NEXT: G_STORE %div(<4 x s32>), %ptr2(p1) :: (store (<4 x s32>), align 4, addrspace 1) 145 %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 146 %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 147 %ptr1:_(p1) = COPY $vgpr8_vgpr9 148 %ptr2:_(p1) = COPY $vgpr10_vgpr11 149 %rem:_(<4 x s32>) = G_SREM %src1:_(<4 x s32>), %src2:_(<4 x s32>) 150 G_STORE %rem:_(<4 x s32>), %ptr1:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 151 %div:_(<4 x s32>) = G_SDIV %src1:_(<4 x s32>), %src2:_(<4 x s32>) 152 G_STORE %div:_(<4 x s32>), %ptr2:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 153... 154--- 155name: test_udiv_urem 156tracksRegLiveness: true 157body: | 158 bb.0: 159 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 160 ; CHECK-LABEL: name: test_udiv_urem 161 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 162 ; CHECK-NEXT: {{ $}} 163 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 164 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 165 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 166 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 167 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_UDIVREM %src1, %src2 168 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 169 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 170 %src1:_(s32) = COPY $vgpr0 171 %src2:_(s32) = COPY $vgpr1 172 %ptr1:_(p1) = COPY $vgpr2_vgpr3 173 %ptr2:_(p1) = COPY $vgpr4_vgpr5 174 %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32) 175 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 176 %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32) 177 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 178... 179--- 180name: test_udiv_urem_v2 181tracksRegLiveness: true 182body: | 183 bb.0: 184 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 185 ; CHECK-LABEL: name: test_udiv_urem_v2 186 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 187 ; CHECK-NEXT: {{ $}} 188 ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 189 ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 190 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5 191 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7 192 ; CHECK-NEXT: %div:_(<2 x s32>), %rem:_ = G_UDIVREM %src1, %src2 193 ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 194 ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 195 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 196 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 197 %ptr1:_(p1) = COPY $vgpr4_vgpr5 198 %ptr2:_(p1) = COPY $vgpr6_vgpr7 199 %div:_(<2 x s32>) = G_UDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 200 G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 201 %rem:_(<2 x s32>) = G_UREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 202 G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 203... 204--- 205name: test_udiv_urem_v4 206tracksRegLiveness: true 207body: | 208 bb.0: 209 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 210 ; CHECK-LABEL: name: test_udiv_urem_v4 211 ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 212 ; CHECK-NEXT: {{ $}} 213 ; CHECK-NEXT: %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 214 ; CHECK-NEXT: %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 215 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr8_vgpr9 216 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr10_vgpr11 217 ; CHECK-NEXT: %div:_(<4 x s32>), %rem:_ = G_UDIVREM %src1, %src2 218 ; CHECK-NEXT: G_STORE %div(<4 x s32>), %ptr1(p1) :: (store (<4 x s32>), align 4, addrspace 1) 219 ; CHECK-NEXT: G_STORE %rem(<4 x s32>), %ptr2(p1) :: (store (<4 x s32>), align 4, addrspace 1) 220 %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 221 %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 222 %ptr1:_(p1) = COPY $vgpr8_vgpr9 223 %ptr2:_(p1) = COPY $vgpr10_vgpr11 224 %div:_(<4 x s32>) = G_UDIV %src1:_(<4 x s32>), %src2:_(<4 x s32>) 225 G_STORE %div:_(<4 x s32>), %ptr1:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 226 %rem:_(<4 x s32>) = G_UREM %src1:_(<4 x s32>), %src2:_(<4 x s32>) 227 G_STORE %rem:_(<4 x s32>), %ptr2:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 228... 229--- 230name: test_urem_udiv 231tracksRegLiveness: true 232body: | 233 bb.0: 234 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 235 ; CHECK-LABEL: name: test_urem_udiv 236 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 237 ; CHECK-NEXT: {{ $}} 238 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 239 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 240 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 241 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 242 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_UDIVREM %src1, %src2 243 ; CHECK-NEXT: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1) 244 ; CHECK-NEXT: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1) 245 %src1:_(s32) = COPY $vgpr0 246 %src2:_(s32) = COPY $vgpr1 247 %ptr1:_(p1) = COPY $vgpr2_vgpr3 248 %ptr2:_(p1) = COPY $vgpr4_vgpr5 249 %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32) 250 G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 251 %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32) 252 G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 253... 254--- 255name: test_urem_udiv_v2 256tracksRegLiveness: true 257body: | 258 bb.0: 259 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 260 ; CHECK-LABEL: name: test_urem_udiv_v2 261 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 262 ; CHECK-NEXT: {{ $}} 263 ; CHECK-NEXT: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 264 ; CHECK-NEXT: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 265 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr4_vgpr5 266 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr6_vgpr7 267 ; CHECK-NEXT: %div:_(<2 x s32>), %rem:_ = G_UDIVREM %src1, %src2 268 ; CHECK-NEXT: G_STORE %rem(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 269 ; CHECK-NEXT: G_STORE %div(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 270 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 271 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 272 %ptr1:_(p1) = COPY $vgpr4_vgpr5 273 %ptr2:_(p1) = COPY $vgpr6_vgpr7 274 %rem:_(<2 x s32>) = G_UREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 275 G_STORE %rem:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 276 %div:_(<2 x s32>) = G_UDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 277 G_STORE %div:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 278... 279--- 280name: test_urem_udiv_v4 281tracksRegLiveness: true 282body: | 283 bb.0: 284 liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 285 ; CHECK-LABEL: name: test_urem_udiv_v4 286 ; CHECK: liveins: $vgpr0_vgpr1_vgpr2_vgpr3, $vgpr4_vgpr5_vgpr6_vgpr7, $vgpr8_vgpr9, $vgpr10_vgpr11 287 ; CHECK-NEXT: {{ $}} 288 ; CHECK-NEXT: %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 289 ; CHECK-NEXT: %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 290 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr8_vgpr9 291 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr10_vgpr11 292 ; CHECK-NEXT: %div:_(<4 x s32>), %rem:_ = G_UDIVREM %src1, %src2 293 ; CHECK-NEXT: G_STORE %rem(<4 x s32>), %ptr1(p1) :: (store (<4 x s32>), align 4, addrspace 1) 294 ; CHECK-NEXT: G_STORE %div(<4 x s32>), %ptr2(p1) :: (store (<4 x s32>), align 4, addrspace 1) 295 %src1:_(<4 x s32>) = COPY $vgpr0_vgpr1_vgpr2_vgpr3 296 %src2:_(<4 x s32>) = COPY $vgpr4_vgpr5_vgpr6_vgpr7 297 %ptr1:_(p1) = COPY $vgpr8_vgpr9 298 %ptr2:_(p1) = COPY $vgpr10_vgpr11 299 %rem:_(<4 x s32>) = G_UREM %src1:_(<4 x s32>), %src2:_(<4 x s32>) 300 G_STORE %rem:_(<4 x s32>), %ptr1:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 301 %div:_(<4 x s32>) = G_UDIV %src1:_(<4 x s32>), %src2:_(<4 x s32>) 302 G_STORE %div:_(<4 x s32>), %ptr2:_(p1) :: (store (<4 x s32>), addrspace 1, align 4) 303... 304--- 305name: test_sdiv_srem_extra_use 306tracksRegLiveness: true 307body: | 308 bb.0: 309 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 310 ; CHECK-LABEL: name: test_sdiv_srem_extra_use 311 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 312 ; CHECK-NEXT: {{ $}} 313 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 314 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 315 ; CHECK-NEXT: %ptr1:_(p1) = G_IMPLICIT_DEF 316 ; CHECK-NEXT: %ptr2:_(p1) = G_IMPLICIT_DEF 317 ; CHECK-NEXT: %ptr3:_(p1) = COPY $vgpr2_vgpr3 318 ; CHECK-NEXT: %ptr4:_(p1) = COPY $vgpr4_vgpr5 319 ; CHECK-NEXT: G_STORE %src1(s32), %ptr1(p1) :: (volatile store (s32) into `ptr addrspace(1) undef`, addrspace 1) 320 ; CHECK-NEXT: G_STORE %src2(s32), %ptr2(p1) :: (volatile store (s32) into `ptr addrspace(1) undef`, addrspace 1) 321 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_SDIVREM %src1, %src2 322 ; CHECK-NEXT: G_STORE %div(s32), %ptr3(p1) :: (store (s32), addrspace 1) 323 ; CHECK-NEXT: G_STORE %rem(s32), %ptr4(p1) :: (store (s32), addrspace 1) 324 %src1:_(s32) = COPY $vgpr0 325 %src2:_(s32) = COPY $vgpr1 326 %ptr1:_(p1) = G_IMPLICIT_DEF 327 %ptr2:_(p1) = G_IMPLICIT_DEF 328 %ptr3:_(p1) = COPY $vgpr2_vgpr3 329 %ptr4:_(p1) = COPY $vgpr4_vgpr5 330 G_STORE %src1:_(s32), %ptr1:_(p1) :: (volatile store (s32) into `ptr addrspace(1) undef`, addrspace 1) 331 G_STORE %src2:_(s32), %ptr2:_(p1) :: (volatile store (s32) into `ptr addrspace(1) undef`, addrspace 1) 332 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 333 G_STORE %div:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4) 334 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 335 G_STORE %rem:_(s32), %ptr4:_(p1) :: (store (s32), addrspace 1, align 4) 336... 337--- 338name: test_sdiv_srem_extra_sdiv 339tracksRegLiveness: true 340body: | 341 bb.0: 342 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 343 ; Combine the first sdiv/srem pair into sdivrem and retain the extra 344 ; sdiv instruction. 345 ; CHECK-LABEL: name: test_sdiv_srem_extra_sdiv 346 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 347 ; CHECK-NEXT: {{ $}} 348 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 349 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 350 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 351 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 352 ; CHECK-NEXT: %ptr3:_(p1) = COPY $vgpr6_vgpr7 353 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_SDIVREM %src1, %src2 354 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 355 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 356 ; CHECK-NEXT: %div2:_(s32) = G_SDIV %src1, %src2 357 ; CHECK-NEXT: G_STORE %div2(s32), %ptr3(p1) :: (store (s32), addrspace 1) 358 %src1:_(s32) = COPY $vgpr0 359 %src2:_(s32) = COPY $vgpr1 360 %ptr1:_(p1) = COPY $vgpr2_vgpr3 361 %ptr2:_(p1) = COPY $vgpr4_vgpr5 362 %ptr3:_(p1) = COPY $vgpr6_vgpr7 363 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 364 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 365 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 366 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 367 %div2:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 368 G_STORE %div2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4) 369... 370--- 371name: test_sdiv_srem_extra_srem 372tracksRegLiveness: true 373body: | 374 bb.0: 375 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 376 ; Combine the first sdiv/srem pair into sdivrem and retain the extra 377 ; srem instruction. 378 ; CHECK-LABEL: name: test_sdiv_srem_extra_srem 379 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 380 ; CHECK-NEXT: {{ $}} 381 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 382 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 383 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 384 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 385 ; CHECK-NEXT: %ptr3:_(p1) = COPY $vgpr6_vgpr7 386 ; CHECK-NEXT: %div:_(s32), %rem:_ = G_SDIVREM %src1, %src2 387 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 388 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 389 ; CHECK-NEXT: %rem2:_(s32) = G_SREM %src1, %src2 390 ; CHECK-NEXT: G_STORE %rem2(s32), %ptr3(p1) :: (store (s32), addrspace 1) 391 %src1:_(s32) = COPY $vgpr0 392 %src2:_(s32) = COPY $vgpr1 393 %ptr1:_(p1) = COPY $vgpr2_vgpr3 394 %ptr2:_(p1) = COPY $vgpr4_vgpr5 395 %ptr3:_(p1) = COPY $vgpr6_vgpr7 396 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 397 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 398 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 399 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 400 %rem2:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 401 G_STORE %rem2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4) 402... 403# Some negative tests. 404--- 405name: test_sdiv_srem_different_src_opnd2 406tracksRegLiveness: true 407body: | 408 bb.0: 409 liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3_vgpr4, $vgpr5_vgpr6 410 ; CHECK-LABEL: name: test_sdiv_srem_different_src_opnd2 411 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3_vgpr4, $vgpr5_vgpr6 412 ; CHECK-NEXT: {{ $}} 413 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 414 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 415 ; CHECK-NEXT: %src3:_(s32) = COPY $vgpr2 416 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr3_vgpr4 417 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr5_vgpr6 418 ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2 419 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 420 ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src3 421 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 422 %src1:_(s32) = COPY $vgpr0 423 %src2:_(s32) = COPY $vgpr1 424 %src3:_(s32) = COPY $vgpr2 425 %ptr1:_(p1) = COPY $vgpr3_vgpr4 426 %ptr2:_(p1) = COPY $vgpr5_vgpr6 427 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 428 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 429 %rem:_(s32) = G_SREM %src1:_(s32), %src3:_(s32) 430 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 431... 432--- 433name: test_sdiv_srem_src_opnds_swapped 434tracksRegLiveness: true 435body: | 436 bb.0: 437 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 438 ; CHECK-LABEL: name: test_sdiv_srem_src_opnds_swapped 439 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 440 ; CHECK-NEXT: {{ $}} 441 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 442 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 443 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 444 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 445 ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2 446 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 447 ; CHECK-NEXT: %rem:_(s32) = G_SREM %src2, %src1 448 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 449 %src1:_(s32) = COPY $vgpr0 450 %src2:_(s32) = COPY $vgpr1 451 %ptr1:_(p1) = COPY $vgpr2_vgpr3 452 %ptr2:_(p1) = COPY $vgpr4_vgpr5 453 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 454 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 455 %rem:_(s32) = G_SREM %src2:_(s32), %src1:_(s32) 456 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 457... 458--- 459name: test_sdiv_urem 460tracksRegLiveness: true 461body: | 462 bb.0: 463 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 464 ; CHECK-LABEL: name: test_sdiv_urem 465 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 466 ; CHECK-NEXT: {{ $}} 467 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 468 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 469 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 470 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 471 ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2 472 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 473 ; CHECK-NEXT: %rem:_(s32) = G_UREM %src1, %src2 474 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 475 %src1:_(s32) = COPY $vgpr0 476 %src2:_(s32) = COPY $vgpr1 477 %ptr1:_(p1) = COPY $vgpr2_vgpr3 478 %ptr2:_(p1) = COPY $vgpr4_vgpr5 479 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 480 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 481 %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32) 482 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 483... 484--- 485name: test_udiv_srem 486tracksRegLiveness: true 487body: | 488 bb.0: 489 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 490 ; CHECK-LABEL: name: test_udiv_srem 491 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 492 ; CHECK-NEXT: {{ $}} 493 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 494 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 495 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 496 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 497 ; CHECK-NEXT: %div:_(s32) = G_UDIV %src1, %src2 498 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 499 ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2 500 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 501 %src1:_(s32) = COPY $vgpr0 502 %src2:_(s32) = COPY $vgpr1 503 %ptr1:_(p1) = COPY $vgpr2_vgpr3 504 %ptr2:_(p1) = COPY $vgpr4_vgpr5 505 %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32) 506 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 507 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 508 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 509... 510--- 511name: test_sdiv_srem_different_blocks 512tracksRegLiveness: true 513body: | 514 ; CHECK-LABEL: name: test_sdiv_srem_different_blocks 515 ; CHECK: bb.0: 516 ; CHECK-NEXT: successors: %bb.1(0x80000000) 517 ; CHECK-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 518 ; CHECK-NEXT: {{ $}} 519 ; CHECK-NEXT: %src1:_(s32) = COPY $vgpr0 520 ; CHECK-NEXT: %src2:_(s32) = COPY $vgpr1 521 ; CHECK-NEXT: %ptr1:_(p1) = COPY $vgpr2_vgpr3 522 ; CHECK-NEXT: %div:_(s32) = G_SDIV %src1, %src2 523 ; CHECK-NEXT: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 524 ; CHECK-NEXT: S_BRANCH %bb.1 525 ; CHECK-NEXT: {{ $}} 526 ; CHECK-NEXT: bb.1: 527 ; CHECK-NEXT: liveins: $vgpr4_vgpr5 528 ; CHECK-NEXT: {{ $}} 529 ; CHECK-NEXT: %ptr2:_(p1) = COPY $vgpr4_vgpr5 530 ; CHECK-NEXT: %rem:_(s32) = G_SREM %src1, %src2 531 ; CHECK-NEXT: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 532 bb.0: 533 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 534 %src1:_(s32) = COPY $vgpr0 535 %src2:_(s32) = COPY $vgpr1 536 %ptr1:_(p1) = COPY $vgpr2_vgpr3 537 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 538 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 539 S_BRANCH %bb.1 540 bb.1: 541 liveins: $vgpr4_vgpr5 542 %ptr2:_(p1) = COPY $vgpr4_vgpr5 543 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 544 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 545... 546