From eefaf3bd00b73ecd10773aff05badbc5791b3219 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 4 Nov 2016 20:41:03 +0000 Subject: [PATCH] [Hexagon] Account for when validating moves for predication git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286009 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/Hexagon/HexagonExpandCondsets.cpp | 7 ++++ .../Hexagon/expand-condsets-def-undef.mir | 41 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/CodeGen/Hexagon/expand-condsets-def-undef.mir diff --git a/lib/Target/Hexagon/HexagonExpandCondsets.cpp b/lib/Target/Hexagon/HexagonExpandCondsets.cpp index edbd61d5eb4..ba4a9a1832b 100644 --- a/lib/Target/Hexagon/HexagonExpandCondsets.cpp +++ b/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 "); + // If this is a , 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/test/CodeGen/Hexagon/expand-condsets-def-undef.mir b/test/CodeGen/Hexagon/expand-condsets-def-undef.mir new file mode 100644 index 00000000000..6704b701eb0 --- /dev/null +++ b/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 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 + +... + -- 2.49.0