diff options
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | 10 | ||||
-rw-r--r-- | llvm/test/CodeGen/SystemZ/int-add-18.mir | 20 |
2 files changed, 26 insertions, 4 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp index 865ce0320e5..adb96fa15cb 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -168,11 +168,13 @@ void SystemZInstrInfo::expandRIEPseudo(MachineInstr &MI, unsigned LowOpcode, if (!DestIsHigh && !SrcIsHigh) MI.setDesc(get(LowOpcodeK)); else { - emitGRX32Move(*MI.getParent(), MI, MI.getDebugLoc(), DestReg, SrcReg, - SystemZ::LR, 32, MI.getOperand(1).isKill(), - MI.getOperand(1).isUndef()); + if (DestReg != SrcReg) { + emitGRX32Move(*MI.getParent(), MI, MI.getDebugLoc(), DestReg, SrcReg, + SystemZ::LR, 32, MI.getOperand(1).isKill(), + MI.getOperand(1).isUndef()); + MI.getOperand(1).setReg(DestReg); + } MI.setDesc(get(DestIsHigh ? HighOpcode : LowOpcode)); - MI.getOperand(1).setReg(DestReg); MI.tieOperands(0, 1); } } diff --git a/llvm/test/CodeGen/SystemZ/int-add-18.mir b/llvm/test/CodeGen/SystemZ/int-add-18.mir new file mode 100644 index 00000000000..0137be95c51 --- /dev/null +++ b/llvm/test/CodeGen/SystemZ/int-add-18.mir @@ -0,0 +1,20 @@ +# RUN: llc -mtriple=s390x-linux-gnu -mcpu=z13 -start-before=postrapseudos \ +# RUN: %s -o - | FileCheck %s +# +# Test that an AHIMuxK pseudo does not result in a COPY (risbhg) if the +# source and destination registers are the same. + +--- +name: fun +tracksRegLiveness: true +body: | + bb.0: + $r1h = IIHF 0 + renamable $r1h = nuw nsw AHIMuxK killed renamable $r1h, 4, implicit-def dead $cc + + ; CHECK-LABEL: fun + ; CHECK-NOT: risbhg + ; CHECK: aih %r1, 4 +... + + |