diff options
author | Zhan Jun Liau <zhanjunl@ca.ibm.com> | 2016-07-11 18:45:03 +0000 |
---|---|---|
committer | Zhan Jun Liau <zhanjunl@ca.ibm.com> | 2016-07-11 18:45:03 +0000 |
commit | def708a0f9ff4331214fded128fa2d5d6459952c (patch) | |
tree | 92b4c43b783b4fbd1e1735af8bc3afd0209bc951 /llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | |
parent | 7614e178cb9c4ef66c39dc953f9804b0a6a64d4c (diff) | |
download | bcm5719-llvm-def708a0f9ff4331214fded128fa2d5d6459952c.tar.gz bcm5719-llvm-def708a0f9ff4331214fded128fa2d5d6459952c.zip |
[SystemZ] Recognize Load On Condition Immediate (LOCHI/LOGHI) opportunities
Summary: Add support for the z13 instructions LOCHI and LOCGHI which
conditionally load immediate values. Add target instruction info hooks so
that if conversion will allow predication of LHI/LGHI.
Author: RolandF
Reviewers: uweigand
Subscribers: zhanjunl
Commiting on behalf of Roland.
Differential Revision: http://reviews.llvm.org/D22117
llvm-svn: 275086
Diffstat (limited to 'llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp')
-rw-r--r-- | llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp index d2e2e27f397..072b64474f7 100644 --- a/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp +++ b/llvm/lib/Target/SystemZ/SystemZInstrInfo.cpp @@ -530,10 +530,20 @@ static unsigned getConditionalMove(unsigned Opcode) { } } +static unsigned getConditionalLoadImmediate(unsigned Opcode) { + switch (Opcode) { + case SystemZ::LHI: return SystemZ::LOCHI; + case SystemZ::LGHI: return SystemZ::LOCGHI; + default: return 0; + } +} + bool SystemZInstrInfo::isPredicable(MachineInstr &MI) const { unsigned Opcode = MI.getOpcode(); if (STI.hasLoadStoreOnCond() && getConditionalMove(Opcode)) return true; + if (STI.hasLoadStoreOnCond2() && getConditionalLoadImmediate(Opcode)) + return true; if (Opcode == SystemZ::Return || Opcode == SystemZ::Trap || Opcode == SystemZ::CallJG || @@ -595,6 +605,16 @@ bool SystemZInstrInfo::PredicateInstruction( return true; } } + if (STI.hasLoadStoreOnCond2()) { + if (unsigned CondOpcode = getConditionalLoadImmediate(Opcode)) { + MI.setDesc(get(CondOpcode)); + MachineInstrBuilder(*MI.getParent()->getParent(), MI) + .addImm(CCValid) + .addImm(CCMask) + .addReg(SystemZ::CC, RegState::Implicit); + return true; + } + } if (Opcode == SystemZ::Trap) { MI.setDesc(get(SystemZ::CondTrap)); MachineInstrBuilder(*MI.getParent()->getParent(), MI) |