diff options
author | Daniel Sanders <daniel_l_sanders@apple.com> | 2019-02-14 00:15:28 +0000 |
---|---|---|
committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2019-02-14 00:15:28 +0000 |
commit | dfa0f556bf26043b094614a5adc9eaf7e7bea201 (patch) | |
tree | a5eec7d56123163012d6c8372b3c9f8912010be9 /llvm/lib/CodeGen | |
parent | 451c2ef199e9c5163007ac32e2d426fbfb37e664 (diff) | |
download | bcm5719-llvm-dfa0f556bf26043b094614a5adc9eaf7e7bea201.tar.gz bcm5719-llvm-dfa0f556bf26043b094614a5adc9eaf7e7bea201.zip |
[globalisel][combine] Split existing rules into a match and apply step
Summary:
The declarative tablegen definitions split rules into match and apply steps.
Prepare for that by doing the same in the C++ implementations. This aids
some of the migration effort while the tablegen version is incomplete.
Reviewers: bogner, volkan, aditya_nandakumar, paquette, aemerson
Reviewed By: aditya_nandakumar
Subscribers: rovka, kristof.beyls, Petar.Avramovic, jdoerfert, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58150
llvm-svn: 353996
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp index a2b1e8e1eb4..2eab5748980 100644 --- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp @@ -46,6 +46,13 @@ void CombinerHelper::replaceRegOpWith(MachineRegisterInfo &MRI, } bool CombinerHelper::tryCombineCopy(MachineInstr &MI) { + if (matchCombineCopy(MI)) { + applyCombineCopy(MI); + return true; + } + return false; +} +bool CombinerHelper::matchCombineCopy(MachineInstr &MI) { if (MI.getOpcode() != TargetOpcode::COPY) return false; unsigned DstReg = MI.getOperand(0).getReg(); @@ -54,20 +61,18 @@ bool CombinerHelper::tryCombineCopy(MachineInstr &MI) { LLT SrcTy = MRI.getType(SrcReg); // Simple Copy Propagation. // a(sx) = COPY b(sx) -> Replace all uses of a with b. - if (DstTy.isValid() && SrcTy.isValid() && DstTy == SrcTy) { - MI.eraseFromParent(); - replaceRegWith(MRI, DstReg, SrcReg); + if (DstTy.isValid() && SrcTy.isValid() && DstTy == SrcTy) return true; - } return false; } +void CombinerHelper::applyCombineCopy(MachineInstr &MI) { + unsigned DstReg = MI.getOperand(0).getReg(); + unsigned SrcReg = MI.getOperand(1).getReg(); + MI.eraseFromParent(); + replaceRegWith(MRI, DstReg, SrcReg); +} namespace { -struct PreferredTuple { - LLT Ty; // The result type of the extend. - unsigned ExtendOpcode; // G_ANYEXT/G_SEXT/G_ZEXT - MachineInstr *MI; -}; /// Select a preference between two uses. CurrentUse is the current preference /// while *ForCandidate is attributes of the candidate under consideration. @@ -152,16 +157,16 @@ static void InsertInsnsWithoutSideEffectsBeforeUse( } // end anonymous namespace bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { - struct InsertionPoint { - MachineOperand *UseMO; - MachineBasicBlock *InsertIntoBB; - MachineBasicBlock::iterator InsertBefore; - InsertionPoint(MachineOperand *UseMO, MachineBasicBlock *InsertIntoBB, - MachineBasicBlock::iterator InsertBefore) - : UseMO(UseMO), InsertIntoBB(InsertIntoBB), InsertBefore(InsertBefore) { - } - }; + PreferredTuple Preferred; + if (matchCombineExtendingLoads(MI, Preferred)) { + applyCombineExtendingLoads(MI, Preferred); + return true; + } + return false; +} +bool CombinerHelper::matchCombineExtendingLoads(MachineInstr &MI, + PreferredTuple &Preferred) { // We match the loads and follow the uses to the extend instead of matching // the extends and following the def to the load. This is because the load // must remain in the same position for correctness (unless we also add code @@ -199,7 +204,7 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { : MI.getOpcode() == TargetOpcode::G_SEXTLOAD ? TargetOpcode::G_SEXT : TargetOpcode::G_ZEXT; - PreferredTuple Preferred = {LLT(), PreferredOpcode, nullptr}; + Preferred = {LLT(), PreferredOpcode, nullptr}; for (auto &UseMI : MRI.use_instructions(LoadValue.getReg())) { if (UseMI.getOpcode() == TargetOpcode::G_SEXT || UseMI.getOpcode() == TargetOpcode::G_ZEXT || @@ -218,6 +223,20 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { assert(Preferred.Ty != LoadValueTy && "Extending to same type?"); LLVM_DEBUG(dbgs() << "Preferred use is: " << *Preferred.MI); + return true; +} + +void CombinerHelper::applyCombineExtendingLoads(MachineInstr &MI, + PreferredTuple &Preferred) { + struct InsertionPoint { + MachineOperand *UseMO; + MachineBasicBlock *InsertIntoBB; + MachineBasicBlock::iterator InsertBefore; + InsertionPoint(MachineOperand *UseMO, MachineBasicBlock *InsertIntoBB, + MachineBasicBlock::iterator InsertBefore) + : UseMO(UseMO), InsertIntoBB(InsertIntoBB), InsertBefore(InsertBefore) { + } + }; // Rewrite the load to the chosen extending load. unsigned ChosenDstReg = Preferred.MI->getOperand(0).getReg(); @@ -232,6 +251,7 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { // Rewrite all the uses to fix up the types. SmallVector<MachineInstr *, 1> ScheduleForErase; SmallVector<InsertionPoint, 4> ScheduleForInsert; + auto &LoadValue = MI.getOperand(0); for (auto &UseMO : MRI.use_operands(LoadValue.getReg())) { MachineInstr *UseMI = UseMO.getParent(); @@ -331,8 +351,6 @@ bool CombinerHelper::tryCombineExtendingLoads(MachineInstr &MI) { } MI.getOperand(0).setReg(ChosenDstReg); Observer.changedInstr(MI); - - return true; } bool CombinerHelper::tryCombine(MachineInstr &MI) { |