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 = TII->analyzeBranch(*Loop, TBB, FBB, Cond);

125 (void)CanAnalyzeBr;

126 assert(CanAnalyzeBr && "Must be able to analyze the loop branch!");

127 TII->removeBranch(*Loop);

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}