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-postlegalizer-combiner -verify-machineinstrs -o - %s | FileCheck %s 3 4# Post-legalizer should not generate divrem instruction. 5--- 6name: test_sdiv_srem 7tracksRegLiveness: true 8legalized: true 9body: | 10 bb.0: 11 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 12 ; CHECK-LABEL: name: test_sdiv_srem 13 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 14 ; CHECK: %src1:_(s32) = COPY $vgpr0 15 ; CHECK: %src2:_(s32) = COPY $vgpr1 16 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 17 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 18 ; CHECK: %div:_(s32) = G_SDIV %src1, %src2 19 ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 20 ; CHECK: %rem:_(s32) = G_SREM %src1, %src2 21 ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 22 %src1:_(s32) = COPY $vgpr0 23 %src2:_(s32) = COPY $vgpr1 24 %ptr1:_(p1) = COPY $vgpr2_vgpr3 25 %ptr2:_(p1) = COPY $vgpr4_vgpr5 26 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 27 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 28 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 29 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 30... 31--- 32name: test_srem_sdiv 33tracksRegLiveness: true 34legalized: true 35body: | 36 bb.0: 37 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 38 ; CHECK-LABEL: name: test_srem_sdiv 39 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 40 ; CHECK: %src1:_(s32) = COPY $vgpr0 41 ; CHECK: %src2:_(s32) = COPY $vgpr1 42 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 43 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 44 ; CHECK: %rem:_(s32) = G_SREM %src1, %src2 45 ; CHECK: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1) 46 ; CHECK: %div:_(s32) = G_SDIV %src1, %src2 47 ; CHECK: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1) 48 %src1:_(s32) = COPY $vgpr0 49 %src2:_(s32) = COPY $vgpr1 50 %ptr1:_(p1) = COPY $vgpr2_vgpr3 51 %ptr2:_(p1) = COPY $vgpr4_vgpr5 52 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 53 G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 54 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 55 G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 56... 57--- 58name: test_udiv_urem 59tracksRegLiveness: true 60legalized: true 61body: | 62 bb.0: 63 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 64 ; CHECK-LABEL: name: test_udiv_urem 65 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 66 ; CHECK: %src1:_(s32) = COPY $vgpr0 67 ; CHECK: %src2:_(s32) = COPY $vgpr1 68 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 69 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 70 ; CHECK: %div:_(s32) = G_UDIV %src1, %src2 71 ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 72 ; CHECK: %rem:_(s32) = G_UREM %src1, %src2 73 ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 74 %src1:_(s32) = COPY $vgpr0 75 %src2:_(s32) = COPY $vgpr1 76 %ptr1:_(p1) = COPY $vgpr2_vgpr3 77 %ptr2:_(p1) = COPY $vgpr4_vgpr5 78 %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32) 79 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 80 %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32) 81 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 82... 83--- 84name: test_urem_udiv 85tracksRegLiveness: true 86legalized: true 87body: | 88 bb.0: 89 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 90 ; CHECK-LABEL: name: test_urem_udiv 91 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5 92 ; CHECK: %src1:_(s32) = COPY $vgpr0 93 ; CHECK: %src2:_(s32) = COPY $vgpr1 94 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 95 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 96 ; CHECK: %rem:_(s32) = G_UREM %src1, %src2 97 ; CHECK: G_STORE %rem(s32), %ptr1(p1) :: (store (s32), addrspace 1) 98 ; CHECK: %div:_(s32) = G_UDIV %src1, %src2 99 ; CHECK: G_STORE %div(s32), %ptr2(p1) :: (store (s32), addrspace 1) 100 %src1:_(s32) = COPY $vgpr0 101 %src2:_(s32) = COPY $vgpr1 102 %ptr1:_(p1) = COPY $vgpr2_vgpr3 103 %ptr2:_(p1) = COPY $vgpr4_vgpr5 104 %rem:_(s32) = G_UREM %src1:_(s32), %src2:_(s32) 105 G_STORE %rem:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 106 %div:_(s32) = G_UDIV %src1:_(s32), %src2:_(s32) 107 G_STORE %div:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 108... 109--- 110name: test_sdiv_srem_v2 111tracksRegLiveness: true 112legalized: true 113body: | 114 bb.0: 115 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 116 ; CHECK-LABEL: name: test_sdiv_srem_v2 117 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 118 ; CHECK: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 119 ; CHECK: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 120 ; CHECK: %ptr1:_(p1) = COPY $vgpr4_vgpr5 121 ; CHECK: %ptr2:_(p1) = COPY $vgpr6_vgpr7 122 ; CHECK: %div:_(<2 x s32>) = G_SDIV %src1, %src2 123 ; CHECK: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 124 ; CHECK: %rem:_(<2 x s32>) = G_SREM %src1, %src2 125 ; CHECK: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 126 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 127 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 128 %ptr1:_(p1) = COPY $vgpr4_vgpr5 129 %ptr2:_(p1) = COPY $vgpr6_vgpr7 130 %div:_(<2 x s32>) = G_SDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 131 G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 132 %rem:_(<2 x s32>) = G_SREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 133 G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 134... 135--- 136name: test_udiv_urem_v2 137tracksRegLiveness: true 138legalized: true 139body: | 140 bb.0: 141 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 142 ; CHECK-LABEL: name: test_udiv_urem_v2 143 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 144 ; CHECK: %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 145 ; CHECK: %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 146 ; CHECK: %ptr1:_(p1) = COPY $vgpr4_vgpr5 147 ; CHECK: %ptr2:_(p1) = COPY $vgpr6_vgpr7 148 ; CHECK: %div:_(<2 x s32>) = G_UDIV %src1, %src2 149 ; CHECK: G_STORE %div(<2 x s32>), %ptr1(p1) :: (store (<2 x s32>), align 4, addrspace 1) 150 ; CHECK: %rem:_(<2 x s32>) = G_UREM %src1, %src2 151 ; CHECK: G_STORE %rem(<2 x s32>), %ptr2(p1) :: (store (<2 x s32>), align 4, addrspace 1) 152 %src1:_(<2 x s32>) = COPY $vgpr0_vgpr1 153 %src2:_(<2 x s32>) = COPY $vgpr2_vgpr3 154 %ptr1:_(p1) = COPY $vgpr4_vgpr5 155 %ptr2:_(p1) = COPY $vgpr6_vgpr7 156 %div:_(<2 x s32>) = G_UDIV %src1:_(<2 x s32>), %src2:_(<2 x s32>) 157 G_STORE %div:_(<2 x s32>), %ptr1:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 158 %rem:_(<2 x s32>) = G_UREM %src1:_(<2 x s32>), %src2:_(<2 x s32>) 159 G_STORE %rem:_(<2 x s32>), %ptr2:_(p1) :: (store (<2 x s32>), addrspace 1, align 4) 160... 161--- 162name: test_sdiv_srem_extra_sdiv 163tracksRegLiveness: true 164legalized: true 165body: | 166 bb.0: 167 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 168 ; CHECK-LABEL: name: test_sdiv_srem_extra_sdiv 169 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 170 ; CHECK: %src1:_(s32) = COPY $vgpr0 171 ; CHECK: %src2:_(s32) = COPY $vgpr1 172 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 173 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 174 ; CHECK: %ptr3:_(p1) = COPY $vgpr6_vgpr7 175 ; CHECK: %div:_(s32) = G_SDIV %src1, %src2 176 ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 177 ; CHECK: %rem:_(s32) = G_SREM %src1, %src2 178 ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 179 ; CHECK: %div2:_(s32) = G_SDIV %src1, %src2 180 ; CHECK: G_STORE %div2(s32), %ptr3(p1) :: (store (s32), addrspace 1) 181 %src1:_(s32) = COPY $vgpr0 182 %src2:_(s32) = COPY $vgpr1 183 %ptr1:_(p1) = COPY $vgpr2_vgpr3 184 %ptr2:_(p1) = COPY $vgpr4_vgpr5 185 %ptr3:_(p1) = COPY $vgpr6_vgpr7 186 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 187 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 188 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 189 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 190 %div2:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 191 G_STORE %div2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4) 192... 193--- 194name: test_sdiv_srem_extra_srem 195tracksRegLiveness: true 196legalized: true 197body: | 198 bb.0: 199 liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 200 ; CHECK-LABEL: name: test_sdiv_srem_extra_srem 201 ; CHECK: liveins: $vgpr0, $vgpr1, $vgpr2_vgpr3, $vgpr4_vgpr5, $vgpr6_vgpr7 202 ; CHECK: %src1:_(s32) = COPY $vgpr0 203 ; CHECK: %src2:_(s32) = COPY $vgpr1 204 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 205 ; CHECK: %ptr2:_(p1) = COPY $vgpr4_vgpr5 206 ; CHECK: %ptr3:_(p1) = COPY $vgpr6_vgpr7 207 ; CHECK: %div:_(s32) = G_SDIV %src1, %src2 208 ; CHECK: G_STORE %div(s32), %ptr1(p1) :: (store (s32), addrspace 1) 209 ; CHECK: %rem:_(s32) = G_SREM %src1, %src2 210 ; CHECK: G_STORE %rem(s32), %ptr2(p1) :: (store (s32), addrspace 1) 211 ; CHECK: %rem2:_(s32) = G_SREM %src1, %src2 212 ; CHECK: G_STORE %rem2(s32), %ptr3(p1) :: (store (s32), addrspace 1) 213 %src1:_(s32) = COPY $vgpr0 214 %src2:_(s32) = COPY $vgpr1 215 %ptr1:_(p1) = COPY $vgpr2_vgpr3 216 %ptr2:_(p1) = COPY $vgpr4_vgpr5 217 %ptr3:_(p1) = COPY $vgpr6_vgpr7 218 %div:_(s32) = G_SDIV %src1:_(s32), %src2:_(s32) 219 G_STORE %div:_(s32), %ptr1:_(p1) :: (store (s32), addrspace 1, align 4) 220 %rem:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 221 G_STORE %rem:_(s32), %ptr2:_(p1) :: (store (s32), addrspace 1, align 4) 222 %rem2:_(s32) = G_SREM %src1:_(s32), %src2:_(s32) 223 G_STORE %rem2:_(s32), %ptr3:_(p1) :: (store (s32), addrspace 1, align 4) 224... 225