summaryrefslogtreecommitdiff
path: root/lib/Target/SystemZ/SystemZInstrInfo.cpp
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-16 10:55:47 +0000
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>2013-08-16 10:55:47 +0000
commit6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e (patch)
treea9a17235ca1c2d7da4a78b31edb3aca2965731b5 /lib/Target/SystemZ/SystemZInstrInfo.cpp
parent6c51f89498dd813c8dd16e46069decf2897b31b2 (diff)
downloadllvm-6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e.tar.gz
llvm-6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e.tar.bz2
llvm-6a079fef4fad3e6c2e07c9e1d0776e20a0b05b1e.tar.xz
[SystemZ] Fix handling of 64-bit memcmp results
Generalize r188163 to cope with return types other than MVT::i32, just as the existing visitMemCmpCall code did. I've split this out into a subroutine so that it can be used for other upcoming patches. I also noticed that I'd used the wrong API to record the out chain. It's a load that uses DAG.getRoot() rather than getRoot(), so the out chain should go on PendingLoads. I don't have a testcase for that because we don't do any interesting scheduling on z yet. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188540 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SystemZ/SystemZInstrInfo.cpp')
-rw-r--r--lib/Target/SystemZ/SystemZInstrInfo.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/Target/SystemZ/SystemZInstrInfo.cpp b/lib/Target/SystemZ/SystemZInstrInfo.cpp
index f2e877fd29..a84ce28c51 100644
--- a/lib/Target/SystemZ/SystemZInstrInfo.cpp
+++ b/lib/Target/SystemZ/SystemZInstrInfo.cpp
@@ -339,7 +339,12 @@ static void eraseIfDead(MachineInstr *MI, const MachineRegisterInfo *MRI) {
static bool removeIPMBasedCompare(MachineInstr *Compare, unsigned SrcReg,
const MachineRegisterInfo *MRI,
const TargetRegisterInfo *TRI) {
+ MachineInstr *LGFR = 0;
MachineInstr *RLL = getDef(SrcReg, MRI);
+ if (RLL && RLL->getOpcode() == SystemZ::LGFR) {
+ LGFR = RLL;
+ RLL = getDef(LGFR->getOperand(1).getReg(), MRI);
+ }
if (!RLL || !isShift(RLL, SystemZ::RLL, 31))
return false;
@@ -362,6 +367,8 @@ static bool removeIPMBasedCompare(MachineInstr *Compare, unsigned SrcReg,
}
Compare->eraseFromParent();
+ if (LGFR)
+ eraseIfDead(LGFR, MRI);
eraseIfDead(RLL, MRI);
eraseIfDead(SRL, MRI);
eraseIfDead(IPM, MRI);