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