diff options
author | Tim Northover <tnorthover@apple.com> | 2019-08-06 09:18:41 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2019-08-06 09:18:41 +0000 |
commit | de98e92bc2b691248fd6557cea1c03237e21adb2 (patch) | |
tree | ad7fe0d0d71c2b7f601c8a90341efc40b6f8fca7 /llvm/lib/Target/AArch64 | |
parent | a7b6a7c851ebad0b626b05618d271ac24c17e0e8 (diff) | |
download | bcm5719-llvm-de98e92bc2b691248fd6557cea1c03237e21adb2.tar.gz bcm5719-llvm-de98e92bc2b691248fd6557cea1c03237e21adb2.zip |
AArch64: use xzr/wzr for constant 0 in GlobalISel.
COPYs from xzr and wzr can often be folded away entirely during register
allocation, unlike a movz.
llvm-svn: 368003
Diffstat (limited to 'llvm/lib/Target/AArch64')
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp index a2f51415b75..59cfcca3157 100644 --- a/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstructionSelector.cpp @@ -1284,6 +1284,31 @@ bool AArch64InstructionSelector::earlySelect(MachineInstr &I) const { return earlySelectSHL(I, MRI); case TargetOpcode::G_LOAD: return earlySelectLoad(I, MRI); + case TargetOpcode::G_CONSTANT: { + bool IsZero = false; + if (I.getOperand(1).isCImm()) + IsZero = I.getOperand(1).getCImm()->getZExtValue() == 0; + else if (I.getOperand(1).isImm()) + IsZero = I.getOperand(1).getImm() == 0; + + if (!IsZero) + return false; + + Register DefReg = I.getOperand(0).getReg(); + LLT Ty = MRI.getType(DefReg); + assert((Ty == LLT::scalar(64) || Ty == LLT::scalar(32)) && + "Unexpected legal constant type"); + + if (Ty == LLT::scalar(64)) { + I.getOperand(1).ChangeToRegister(AArch64::XZR, false); + RBI.constrainGenericRegister(DefReg, AArch64::GPR64RegClass, MRI); + } else { + I.getOperand(1).ChangeToRegister(AArch64::WZR, false); + RBI.constrainGenericRegister(DefReg, AArch64::GPR32RegClass, MRI); + } + I.setDesc(TII.get(TargetOpcode::COPY)); + return true; + } default: return false; } |