diff options
| author | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-05-08 22:26:39 +0000 |
|---|---|---|
| committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2018-05-08 22:26:39 +0000 |
| commit | d24dcdd1f74b981eea590ebfb9dfd455cea8a8f6 (patch) | |
| tree | bc927cdbdac89f386669b8ea77b3f9648da3f46a /llvm/lib/CodeGen | |
| parent | 384621e9857b9e396bae2b34f534e9a2ea3fbf82 (diff) | |
| download | bcm5719-llvm-d24dcdd1f74b981eea590ebfb9dfd455cea8a8f6.tar.gz bcm5719-llvm-d24dcdd1f74b981eea590ebfb9dfd455cea8a8f6.zip | |
[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
Diffstat (limited to 'llvm/lib/CodeGen')
| -rw-r--r-- | llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
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);; } |

