LLVM: lib/CodeGen/MachineLoopUtils.cpp Source File (original) (raw)
32 if (Preheader == Loop)
33 Preheader = *std::next(Loop->pred_begin());
35 if (Exit == Loop)
36 Exit = *std::next(Loop->succ_begin());
37
40 MF.insert(Loop->getIterator(), NewBB);
41 else
42 MF.insert(std::next(Loop->getIterator()), NewBB);
43
45 auto InsertPt = NewBB->end();
48 NewBB->insert(InsertPt, NewMI);
52 continue;
54 R = MRI.createVirtualRegister(MRI.getRegClass(OrigR));
55 MO.setReg(R);
56
58
59
60
62 for (auto &Use : MRI.use_operands(OrigR))
63 if (Use.getParent()->getParent() != Loop)
67 MRI.constrainRegClass(R, MRI.getRegClass(Use->getReg()));
68 assert(ConstrainRegClass &&
69 "Expected a valid constrained register class!");
70 (void)ConstrainRegClass;
71 Use->setReg(R);
72 }
73 }
74 }
75 }
76
79 if (MO.isReg())
80 if (auto It = Remaps.find(MO.getReg()); It != Remaps.end())
81 MO.setReg(It->second);
82
83 for (auto I = NewBB->begin(); I->isPHI(); ++I) {
85 unsigned LoopRegIdx = 3, InitRegIdx = 1;
86 if (MI.getOperand(2).getMBB() != Preheader)
87 std::swap(LoopRegIdx, InitRegIdx);
91
92
93 Register R = MI.getOperand(LoopRegIdx).getReg();
94 if (auto It = Remaps.find(R); It != Remaps.end())
95 R = It->second;
97 MI.removeOperand(LoopRegIdx + 1);
98 MI.removeOperand(LoopRegIdx + 0);
99 } else {
100
101
103 MI.getOperand(LoopRegIdx).setReg(LoopReg);
104 MI.removeOperand(InitRegIdx + 1);
105 MI.removeOperand(InitRegIdx + 0);
106 }
107 }
108
113 Loop->replacePhiUsesWith(Preheader, NewBB);
115 TII->removeBranch(*NewBB);
116 TII->insertBranch(*NewBB, Loop, nullptr, {}, DL);
117 } else {
118 Loop->replaceSuccessor(Exit, NewBB);
119 Exit->replacePhiUsesWith(Loop, NewBB);
121
124 bool CanAnalyzeBr = ->analyzeBranch(*Loop, TBB, FBB, Cond);
125 (void)CanAnalyzeBr;
126 assert(CanAnalyzeBr && "Must be able to analyze the loop branch!");
128 TII->insertBranch(*Loop, TBB == Exit ? NewBB : TBB,
129 FBB == Exit ? NewBB : FBB, Cond, DL);
130 if (TII->removeBranch(*NewBB) > 0)
131 TII->insertBranch(*NewBB, Exit, nullptr, {}, DL);
132 }
133
134 return NewBB;
135}