summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp')
-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