Lines Matching defs:FP
136 : FP(P), TRI(T) {}
138 const FlowPattern &FP;
145 OS << "{ SplitB:" << PrintMB(P.FP.SplitB)
146 << ", PredR:" << printReg(P.FP.PredR, &P.TRI)
147 << ", TrueB:" << PrintMB(P.FP.TrueB)
148 << ", FalseB:" << PrintMB(P.FP.FalseB)
149 << ", JoinB:" << PrintMB(P.FP.JoinB) << " }";
178 FlowPattern &FP);
186 bool isValid(const FlowPattern &FP) const;
189 const FlowPattern &FP) const;
190 bool isProfitable(const FlowPattern &FP) const;
205 void updatePhiNodes(MachineBasicBlock *WhereB, const FlowPattern &FP);
206 void convert(const FlowPattern &FP);
211 void simplifyFlowGraph(const FlowPattern &FP);
239 MachineLoop *L, FlowPattern &FP) {
334 FP = FlowPattern(B, PredR, TB, FB, JB);
335 LLVM_DEBUG(dbgs() << "Detected " << PrintFP(FP, *TRI) << "\n");
417 bool HexagonEarlyIfConversion::isValid(const FlowPattern &FP) const {
418 if (hasEHLabel(FP.SplitB)) // KLUDGE: see function definition
420 if (FP.TrueB && !isValidCandidate(FP.TrueB))
422 if (FP.FalseB && !isValidCandidate(FP.FalseB))
434 if (FP.JoinB) {
435 const MachineBasicBlock &B = *FP.JoinB;
450 const FlowPattern &FP) const {
465 if (BB == FP.SplitB || BB == FP.TrueB || BB == FP.FalseB)
505 bool HexagonEarlyIfConversion::isProfitable(const FlowPattern &FP) const {
508 if (MBPI && FP.TrueB && !FP.FalseB &&
509 (MBPI->getEdgeProbability(FP.SplitB, FP.TrueB) < JumpProb ||
510 MBPI->getEdgeProbability(FP.SplitB, FP.TrueB) > Prob))
513 if (MBPI && !FP.TrueB && FP.FalseB &&
514 (MBPI->getEdgeProbability(FP.SplitB, FP.FalseB) < JumpProb ||
515 MBPI->getEdgeProbability(FP.SplitB, FP.FalseB) > Prob))
518 if (FP.TrueB && FP.FalseB) {
521 if (MBPI->getEdgeProbability(FP.SplitB, FP.TrueB) > Prob)
523 if (MBPI->getEdgeProbability(FP.SplitB, FP.FalseB) > Prob)
529 MachineBasicBlock *TSB = *FP.TrueB->succ_begin();
530 MachineBasicBlock *FSB = *FP.FalseB->succ_begin();
554 unsigned TotalIn = TotalCount(FP.TrueB, Spare) + TotalCount(FP.FalseB, Spare);
568 unsigned PredDefs = countPredicateDefs(FP.SplitB);
569 if (FP.JoinB) {
570 TotalPh = computePhiCost(FP.JoinB, FP);
571 PredDefs += countPredicateDefs(FP.JoinB);
573 if (FP.TrueB && !FP.TrueB->succ_empty()) {
574 MachineBasicBlock *SB = *FP.TrueB->succ_begin();
575 TotalPh += computePhiCost(SB, FP);
578 if (FP.FalseB && !FP.FalseB->succ_empty()) {
579 MachineBasicBlock *SB = *FP.FalseB->succ_begin();
580 TotalPh += computePhiCost(SB, FP);
624 FlowPattern FP;
625 if (!matchFlowPattern(B, L, FP))
628 if (!isValid(FP)) {
632 if (!isProfitable(FP)) {
637 convert(FP);
638 simplifyFlowGraph(FP);
809 const FlowPattern &FP) {
819 if (BO.getMBB() == FP.SplitB)
821 else if (BO.getMBB() == FP.TrueB)
823 else if (BO.getMBB() == FP.FalseB)
841 MuxR = buildMux(FP.SplitB, FP.SplitB->getFirstTerminator(), RC,
842 FP.PredR, TR, TSR, FR, FSR);
853 PN->addOperand(MachineOperand::CreateMBB(FP.SplitB));
857 void HexagonEarlyIfConversion::convert(const FlowPattern &FP) {
859 MachineBasicBlock::iterator OldTI = FP.SplitB->getFirstTerminator();
860 assert(OldTI != FP.SplitB->end());
863 if (FP.TrueB) {
864 TSB = *FP.TrueB->succ_begin();
865 predicateBlockNB(FP.SplitB, OldTI, FP.TrueB, FP.PredR, true);
867 if (FP.FalseB) {
868 FSB = *FP.FalseB->succ_begin();
869 MachineBasicBlock::iterator At = FP.SplitB->getFirstTerminator();
870 predicateBlockNB(FP.SplitB, At, FP.FalseB, FP.PredR, false);
877 FP.SplitB->erase(OldTI, FP.SplitB->end());
878 while (!FP.SplitB->succ_empty()) {
879 MachineBasicBlock *T = *FP.SplitB->succ_begin();
894 if (T != FP.TrueB && T != FP.FalseB) {
898 FP.SplitB->removeSuccessor(FP.SplitB->succ_begin());
905 if (FP.JoinB) {
906 assert(!SSB || SSB == FP.JoinB);
907 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump))
908 .addMBB(FP.JoinB);
909 FP.SplitB->addSuccessor(FP.JoinB);
913 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jumpt))
914 .addReg(FP.PredR)
916 FP.SplitB->addSuccessor(TSB);
922 MachineInstrBuilder MIB = BuildMI(*FP.SplitB, FP.SplitB->end(), DL, D);
924 MIB.addReg(FP.PredR);
926 FP.SplitB->addSuccessor(FSB);
933 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump))
935 FP.SplitB->addSuccessor(SSB);
941 if (FP.JoinB) {
942 updatePhiNodes(FP.JoinB, FP);
945 updatePhiNodes(TSB, FP);
947 updatePhiNodes(FSB, FP);
1024 void HexagonEarlyIfConversion::simplifyFlowGraph(const FlowPattern &FP) {
1025 MachineBasicBlock *OldLayoutSuccessor = FP.SplitB->getNextNode();
1026 if (FP.TrueB)
1027 removeBlock(FP.TrueB);
1028 if (FP.FalseB)
1029 removeBlock(FP.FalseB);
1031 FP.SplitB->updateTerminator(OldLayoutSuccessor);
1032 if (FP.SplitB->succ_size() != 1)
1035 MachineBasicBlock *SB = *FP.SplitB->succ_begin();
1041 // minators in FP.Split+SB, and that requires working analyzeBranch, which
1045 mergeBlocks(FP.SplitB, SB);