diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-11-04 20:41:03 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-11-04 20:41:03 +0000 |
| commit | b7eb7fc892184d44b3e105be7d3ce2ed25f9cc6b (patch) | |
| tree | 60fdef36ad3857fe2110b1208c9e3b1f4621d122 /llvm | |
| parent | 393803328252836581bc2a2fd0c01a577fa986b8 (diff) | |
| download | bcm5719-llvm-b7eb7fc892184d44b3e105be7d3ce2ed25f9cc6b.tar.gz bcm5719-llvm-b7eb7fc892184d44b3e105be7d3ce2ed25f9cc6b.zip | |
[Hexagon] Account for <def,read-undef> when validating moves for predication
llvm-svn: 286009
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp | 7 | ||||
| -rw-r--r-- | llvm/test/CodeGen/Hexagon/expand-condsets-def-undef.mir | 41 |
2 files changed, 48 insertions, 0 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp b/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp index edbd61d5eb4..ba4a9a1832b 100644 --- a/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp +++ b/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp @@ -948,6 +948,13 @@ bool HexagonExpandCondsets::predicate(MachineInstr &TfrI, bool Cond, return false; ReferenceMap &Map = Op.isDef() ? Defs : Uses; + if (Op.isDef() && Op.isUndef()) { + assert(RR.Sub && "Expecting a subregister on <def,read-undef>"); + // If this is a <def,read-undef>, then it invalidates the non-written + // part of the register. For the purpose of checking the validity of + // the move, assume that it modifies the whole register. + RR.Sub = 0; + } addRefToMap(RR, Map, Exec); } } diff --git a/llvm/test/CodeGen/Hexagon/expand-condsets-def-undef.mir b/llvm/test/CodeGen/Hexagon/expand-condsets-def-undef.mir new file mode 100644 index 00000000000..6704b701eb0 --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/expand-condsets-def-undef.mir @@ -0,0 +1,41 @@ +# RUN: llc -march=hexagon -run-pass expand-condsets -o - %s -verify-machineinstrs | FileCheck %s + +# CHECK-LABEL: name: fred + +# Make sure that <def,read-undef> is accounted for when validating moves +# during predication. In the code below, %2.subreg_hireg is invalidated +# by the C2_mux instruction, and so predicating the A2_addi as an argument +# to the C2_muxir should not happen. + +--- | + define void @fred() { ret void } + +... +--- + +name: fred +tracksRegLiveness: true +registers: + - { id: 0, class: predregs } + - { id: 1, class: intregs } + - { id: 2, class: doubleregs } + - { id: 3, class: intregs } +liveins: + - { reg: '%p0', virtual-reg: '%0' } + - { reg: '%r0', virtual-reg: '%1' } + - { reg: '%d0', virtual-reg: '%2' } + +body: | + bb.0: + liveins: %r0, %d0, %p0 + %0 = COPY %p0 + %1 = COPY %r0 + %2 = COPY %d0 + ; Check that this instruction is unchanged (remains unpredicated) + ; CHECK: %3 = A2_addi %2.subreg_hireg, 1 + %3 = A2_addi %2.subreg_hireg, 1 + undef %2.subreg_loreg = C2_mux %0, %2.subreg_loreg, %1 + %2.subreg_hireg = C2_muxir %0, %3, 0 + +... + |

