diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-08 01:22:47 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-08 01:22:47 +0000 |
| commit | adc40baa29a1c16cde63c4bf857afea0eb7b476e (patch) | |
| tree | 9e64494325d8fb79a503a06b494779d71c68479b /llvm/test/CodeGen/AMDGPU | |
| parent | 8e2bac8e7f77a906a407d73524b2d14304d785dd (diff) | |
| download | bcm5719-llvm-adc40baa29a1c16cde63c4bf857afea0eb7b476e.tar.gz bcm5719-llvm-adc40baa29a1c16cde63c4bf857afea0eb7b476e.zip | |
RegBankSelect: Fix copy insertion point for terminators
If a copy was needed to handle the condition of brcond, it was being
inserted before the defining instruction. Add tests for iterator edge
cases.
I find the existing code here suspect for the case where it's looking
for terminators that modify the register. It's going to insert a copy
in the middle of the terminators, which isn't allowed (it might be
necessary to have a COPY_terminator if anybody actually needs this).
Also legalize brcond for AMDGPU.
llvm-svn: 350595
Diffstat (limited to 'llvm/test/CodeGen/AMDGPU')
| -rw-r--r-- | llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-brcond.mir | 24 | ||||
| -rw-r--r-- | llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-brcond.mir | 179 |
2 files changed, 203 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-brcond.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-brcond.mir new file mode 100644 index 00000000000..eb8b34915f5 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/legalize-brcond.mir @@ -0,0 +1,24 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji -O0 -run-pass=legalizer %s -o - | FileCheck %s + +--- +name: legal_brcond +body: | + ; CHECK-LABEL: name: legal_brcond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1 + ; CHECK: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: bb.1: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0, $vgpr1 + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s1) = G_ICMP intpred(ne), %0, %1 + G_BRCOND %2, %bb.1 + + bb.1: +... diff --git a/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-brcond.mir b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-brcond.mir new file mode 100644 index 00000000000..b973943f0c6 --- /dev/null +++ b/llvm/test/CodeGen/AMDGPU/GlobalISel/regbankselect-brcond.mir @@ -0,0 +1,179 @@ +# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py +# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-fast | FileCheck %s +# RUN: llc -march=amdgcn -mcpu=fiji -run-pass=regbankselect %s -verify-machineinstrs -o - -regbankselect-greedy | FileCheck %s + +--- +name: brcond_vcc_cond +legalized: true +body: | + ; CHECK-LABEL: name: brcond_vcc_cond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:vgpr(s32) = COPY $vgpr1 + ; CHECK: [[ICMP:%[0-9]+]]:sgpr(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: bb.1: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0, $vgpr1 + %0:_(s32) = COPY $vgpr0 + %1:_(s32) = COPY $vgpr1 + %2:_(s1) = G_ICMP intpred(ne), %0, %1 + G_BRCOND %2, %bb.1 + + bb.1: +... + +--- +name: brcond_scc_cond +legalized: true +body: | + ; CHECK-LABEL: name: brcond_scc_cond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s32) = COPY $sgpr1 + ; CHECK: [[ICMP:%[0-9]+]]:scc(s1) = G_ICMP intpred(ne), [[COPY]](s32), [[COPY1]] + ; CHECK: G_BRCOND [[ICMP]](s1), %bb.1 + ; CHECK: bb.1: + bb.0.entry: + successors: %bb.1 + liveins: $sgpr0, $sgpr1 + %0:_(s32) = COPY $sgpr0 + %1:_(s32) = COPY $sgpr1 + %2:_(s1) = G_ICMP intpred(ne), %0, %1 + G_BRCOND %2, %bb.1 + + bb.1: +... + +--- +name: brcond_sgpr_cond +legalized: true +body: | + ; CHECK-LABEL: name: brcond_sgpr_cond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:sgpr(s32) = COPY $sgpr0 + ; CHECK: [[TRUNC:%[0-9]+]]:sgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: G_BRCOND [[TRUNC]](s1), %bb.1 + ; CHECK: bb.1: + bb.0.entry: + successors: %bb.1 + liveins: $sgpr0 + %0:_(s32) = COPY $sgpr0 + %1:_(s1) = G_TRUNC %0 + G_BRCOND %1, %bb.1 + + bb.1: +... + +--- +name: brcond_vgpr_cond +legalized: true +body: | + ; CHECK-LABEL: name: brcond_vgpr_cond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s1) = COPY [[TRUNC]](s1) + ; CHECK: G_BRCOND [[COPY1]](s1), %bb.1 + ; CHECK: bb.1: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0 + %0:_(s32) = COPY $vgpr0 + %1:_(s1) = G_TRUNC %0 + G_BRCOND %1, %bb.1 + + bb.1: +... + + +# The terminator that needs handling is the only instruction in the +# block. + +--- +name: empty_block_vgpr_brcond +legalized: true +body: | + ; CHECK-LABEL: name: empty_block_vgpr_brcond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: bb.1: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s1) = COPY [[TRUNC]](s1) + ; CHECK: G_BRCOND [[COPY1]](s1), %bb.1 + ; CHECK: bb.2: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0 + %0:_(s32) = COPY $vgpr0 + %1:_(s1) = G_TRUNC %0 + + bb.1: + G_BRCOND %1, %bb.1 + + bb.2: +... + + +# Make sure the first instruction in the block isn't skipped. +--- +name: copy_first_inst_brcond +legalized: true +body: | + ; CHECK-LABEL: name: copy_first_inst_brcond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: bb.1: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s1) = COPY [[TRUNC]](s1) + ; CHECK: G_BRCOND [[COPY1]](s1), %bb.1 + ; CHECK: bb.2: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0 + %0:_(s32) = COPY $vgpr0 + + bb.1: + %1:_(s1) = G_TRUNC %0 + G_BRCOND %1, %bb.1 + + bb.2: +... + +# Extra instruction separates brcond from the condition def +--- +name: copy_middle_inst_brcond +legalized: true +body: | + ; CHECK-LABEL: name: copy_middle_inst_brcond + ; CHECK: bb.0.entry: + ; CHECK: successors: %bb.1(0x80000000) + ; CHECK: [[COPY:%[0-9]+]]:vgpr(s32) = COPY $vgpr0 + ; CHECK: bb.1: + ; CHECK: successors: %bb.1(0x40000000), %bb.2(0x40000000) + ; CHECK: [[TRUNC:%[0-9]+]]:vgpr(s1) = G_TRUNC [[COPY]](s32) + ; CHECK: S_NOP 0 + ; CHECK: [[COPY1:%[0-9]+]]:sgpr(s1) = COPY [[TRUNC]](s1) + ; CHECK: G_BRCOND [[COPY1]](s1), %bb.1 + ; CHECK: bb.2: + bb.0.entry: + successors: %bb.1 + liveins: $vgpr0 + %0:_(s32) = COPY $vgpr0 + + bb.1: + %1:_(s1) = G_TRUNC %0 + S_NOP 0 + G_BRCOND %1, %bb.1 + + bb.2: +... |

