1212// ===----------------------------------------------------------------------===//
1313
1414#include " TVM.h"
15+ #include " TVMUtilities.h"
16+
1517#include " llvm/ADT/PostOrderIterator.h"
1618#include " llvm/CodeGen/MachineDominators.h"
1719#include " llvm/CodeGen/MachineFunctionPass.h"
@@ -49,7 +51,8 @@ class TVMIfConversionTerm final : public MachineFunctionPass {
4951 static char ID;
5052 explicit TVMIfConversionTerm () : MachineFunctionPass(ID) {}
5153private:
52- bool tryConvertIf (MachineBasicBlock*);
54+ bool tryConvertIf1 (MachineBasicBlock *MBB);
55+ bool tryConvertIf2 (MachineBasicBlock *MBB);
5356 void updateDomTree (MachineBasicBlock *Head,
5457 MachineBasicBlock *ThrowBB,
5558 MachineBasicBlock *ContBB);
@@ -96,7 +99,7 @@ void TVMIfConversionTerm::updateLoops(MachineBasicBlock *ThrowBB,
9699 Loops->removeBlock (ContBB);
97100}
98101
99- bool TVMIfConversionTerm::tryConvertIf (MachineBasicBlock* MBB) {
102+ bool TVMIfConversionTerm::tryConvertIf1 (MachineBasicBlock * MBB) {
100103 SmallVector<MachineBasicBlock*, 4 > RemovedBlocks;
101104
102105 MachineBasicBlock *Head = MBB;
@@ -148,6 +151,55 @@ bool TVMIfConversionTerm::tryConvertIf(MachineBasicBlock* MBB) {
148151 return true ;
149152}
150153
154+ static bool IsThrow (MachineBasicBlock *MBB) {
155+ if (!MBB->succ_empty ())
156+ return false ;
157+ if (MBB->size () != 1 )
158+ return false ;
159+ auto &MI = MBB->front ();
160+ if (MI.getOpcode () != TVM::THROW)
161+ return false ;
162+ return true ;
163+ }
164+
165+ // ...
166+ // |
167+ // MBB ...
168+ // ... / \ /
169+ // \ / \ /
170+ // \ / \ /
171+ // TBB \ /
172+ // FBB
173+ // |
174+ // ...
175+ bool TVMIfConversionTerm::tryConvertIf2 (MachineBasicBlock *MBB) {
176+ MachineBasicBlock *TBB = nullptr ;
177+ MachineBasicBlock *FBB = nullptr ;
178+ SmallVector<MachineOperand, 4 > Cond;
179+ if (TII->analyzeBranch (*MBB, TBB, FBB, Cond))
180+ return false ;
181+
182+ unsigned Opcode;
183+ if (TBB && IsThrow (TBB)) {
184+ Opcode = TVM::THROWIF;
185+ } else if (FBB && IsThrow (FBB)) {
186+ std::swap (TBB, FBB);
187+ Opcode = TVM::THROWIFNOT;
188+ } else {
189+ return false ;
190+ }
191+
192+ auto &TI = TBB->front ();
193+ auto &MI = *MBB->getFirstTerminator ();
194+ BuildMI (*MBB, MI, MI.getDebugLoc (), TII->get (Opcode))
195+ .add (Cond[1 ]).add (TI.getOperand (0 ));
196+ TII->removeBranch (*MBB);
197+ MBB->removeSuccessor (TBB);
198+ TII->insertBranch (*MBB, FBB, nullptr , ArrayRef<MachineOperand>(), DebugLoc ());
199+
200+ return true ;
201+ }
202+
151203bool TVMIfConversionTerm::runOnMachineFunction (MachineFunction &MF) {
152204 LLVM_DEBUG (dbgs () << " ********** TVM IF-CONVERSION TERM **********\n "
153205 << " ********** Function: " << MF.getName () << ' \n ' );
@@ -157,9 +209,12 @@ bool TVMIfConversionTerm::runOnMachineFunction(MachineFunction &MF) {
157209 DomTree = &getAnalysis<MachineDominatorTree>();
158210 Loops = getAnalysisIfAvailable<MachineLoopInfo>();
159211 bool Changed = false ;
160- for (auto DomNode : post_order (DomTree))
161- if (tryConvertIf (DomNode->getBlock ()))
212+ for (auto DomNode : post_order (DomTree)) {
213+ if (tryConvertIf1 (DomNode->getBlock ()))
162214 Changed = true ;
215+ if (tryConvertIf2 (DomNode->getBlock ()))
216+ Changed = true ;
217+ }
163218 return Changed;
164219}
165220
0 commit comments