summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorDaniel Sanders <daniel_l_sanders@apple.com>2018-05-08 22:26:39 +0000
committerDaniel Sanders <daniel_l_sanders@apple.com>2018-05-08 22:26:39 +0000
commitd24dcdd1f74b981eea590ebfb9dfd455cea8a8f6 (patch)
treebc927cdbdac89f386669b8ea77b3f9648da3f46a /llvm/lib/CodeGen
parent384621e9857b9e396bae2b34f534e9a2ea3fbf82 (diff)
downloadbcm5719-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.cpp34
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);;
}
OpenPOWER on IntegriCloud