summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp10
-rw-r--r--llvm/test/CodeGen/SystemZ/int-add-18.mir20
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
+...
+
+
OpenPOWER on IntegriCloud