diff options
| author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-22 19:02:10 +0000 |
|---|---|---|
| committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-01-22 19:02:10 +0000 |
| commit | 6614f852b6527e74556b57a095d515784d3c4a0b (patch) | |
| tree | 86b45bfec4e8ee55613e2ce8c3f117145d65e9e8 /llvm/lib/CodeGen | |
| parent | 3c535a60ddd83d15602e45567f3796d471ab998b (diff) | |
| download | bcm5719-llvm-6614f852b6527e74556b57a095d515784d3c4a0b.tar.gz bcm5719-llvm-6614f852b6527e74556b57a095d515784d3c4a0b.zip | |
GlobalISel: Support narrowing zextload/sextload
llvm-svn: 351856
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index 4e76518660c..d2c507d4e18 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -516,6 +516,33 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI, MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_ZEXTLOAD: + case TargetOpcode::G_SEXTLOAD: { + bool ZExt = MI.getOpcode() == TargetOpcode::G_ZEXTLOAD; + unsigned DstReg = MI.getOperand(0).getReg(); + unsigned PtrReg = MI.getOperand(1).getReg(); + + unsigned TmpReg = MRI.createGenericVirtualRegister(NarrowTy); + auto &MMO = **MI.memoperands_begin(); + if (MMO.getSize() * 8 == NarrowSize) { + MIRBuilder.buildLoad(TmpReg, PtrReg, MMO); + } else { + unsigned ExtLoad = ZExt ? TargetOpcode::G_ZEXTLOAD + : TargetOpcode::G_SEXTLOAD; + MIRBuilder.buildInstr(ExtLoad) + .addDef(TmpReg) + .addUse(PtrReg) + .addMemOperand(&MMO); + } + + if (ZExt) + MIRBuilder.buildZExt(DstReg, TmpReg); + else + MIRBuilder.buildSExt(DstReg, TmpReg); + + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_STORE: { // FIXME: add support for when SizeOp0 isn't an exact multiple of // NarrowSize. |

