diff options
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp')
| -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);; } |

