1# RUN: llc -march=amdgcn -run-pass peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s 2 3--- | 4 define amdgpu_kernel void @no_fold_imm_madak_mac_clamp_f32() #0 { 5 ret void 6 } 7 8 define amdgpu_kernel void @no_fold_imm_madak_mac_omod_f32() #0 { 9 ret void 10 } 11 12 define amdgpu_kernel void @no_fold_imm_madak_mad_clamp_f32() #0 { 13 ret void 14 } 15 16 define amdgpu_kernel void @no_fold_imm_madak_mad_omod_f32() #0 { 17 ret void 18 } 19 20 attributes #0 = { nounwind } 21 22... 23--- 24# GCN-LABEL: name: no_fold_imm_madak_mac_clamp_f32 25# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec 26# GCN-NEXT: %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec 27 28name: no_fold_imm_madak_mac_clamp_f32 29tracksRegLiveness: true 30registers: 31 - { id: 0, class: sgpr_64 } 32 - { id: 1, class: sreg_32_xm0 } 33 - { id: 2, class: sgpr_32 } 34 - { id: 3, class: vgpr_32 } 35 - { id: 4, class: sreg_64_xexec } 36 - { id: 5, class: sreg_64_xexec } 37 - { id: 6, class: sreg_64_xexec } 38 - { id: 7, class: sreg_32 } 39 - { id: 8, class: sreg_32 } 40 - { id: 9, class: sreg_32_xm0 } 41 - { id: 10, class: sreg_64 } 42 - { id: 11, class: sreg_32_xm0 } 43 - { id: 12, class: sreg_32_xm0 } 44 - { id: 13, class: sgpr_64 } 45 - { id: 14, class: sgpr_128 } 46 - { id: 15, class: sreg_32_xm0 } 47 - { id: 16, class: sreg_64 } 48 - { id: 17, class: sgpr_128 } 49 - { id: 18, class: sgpr_128 } 50 - { id: 19, class: vgpr_32 } 51 - { id: 20, class: vreg_64 } 52 - { id: 21, class: vgpr_32 } 53 - { id: 22, class: vreg_64 } 54 - { id: 23, class: vgpr_32 } 55 - { id: 24, class: vgpr_32 } 56 - { id: 25, class: vgpr_32 } 57 - { id: 26, class: vreg_64 } 58 - { id: 27, class: vgpr_32 } 59 - { id: 28, class: vreg_64 } 60 - { id: 29, class: vreg_64 } 61liveins: 62 - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' } 63 - { reg: '%vgpr0', virtual-reg: '%3' } 64body: | 65 bb.0 (%ir-block.0): 66 liveins: %sgpr0_sgpr1, %vgpr0 67 68 %3 = COPY %vgpr0 69 %0 = COPY %sgpr0_sgpr1 70 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 71 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 72 %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 73 %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec 74 %28 = REG_SEQUENCE %3, 1, %27, 2 75 %11 = S_MOV_B32 61440 76 %12 = S_MOV_B32 0 77 %13 = REG_SEQUENCE killed %12, 1, killed %11, 2 78 %14 = REG_SEQUENCE killed %5, 17, %13, 18 79 %15 = S_MOV_B32 2 80 %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec 81 %17 = REG_SEQUENCE killed %6, 17, %13, 18 82 %18 = REG_SEQUENCE killed %4, 17, %13, 18 83 %20 = COPY %29 84 %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec 85 %22 = COPY %29 86 %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec 87 %23 = V_MOV_B32_e32 1090519040, implicit %exec 88 %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec 89 %26 = COPY %29 90 BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec 91 S_ENDPGM 92 93... 94--- 95# GCN-LABEL: name: no_fold_imm_madak_mac_omod_f32 96# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec 97# GCN: %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 0, 2, implicit %exec 98 99name: no_fold_imm_madak_mac_omod_f32 100tracksRegLiveness: true 101registers: 102 - { id: 0, class: sgpr_64 } 103 - { id: 1, class: sreg_32_xm0 } 104 - { id: 2, class: sgpr_32 } 105 - { id: 3, class: vgpr_32 } 106 - { id: 4, class: sreg_64_xexec } 107 - { id: 5, class: sreg_64_xexec } 108 - { id: 6, class: sreg_64_xexec } 109 - { id: 7, class: sreg_32 } 110 - { id: 8, class: sreg_32 } 111 - { id: 9, class: sreg_32_xm0 } 112 - { id: 10, class: sreg_64 } 113 - { id: 11, class: sreg_32_xm0 } 114 - { id: 12, class: sreg_32_xm0 } 115 - { id: 13, class: sgpr_64 } 116 - { id: 14, class: sgpr_128 } 117 - { id: 15, class: sreg_32_xm0 } 118 - { id: 16, class: sreg_64 } 119 - { id: 17, class: sgpr_128 } 120 - { id: 18, class: sgpr_128 } 121 - { id: 19, class: vgpr_32 } 122 - { id: 20, class: vreg_64 } 123 - { id: 21, class: vgpr_32 } 124 - { id: 22, class: vreg_64 } 125 - { id: 23, class: vgpr_32 } 126 - { id: 24, class: vgpr_32 } 127 - { id: 25, class: vgpr_32 } 128 - { id: 26, class: vreg_64 } 129 - { id: 27, class: vgpr_32 } 130 - { id: 28, class: vreg_64 } 131 - { id: 29, class: vreg_64 } 132liveins: 133 - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' } 134 - { reg: '%vgpr0', virtual-reg: '%3' } 135body: | 136 bb.0 (%ir-block.0): 137 liveins: %sgpr0_sgpr1, %vgpr0 138 139 %3 = COPY %vgpr0 140 %0 = COPY %sgpr0_sgpr1 141 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 142 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 143 %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 144 %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec 145 %28 = REG_SEQUENCE %3, 1, %27, 2 146 %11 = S_MOV_B32 61440 147 %12 = S_MOV_B32 0 148 %13 = REG_SEQUENCE killed %12, 1, killed %11, 2 149 %14 = REG_SEQUENCE killed %5, 17, %13, 18 150 %15 = S_MOV_B32 2 151 %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec 152 %17 = REG_SEQUENCE killed %6, 17, %13, 18 153 %18 = REG_SEQUENCE killed %4, 17, %13, 18 154 %20 = COPY %29 155 %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec 156 %22 = COPY %29 157 %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec 158 %23 = V_MOV_B32_e32 1090519040, implicit %exec 159 %24 = V_MAC_F32_e64 0, killed %19, 0, killed %21, 0, %23, 0, 2, implicit %exec 160 %26 = COPY %29 161 BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec 162 S_ENDPGM 163 164... 165--- 166# GCN: name: no_fold_imm_madak_mad_clamp_f32 167# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec 168# GCN: %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec 169 170name: no_fold_imm_madak_mad_clamp_f32 171tracksRegLiveness: true 172registers: 173 - { id: 0, class: sgpr_64 } 174 - { id: 1, class: sreg_32_xm0 } 175 - { id: 2, class: sgpr_32 } 176 - { id: 3, class: vgpr_32 } 177 - { id: 4, class: sreg_64_xexec } 178 - { id: 5, class: sreg_64_xexec } 179 - { id: 6, class: sreg_64_xexec } 180 - { id: 7, class: sreg_32 } 181 - { id: 8, class: sreg_32 } 182 - { id: 9, class: sreg_32_xm0 } 183 - { id: 10, class: sreg_64 } 184 - { id: 11, class: sreg_32_xm0 } 185 - { id: 12, class: sreg_32_xm0 } 186 - { id: 13, class: sgpr_64 } 187 - { id: 14, class: sgpr_128 } 188 - { id: 15, class: sreg_32_xm0 } 189 - { id: 16, class: sreg_64 } 190 - { id: 17, class: sgpr_128 } 191 - { id: 18, class: sgpr_128 } 192 - { id: 19, class: vgpr_32 } 193 - { id: 20, class: vreg_64 } 194 - { id: 21, class: vgpr_32 } 195 - { id: 22, class: vreg_64 } 196 - { id: 23, class: vgpr_32 } 197 - { id: 24, class: vgpr_32 } 198 - { id: 25, class: vgpr_32 } 199 - { id: 26, class: vreg_64 } 200 - { id: 27, class: vgpr_32 } 201 - { id: 28, class: vreg_64 } 202 - { id: 29, class: vreg_64 } 203liveins: 204 - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' } 205 - { reg: '%vgpr0', virtual-reg: '%3' } 206body: | 207 bb.0 (%ir-block.0): 208 liveins: %sgpr0_sgpr1, %vgpr0 209 210 %3 = COPY %vgpr0 211 %0 = COPY %sgpr0_sgpr1 212 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 213 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 214 %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 215 %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec 216 %28 = REG_SEQUENCE %3, 1, %27, 2 217 %11 = S_MOV_B32 61440 218 %12 = S_MOV_B32 0 219 %13 = REG_SEQUENCE killed %12, 1, killed %11, 2 220 %14 = REG_SEQUENCE killed %5, 17, %13, 18 221 %15 = S_MOV_B32 2 222 %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec 223 %17 = REG_SEQUENCE killed %6, 17, %13, 18 224 %18 = REG_SEQUENCE killed %4, 17, %13, 18 225 %20 = COPY %29 226 %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec 227 %22 = COPY %29 228 %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec 229 %23 = V_MOV_B32_e32 1090519040, implicit %exec 230 %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 1, 0, implicit %exec 231 %26 = COPY %29 232 BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec 233 S_ENDPGM 234 235... 236--- 237# GCN: name: no_fold_imm_madak_mad_omod_f32 238# GCN: %23 = V_MOV_B32_e32 1090519040, implicit %exec 239# GCN: %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 0, 1, implicit %exec 240 241name: no_fold_imm_madak_mad_omod_f32 242tracksRegLiveness: true 243registers: 244 - { id: 0, class: sgpr_64 } 245 - { id: 1, class: sreg_32_xm0 } 246 - { id: 2, class: sgpr_32 } 247 - { id: 3, class: vgpr_32 } 248 - { id: 4, class: sreg_64_xexec } 249 - { id: 5, class: sreg_64_xexec } 250 - { id: 6, class: sreg_64_xexec } 251 - { id: 7, class: sreg_32 } 252 - { id: 8, class: sreg_32 } 253 - { id: 9, class: sreg_32_xm0 } 254 - { id: 10, class: sreg_64 } 255 - { id: 11, class: sreg_32_xm0 } 256 - { id: 12, class: sreg_32_xm0 } 257 - { id: 13, class: sgpr_64 } 258 - { id: 14, class: sgpr_128 } 259 - { id: 15, class: sreg_32_xm0 } 260 - { id: 16, class: sreg_64 } 261 - { id: 17, class: sgpr_128 } 262 - { id: 18, class: sgpr_128 } 263 - { id: 19, class: vgpr_32 } 264 - { id: 20, class: vreg_64 } 265 - { id: 21, class: vgpr_32 } 266 - { id: 22, class: vreg_64 } 267 - { id: 23, class: vgpr_32 } 268 - { id: 24, class: vgpr_32 } 269 - { id: 25, class: vgpr_32 } 270 - { id: 26, class: vreg_64 } 271 - { id: 27, class: vgpr_32 } 272 - { id: 28, class: vreg_64 } 273 - { id: 29, class: vreg_64 } 274liveins: 275 - { reg: '%sgpr0_sgpr1', virtual-reg: '%0' } 276 - { reg: '%vgpr0', virtual-reg: '%3' } 277body: | 278 bb.0 (%ir-block.0): 279 liveins: %sgpr0_sgpr1, %vgpr0 280 281 %3 = COPY %vgpr0 282 %0 = COPY %sgpr0_sgpr1 283 %4 = S_LOAD_DWORDX2_IMM %0, 9, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 284 %5 = S_LOAD_DWORDX2_IMM %0, 11, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 285 %6 = S_LOAD_DWORDX2_IMM %0, 13, 0 :: (non-temporal dereferenceable invariant load 8 from `i64 addrspace(2)* undef`) 286 %27 = V_ASHRREV_I32_e32 31, %3, implicit %exec 287 %28 = REG_SEQUENCE %3, 1, %27, 2 288 %11 = S_MOV_B32 61440 289 %12 = S_MOV_B32 0 290 %13 = REG_SEQUENCE killed %12, 1, killed %11, 2 291 %14 = REG_SEQUENCE killed %5, 17, %13, 18 292 %15 = S_MOV_B32 2 293 %29 = V_LSHL_B64 killed %28, killed %15, implicit %exec 294 %17 = REG_SEQUENCE killed %6, 17, %13, 18 295 %18 = REG_SEQUENCE killed %4, 17, %13, 18 296 %20 = COPY %29 297 %19 = BUFFER_LOAD_DWORD_ADDR64 %20, killed %14, 0, 0, 0, 0, 0, implicit %exec 298 %22 = COPY %29 299 %21 = BUFFER_LOAD_DWORD_ADDR64 %22, killed %17, 0, 0, 0, 0, 0, implicit %exec 300 %23 = V_MOV_B32_e32 1090519040, implicit %exec 301 %24 = V_MAD_F32 0, killed %19, 0, killed %21, 0, %23, 0, 1, implicit %exec 302 %26 = COPY %29 303 BUFFER_STORE_DWORD_ADDR64 killed %24, %26, killed %18, 0, 0, 0, 0, 0, implicit %exec 304 S_ENDPGM 305 306... 307