Index: lib/CodeGen/ExpandPostRAPseudos.cpp =================================================================== --- lib/CodeGen/ExpandPostRAPseudos.cpp +++ lib/CodeGen/ExpandPostRAPseudos.cpp @@ -142,8 +142,9 @@ 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) { Index: test/CodeGen/SystemZ/lower-copy-undef-src.mir =================================================================== --- /dev/null +++ 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