From 9727d7a8ef3e726f98acc6e7cef9c103c5da5b10 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Fri, 12 May 2017 06:32:03 +0000 Subject: [PATCH] Handle a COPY with undef source operand in LowerCopy() Llvm-stress discovered that a COPY may end up in ExpandPostRA::LowerCopy() with an undef source operand. It is not possible for the target to handle this, as this flag is not passed to TII->copyPhysReg(). This patch solves this by treating such a COPY as an identity COPY. Review: Matthias Braun https://reviews.llvm.org/D32892 llvm-svn: 302877 --- lib/CodeGen/ExpandPostRAPseudos.cpp | 5 +++-- test/CodeGen/SystemZ/lower-copy-undef-src.mir | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 test/CodeGen/SystemZ/lower-copy-undef-src.mir diff --git a/lib/CodeGen/ExpandPostRAPseudos.cpp b/lib/CodeGen/ExpandPostRAPseudos.cpp index ab2382e2db6..e860906043d 100644 --- a/lib/CodeGen/ExpandPostRAPseudos.cpp +++ b/lib/CodeGen/ExpandPostRAPseudos.cpp @@ -142,8 +142,9 @@ bool ExpandPostRA::LowerCopy(MachineInstr *MI) { MachineOperand &DstMO = MI->getOperand(0); MachineOperand &SrcMO = MI->getOperand(1); - if (SrcMO.getReg() == DstMO.getReg()) { - DEBUG(dbgs() << "identity copy: " << *MI); + bool IdentityCopy = (SrcMO.getReg() == DstMO.getReg()); + if (IdentityCopy || SrcMO.isUndef()) { + DEBUG(dbgs() << (IdentityCopy ? "identity copy: " : "undef copy: ") << *MI); // No need to insert an identity copy instruction, but replace with a KILL // if liveness is changed. if (SrcMO.isUndef() || MI->getNumOperands() > 2) { diff --git a/test/CodeGen/SystemZ/lower-copy-undef-src.mir b/test/CodeGen/SystemZ/lower-copy-undef-src.mir new file mode 100644 index 00000000000..322460d79d6 --- /dev/null +++ b/test/CodeGen/SystemZ/lower-copy-undef-src.mir @@ -0,0 +1,14 @@ +# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -run-pass=postrapseudos -o - %s | FileCheck %s +# +# Test that a COPY with an undef source operand gets handled like an identity +# copy rather than lowered into a target instruction with the undef flag +# dropped. +--- +# CHECK-LABEL: name: undef_copy +# CHECK: %r13d = KILL undef %r0d, implicit killed %r12q, implicit-def %r12q +name: undef_copy +tracksRegLiveness: true +body: | + bb.0: + liveins: %r12q + %r13d = COPY undef %r0d, implicit killed %r12q, implicit-def %r12q