1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
llvm-mirror/test/CodeGen/AMDGPU/fold-readlane.mir
Matt Arsenault 495c7b3f90 AMDGPU: Fix folding immediate into readfirstlane through reg_sequence
The def instruction for the vreg may not match, because it may be
folding through a reg_sequence. The assert was overly conservative and
not necessary. It's not actually important if DefMI really defined the
register, because the fold that will be done cares about the def of
the value that will be folded.

For some reason copies aren't making it through the reg_sequence,
although they should.

llvm-svn: 363876
2019-06-19 20:44:15 +00:00

374 lines
11 KiB
YAML

# RUN: llc -march=amdgcn -run-pass si-fold-operands -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
# GCN-LABEL: name: fold-imm-readfirstlane{{$}}
# GCN: %1:sreg_32_xm0 = S_MOV_B32 123
---
name: fold-imm-readfirstlane
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# GCN-LABEL: name: fold-imm-readfirstlane-readfirstlane{{$}}
# GCN: %0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
# GCN: %1:sreg_32_xm0 = S_MOV_B32 123
# GCN: %2:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
# GCN: %3:sreg_32_xm0 = S_MOV_B32 123
---
name: fold-imm-readfirstlane-readfirstlane
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
%2:vgpr_32 = COPY %1
%3:sreg_32_xm0 = V_READFIRSTLANE_B32 %2, implicit $exec
...
# GCN-LABEL: name: fold-copy-readfirstlane{{$}}
# GCN: %0:sreg_32_xm0 = COPY $sgpr10
# GCN: %1:vgpr_32 = COPY %0
# GCN: %2:sreg_32_xm0 = COPY %1
---
name: fold-copy-readfirstlane
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10
%0:sreg_32_xm0 = COPY $sgpr10
%1:vgpr_32 = COPY %0
%2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec
...
# GCN-LABEL: name: no-fold-copy-readfirstlane-physreg0{{$}}
# GCN: %0:vgpr_32 = COPY $sgpr10
# GCN-NEXT: %1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
---
name: no-fold-copy-readfirstlane-physreg0
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10
%0:vgpr_32 = COPY $sgpr10
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# GCN-LABEL: name: no-fold-copy-readfirstlane-physreg1{{$}}
# GCN: $vgpr0 = COPY $sgpr10
# GCN-NEXT: %0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec
---
name: no-fold-copy-readfirstlane-physreg1
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10
$vgpr0 = COPY $sgpr10
%0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec
...
# GCN-LABEL: name: no-fold-imm-readfirstlane-physreg{{$}}
# GCN: $vgpr0 = V_MOV_B32_e32 123, implicit $exec
# GCN-NEXT: V_READFIRSTLANE_B32 $vgpr0, implicit $exec
---
name: no-fold-imm-readfirstlane-physreg
tracksRegLiveness: true
body: |
bb.0:
$vgpr0 = V_MOV_B32_e32 123, implicit $exec
%0:sreg_32_xm0 = V_READFIRSTLANE_B32 $vgpr0, implicit $exec
...
# TODO: This could be folded, if the search for exec modifications was
# smarter.
# GCN-LABEL: name: fold-imm-readfirstlane-cross-block{{$}}
# GCN: V_MOV_B32
# GCN: V_READFIRSTLANE_B32
---
name: fold-imm-readfirstlane-cross-block
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
bb.1:
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# TODO: This could be folded, if the search for exec modifications was
# smarter.
# GCN-LABEL: name: fold-copy-readfirstlane-cross-block{{$}}
# GCN: V_MOV_B32
# GCN: V_READFIRSTLANE_B32
---
name: fold-copy-readfirstlane-cross-block
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr12
%0:sreg_32_xm0 = COPY $sgpr12
%1:vgpr_32 = V_MOV_B32_e32 %0, implicit $exec
bb.1:
%2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec
...
# GCN-LABEL: name: fold-copy-readfirstlane-cross-block-exec-def{{$}}
# GCN: V_MOV_B32
# GCN: $exec = S_MOV_B64_term
# GCN: V_READFIRSTLANE_B32
---
name: fold-copy-readfirstlane-cross-block-exec-def
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10_sgpr11, $sgpr12
%0:sreg_32_xm0 = COPY $sgpr12
%1:vgpr_32 = V_MOV_B32_e32 %0, implicit $exec
$exec = S_MOV_B64_term $sgpr10_sgpr11
bb.1:
%2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec
...
# GCN-LABEL: name: fold-copy-readfirstlane-same-block-exec-def{{$}}
# GCN: COPY
# GCN-NEXT: %1:vgpr_32 = COPY %0
# GCN-NEXT: $exec = S_MOV_B64
# GCN-NEXT: V_READFIRSTLANE_B32
---
name: fold-copy-readfirstlane-same-block-exec-def
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10_sgpr11, $sgpr12
%0:sreg_32_xm0 = COPY $sgpr12
%1:vgpr_32 = COPY %0, implicit $exec
$exec = S_MOV_B64 $sgpr10_sgpr11
%2:sreg_32_xm0 = V_READFIRSTLANE_B32 %1, implicit $exec
...
# GCN-LABEL: name: fold-imm-readfirstlane-cross-block-exec-def{{$}}
# GCN: V_MOV_B32
# GCN: $exec = S_MOV_B64
# GCN: V_READFIRSTLANE_B32
---
name: fold-imm-readfirstlane-cross-block-exec-def
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10_sgpr11, $sgpr12_sgpr13
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
$exec = S_MOV_B64_term $sgpr10_sgpr11
bb.1:
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# GCN-LABEL: name: fold-imm-readfirstlane-same-block-exec-def{{$}}
# GCN: V_MOV_B32
# GCN-NEXT: $exec = S_MOV_B64
# GCN-NEXT: V_READFIRSTLANE_B32
---
name: fold-imm-readfirstlane-same-block-exec-def
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10_sgpr11
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
$exec = S_MOV_B64 $sgpr10_sgpr11
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# GCN-LABEL: name: fold-sgpr-copy-readfirstlane-same-block-exec-def{{$}}
# GCN: COPY
# GCN-NEXT: $exec = S_MOV_B64
# GCN-NEXT: V_READFIRSTLANE_B32
---
name: fold-sgpr-copy-readfirstlane-same-block-exec-def
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10_sgpr11, $sgpr12
%0:vgpr_32 = COPY $sgpr12
$exec = S_MOV_B64 $sgpr10_sgpr11
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
...
# GCN-LABEL: name: fold-imm-readfirstlane-user{{$}}
# GCN: %3:sreg_32_xm0 = S_MOV_B32 123
---
name: fold-imm-readfirstlane-user
tracksRegLiveness: true
body: |
bb.0:
liveins: $vgpr0, $sgpr0_sgpr1
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
%1:sreg_32_xm0 = V_READFIRSTLANE_B32 %0, implicit $exec
%2:sreg_32_xm0 = COPY %1
%3:sreg_32_xm0 = COPY %2
S_ENDPGM 0, implicit %3
...
# GCN-LABEL: name: fold-imm-readlane{{$}}
# GCN: %1:sreg_32_xm0 = S_MOV_B32 123
---
name: fold-imm-readlane
tracksRegLiveness: true
body: |
bb.0:
liveins: $vgpr0, $sgpr0_sgpr1
%0:vgpr_32 = V_MOV_B32_e32 123, implicit $exec
%1:sreg_32_xm0 = V_READLANE_B32 %0, 0, implicit $exec
...
# GCN-LABEL: name: fold-imm-readlane-src1{{$}}
# GCN: %0:vgpr_32 = COPY $vgpr0
# GCN: V_READLANE_B32 %0, 12, implicit $exec
---
name: fold-imm-readlane-src1
tracksRegLiveness: true
body: |
bb.0:
liveins: $vgpr0
%0:vgpr_32 = COPY $vgpr0
%1:sreg_32_xm0 = S_MOV_B32 12
%2:sreg_32_xm0 = V_READLANE_B32 %0, %1, implicit $exec
...
# Constant for subreg0
# GCN-LABEL: name: fold-imm-readfirstlane-regsequence0{{$}}
# GCN: %0:vgpr_32 = COPY $vgpr0
# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1
# GCN-NEXT: %3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0, implicit $exec
# GCN-NEXT: %4:sgpr_32 = S_MOV_B32 0
---
name: fold-imm-readfirstlane-regsequence0
tracksRegLiveness: true
body: |
bb.0:
liveins: $vgpr0
%0:vgpr_32 = COPY $vgpr0
%1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
%2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1
%3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec
%4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec
...
# Constant for subreg1
# GCN-LABEL: name: fold-imm-readfirstlane-regsequence1{{$}}
# GCN: %0:vgpr_32 = COPY $vgpr0
# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %1, %subreg.sub0, killed %0, %subreg.sub1
# GCN-NEXT: %3:sgpr_32 = S_MOV_B32 0
# GCN-NEXT: %4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1, implicit $exec
---
name: fold-imm-readfirstlane-regsequence1
tracksRegLiveness: true
body: |
bb.0:
liveins: $vgpr0
%0:vgpr_32 = COPY $vgpr0
%1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
%2:vreg_64 = REG_SEQUENCE %1:vgpr_32, %subreg.sub0, killed %0:vgpr_32, %subreg.sub1
%3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec
%4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec
...
# Different constant regs for each subreg
# GCN-LABEL: name: fold-imm-readfirstlane-regsequence2{{$}}
# GCN: %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 1, implicit $exec
# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1
# GCN-NEXT: %3:sgpr_32 = S_MOV_B32 0
# GCN-NEXT: %4:sgpr_32 = S_MOV_B32 1
---
name: fold-imm-readfirstlane-regsequence2
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
%1:vgpr_32 = V_MOV_B32_e32 1, implicit $exec
%2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1
%3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec
%4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec
...
# Same constant reg for each subreg, so there are multiple constant uses
# GCN-LABEL: name: fold-imm-readfirstlane-regsequence3{{$}}
# GCN: %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
# GCN-NEXT: %1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1
# GCN-NEXT: %3:sgpr_32 = S_MOV_B32 0
# GCN-NEXT: %4:sgpr_32 = S_MOV_B32 0
---
name: fold-imm-readfirstlane-regsequence3
tracksRegLiveness: true
body: |
bb.0:
%0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
%1:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
%2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1
%3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec
%4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec
...
# FIXME: This should fold
# GCN-LABEL: name: fold-copy-readfirstlane-regsequence0{{$}}
# GCN: %0:vgpr_32 = COPY $sgpr10
# GCN-NEXT: %1:vgpr_32 = COPY $sgpr11
# GCN-NEXT: %2:vreg_64 = REG_SEQUENCE %0, %subreg.sub0, killed %1, %subreg.sub1
# GCN-NEXT: %3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0, implicit $exec
# GCN-NEXT: %4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1, implicit $exec
---
name: fold-copy-readfirstlane-regsequence0
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10, $sgpr11
%0:vgpr_32 = COPY $sgpr10
%1:vgpr_32 = COPY $sgpr11
%2:vreg_64 = REG_SEQUENCE %0:vgpr_32, %subreg.sub0, killed %1:vgpr_32, %subreg.sub1
%3:sgpr_32 = V_READFIRSTLANE_B32 %2.sub0:vreg_64, implicit $exec
%4:sgpr_32 = V_READFIRSTLANE_B32 %2.sub1:vreg_64, implicit $exec
...
# GCN-LABEL: name: fold-copy-readfirstlane-regsequence1{{$}}
# GCN: %0:sreg_32_xm0 = COPY $sgpr10
# GCN-NEXT: %1:sreg_32_xm0 = COPY $sgpr11
# GCN-NEXT: %2:vgpr_32 = COPY %0
# GCN-NEXT: %3:vgpr_32 = COPY %1
# GCN-NEXT: %4:vreg_64 = REG_SEQUENCE %2, %subreg.sub0, killed %3, %subreg.sub1
# GCN-NEXT: %5:sgpr_32 = V_READFIRSTLANE_B32 %4.sub0, implicit $exec
# GCN-NEXT: %6:sgpr_32 = V_READFIRSTLANE_B32 %4.sub1, implicit $exec
---
name: fold-copy-readfirstlane-regsequence1
tracksRegLiveness: true
body: |
bb.0:
liveins: $sgpr10, $sgpr11
%0:sreg_32_xm0 = COPY $sgpr10
%1:sreg_32_xm0 = COPY $sgpr11
%2:vgpr_32 = COPY %0
%3:vgpr_32 = COPY %1
%4:vreg_64 = REG_SEQUENCE %2:vgpr_32, %subreg.sub0, killed %3:vgpr_32, %subreg.sub1
%5:sgpr_32 = V_READFIRSTLANE_B32 %4.sub0:vreg_64, implicit $exec
%6:sgpr_32 = V_READFIRSTLANE_B32 %4.sub1:vreg_64, implicit $exec
...