1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=amdgpu-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s 3 4--- 5name: remove_and_255_zextload 6legalized: true 7tracksRegLiveness: true 8body: | 9 bb.0: 10 liveins: $vgpr0_vgpr1 11 ; CHECK-LABEL: name: remove_and_255_zextload 12 ; CHECK: liveins: $vgpr0_vgpr1 13 ; CHECK: %ptr:_(p1) = COPY $vgpr0_vgpr1 14 ; CHECK: %load:_(s32) = G_ZEXTLOAD %ptr(p1) :: (load 1, addrspace 1) 15 ; CHECK: $vgpr0 = COPY %load(s32) 16 %ptr:_(p1) = COPY $vgpr0_vgpr1 17 %load:_(s32) = G_ZEXTLOAD %ptr :: (load 1, addrspace 1, align 1) 18 %mask:_(s32) = G_CONSTANT i32 255 19 %and:_(s32) = G_AND %load, %mask 20 $vgpr0 = COPY %and 21 22... 23 24--- 25name: remove_and_255_smin_zextload 26legalized: true 27tracksRegLiveness: true 28body: | 29 bb.0: 30 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 31 ; CHECK-LABEL: name: remove_and_255_smin_zextload 32 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 33 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 34 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 35 ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1) 36 ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1) 37 ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1 38 ; CHECK: $vgpr0 = COPY %smin(s32) 39 %ptr0:_(p1) = COPY $vgpr0_vgpr1 40 %ptr1:_(p1) = COPY $vgpr2_vgpr3 41 %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1) 42 %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1) 43 %smin:_(s32) = G_SMIN %load0, %load1 44 %mask:_(s32) = G_CONSTANT i32 255 45 %and:_(s32) = G_AND %smin, %mask 46 $vgpr0 = COPY %and 47 48... 49 50--- 51name: remove_and_255_smax_zextload 52legalized: true 53tracksRegLiveness: true 54body: | 55 bb.0: 56 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 57 ; CHECK-LABEL: name: remove_and_255_smax_zextload 58 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 59 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 60 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 61 ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1) 62 ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1) 63 ; CHECK: %smax:_(s32) = G_SMAX %load0, %load1 64 ; CHECK: $vgpr0 = COPY %smax(s32) 65 %ptr0:_(p1) = COPY $vgpr0_vgpr1 66 %ptr1:_(p1) = COPY $vgpr2_vgpr3 67 %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1) 68 %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1) 69 %smax:_(s32) = G_SMAX %load0, %load1 70 %mask:_(s32) = G_CONSTANT i32 255 71 %and:_(s32) = G_AND %smax, %mask 72 $vgpr0 = COPY %and 73 74... 75 76--- 77name: remove_and_255_umin_zextload 78legalized: true 79tracksRegLiveness: true 80body: | 81 bb.0: 82 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 83 ; CHECK-LABEL: name: remove_and_255_umin_zextload 84 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 85 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 86 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 87 ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1) 88 ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1) 89 ; CHECK: %umin:_(s32) = G_UMIN %load0, %load1 90 ; CHECK: $vgpr0 = COPY %umin(s32) 91 %ptr0:_(p1) = COPY $vgpr0_vgpr1 92 %ptr1:_(p1) = COPY $vgpr2_vgpr3 93 %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1) 94 %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1) 95 %umin:_(s32) = G_UMIN %load0, %load1 96 %mask:_(s32) = G_CONSTANT i32 255 97 %and:_(s32) = G_AND %umin, %mask 98 $vgpr0 = COPY %and 99 100... 101 102--- 103name: remove_and_255_umax_zextload 104legalized: true 105tracksRegLiveness: true 106body: | 107 bb.0: 108 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 109 ; CHECK-LABEL: name: remove_and_255_umax_zextload 110 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 111 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 112 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 113 ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1) 114 ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1) 115 ; CHECK: %umax:_(s32) = G_UMAX %load0, %load1 116 ; CHECK: $vgpr0 = COPY %umax(s32) 117 %ptr0:_(p1) = COPY $vgpr0_vgpr1 118 %ptr1:_(p1) = COPY $vgpr2_vgpr3 119 %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1) 120 %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1) 121 %umax:_(s32) = G_UMAX %load0, %load1 122 %mask:_(s32) = G_CONSTANT i32 255 123 %and:_(s32) = G_AND %umax, %mask 124 $vgpr0 = COPY %and 125 126... 127 128# Don't have enough known bits for lhs 129--- 130name: remove_and_255_smin_fail_lhs 131legalized: true 132tracksRegLiveness: true 133body: | 134 bb.0: 135 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 136 ; CHECK-LABEL: name: remove_and_255_smin_fail_lhs 137 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 138 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 139 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 140 ; CHECK: %load0:_(s32) = G_LOAD %ptr0(p1) :: (load 4, addrspace 1) 141 ; CHECK: %load1:_(s32) = G_ZEXTLOAD %ptr1(p1) :: (load 1, addrspace 1) 142 ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1 143 ; CHECK: %mask:_(s32) = G_CONSTANT i32 255 144 ; CHECK: %and:_(s32) = G_AND %smin, %mask 145 ; CHECK: $vgpr0 = COPY %and(s32) 146 %ptr0:_(p1) = COPY $vgpr0_vgpr1 147 %ptr1:_(p1) = COPY $vgpr2_vgpr3 148 %load0:_(s32) = G_LOAD %ptr0 :: (load 4, addrspace 1, align 4) 149 %load1:_(s32) = G_ZEXTLOAD %ptr1 :: (load 1, addrspace 1, align 1) 150 %smin:_(s32) = G_SMIN %load0, %load1 151 %mask:_(s32) = G_CONSTANT i32 255 152 %and:_(s32) = G_AND %smin, %mask 153 $vgpr0 = COPY %and 154 155... 156 157# Don't have enough known bits for rhs 158--- 159name: remove_and_255_smin_fail_rhs 160legalized: true 161tracksRegLiveness: true 162body: | 163 bb.0: 164 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 165 ; CHECK-LABEL: name: remove_and_255_smin_fail_rhs 166 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3 167 ; CHECK: %ptr0:_(p1) = COPY $vgpr0_vgpr1 168 ; CHECK: %ptr1:_(p1) = COPY $vgpr2_vgpr3 169 ; CHECK: %load0:_(s32) = G_ZEXTLOAD %ptr0(p1) :: (load 1, addrspace 1) 170 ; CHECK: %load1:_(s32) = G_LOAD %ptr1(p1) :: (load 4, addrspace 1) 171 ; CHECK: %smin:_(s32) = G_SMIN %load0, %load1 172 ; CHECK: %mask:_(s32) = G_CONSTANT i32 255 173 ; CHECK: %and:_(s32) = G_AND %smin, %mask 174 ; CHECK: $vgpr0 = COPY %and(s32) 175 %ptr0:_(p1) = COPY $vgpr0_vgpr1 176 %ptr1:_(p1) = COPY $vgpr2_vgpr3 177 %load0:_(s32) = G_ZEXTLOAD %ptr0 :: (load 1, addrspace 1, align 1) 178 %load1:_(s32) = G_LOAD %ptr1 :: (load 4, addrspace 1, align 4) 179 %smin:_(s32) = G_SMIN %load0, %load1 180 %mask:_(s32) = G_CONSTANT i32 255 181 %and:_(s32) = G_AND %smin, %mask 182 $vgpr0 = COPY %and 183 184... 185 186# Test known bits for groupstaticsize is the maximum LDS size. 187--- 188name: remove_and_65535_groupstaticsize 189legalized: true 190tracksRegLiveness: true 191body: | 192 bb.0: 193 liveins: $vgpr0_vgpr1 194 ; CHECK-LABEL: name: remove_and_65535_groupstaticsize 195 ; CHECK: liveins: $vgpr0_vgpr1 196 ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 197 ; CHECK: %mask:_(s32) = G_CONSTANT i32 65535 198 ; CHECK: %and:_(s32) = G_AND %lds_size, %mask 199 ; CHECK: $vgpr0 = COPY %and(s32) 200 %ptr:_(p1) = COPY $vgpr0_vgpr1 201 %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 202 %mask:_(s32) = G_CONSTANT i32 65535 203 %and:_(s32) = G_AND %lds_size, %mask 204 $vgpr0 = COPY %and 205 206... 207 208--- 209name: remove_and_131071_groupstaticsize 210legalized: true 211tracksRegLiveness: true 212body: | 213 bb.0: 214 liveins: $vgpr0_vgpr1 215 ; CHECK-LABEL: name: remove_and_131071_groupstaticsize 216 ; CHECK: liveins: $vgpr0_vgpr1 217 ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 218 ; CHECK: $vgpr0 = COPY %lds_size(s32) 219 %ptr:_(p1) = COPY $vgpr0_vgpr1 220 %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 221 %mask:_(s32) = G_CONSTANT i32 131071 222 %and:_(s32) = G_AND %lds_size, %mask 223 $vgpr0 = COPY %and 224 225... 226 227--- 228name: no_remove_and_65536_groupstaticsize 229legalized: true 230tracksRegLiveness: true 231body: | 232 bb.0: 233 liveins: $vgpr0_vgpr1 234 ; CHECK-LABEL: name: no_remove_and_65536_groupstaticsize 235 ; CHECK: liveins: $vgpr0_vgpr1 236 ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 237 ; CHECK: %mask:_(s32) = G_CONSTANT i32 65536 238 ; CHECK: %and:_(s32) = G_AND %lds_size, %mask 239 ; CHECK: $vgpr0 = COPY %and(s32) 240 %ptr:_(p1) = COPY $vgpr0_vgpr1 241 %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 242 %mask:_(s32) = G_CONSTANT i32 65536 243 %and:_(s32) = G_AND %lds_size, %mask 244 $vgpr0 = COPY %and 245 246... 247 248--- 249name: no_remove_and_32767_groupstaticsize 250legalized: true 251tracksRegLiveness: true 252body: | 253 bb.0: 254 liveins: $vgpr0_vgpr1 255 ; CHECK-LABEL: name: no_remove_and_32767_groupstaticsize 256 ; CHECK: liveins: $vgpr0_vgpr1 257 ; CHECK: %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 258 ; CHECK: %mask:_(s32) = G_CONSTANT i32 32767 259 ; CHECK: %and:_(s32) = G_AND %lds_size, %mask 260 ; CHECK: $vgpr0 = COPY %and(s32) 261 %ptr:_(p1) = COPY $vgpr0_vgpr1 262 %lds_size:_(s32) = G_INTRINSIC intrinsic(@llvm.amdgcn.groupstaticsize) 263 %mask:_(s32) = G_CONSTANT i32 32767 264 %and:_(s32) = G_AND %lds_size, %mask 265 $vgpr0 = COPY %and 266 267... 268 269# We can conclude the number of bits based only on one operand 270--- 271name: remove_and_umin_lhs_only 272legalized: true 273tracksRegLiveness: true 274body: | 275 bb.0: 276 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4 277 278 ; CHECK-LABEL: name: remove_and_umin_lhs_only 279 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4 280 ; CHECK: %val:_(s32) = COPY $vgpr4 281 ; CHECK: %k255:_(s32) = G_CONSTANT i32 255 282 ; CHECK: %umin0:_(s32) = G_UMIN %val, %k255 283 ; CHECK: $vgpr0 = COPY %umin0(s32) 284 %ptr0:_(p1) = COPY $vgpr0_vgpr1 285 %ptr1:_(p1) = COPY $vgpr2_vgpr3 286 %val:_(s32) = COPY $vgpr4 287 %k255:_(s32) = G_CONSTANT i32 255 288 %umin0:_(s32) = G_UMIN %val, %k255 289 %and:_(s32) = G_AND %umin0, %k255 290 $vgpr0 = COPY %and 291 292... 293 294--- 295name: remove_and_umin_rhs_only 296legalized: true 297tracksRegLiveness: true 298body: | 299 bb.0: 300 liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4 301 302 ; CHECK-LABEL: name: remove_and_umin_rhs_only 303 ; CHECK: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4 304 ; CHECK: %val:_(s32) = COPY $vgpr4 305 ; CHECK: %k255:_(s32) = G_CONSTANT i32 255 306 ; CHECK: %umin0:_(s32) = G_UMIN %k255, %val 307 ; CHECK: $vgpr0 = COPY %umin0(s32) 308 %ptr0:_(p1) = COPY $vgpr0_vgpr1 309 %ptr1:_(p1) = COPY $vgpr2_vgpr3 310 %val:_(s32) = COPY $vgpr4 311 %k255:_(s32) = G_CONSTANT i32 255 312 %umin0:_(s32) = G_UMIN %k255, %val 313 %and:_(s32) = G_AND %umin0, %k255 314 $vgpr0 = COPY %and 315 316... 317