From d24dcdd1f74b981eea590ebfb9dfd455cea8a8f6 Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Tue, 8 May 2018 22:26:39 +0000 Subject: [globalisel] Add a combiner helpers for extending loads and use them in a pre-legalize combiner for AArch64 Summary: Depends on D45541 Reviewers: ab, aditya_nandakumar, bogner, rtereshin, volkan, rovka, javed.absar, aemerson Reviewed By: aemerson Subscribers: aemerson, rengolin, mgorny, javed.absar, kristof.beyls, llvm-commits Differential Revision: https://reviews.llvm.org/D45543 llvm-svn: 331816 --- llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 34 +++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) (limited to 'llvm/lib/CodeGen') diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index 44e904a6391..25b40da4dd7 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -36,6 +36,38 @@ bool CombinerHelper::tryCombineCopy(MachineInstr &MI) { return false; } +bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { + unsigned DstReg = MI.getOperand(0).getReg(); + unsigned SrcReg = MI.getOperand(1).getReg(); + + if (MI.getOpcode() != TargetOpcode::G_ANYEXT && + MI.getOpcode() != TargetOpcode::G_SEXT && + MI.getOpcode() != TargetOpcode::G_ZEXT) + return false; + + LLT DstTy = MRI.getType(DstReg); + if (!DstTy.isScalar()) + return false; + + if (MachineInstr *DefMI = getOpcodeDef(TargetOpcode::G_LOAD, SrcReg, MRI)) { + unsigned PtrReg = DefMI->getOperand(1).getReg(); + MachineMemOperand &MMO = **DefMI->memoperands_begin(); + DEBUG(dbgs() << ".. Combine MI: " << MI;); + Builder.setInstr(MI); + Builder.buildLoadInstr(MI.getOpcode() == TargetOpcode::G_SEXT + ? TargetOpcode::G_SEXTLOAD + : MI.getOpcode() == TargetOpcode::G_ZEXT + ? TargetOpcode::G_ZEXTLOAD + : TargetOpcode::G_LOAD, + DstReg, PtrReg, MMO); + MI.eraseFromParent(); + return true; + } + return false; +} + bool CombinerHelper::tryCombine(MachineInstr &MI) { - return tryCombineCopy(MI); + if (tryCombineCopy(MI)) + return true; + return tryCombineExtendingLoads(MI);; } -- cgit v1.2.3