Lines Matching refs: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_size() > 0) {
574 MachineBasicBlock *SB = *FP.TrueB->succ_begin();
575 TotalPh += computePhiCost(SB, FP);
578 if (FP.FalseB && FP.FalseB->succ_size() > 0) {
579 MachineBasicBlock *SB = *FP.FalseB->succ_begin();
580 TotalPh += computePhiCost(SB, FP);
626 FlowPattern FP;
627 if (!matchFlowPattern(B, L, FP))
630 if (!isValid(FP)) {
634 if (!isProfitable(FP)) {
639 convert(FP);
640 simplifyFlowGraph(FP);
811 const FlowPattern &FP) {
821 if (BO.getMBB() == FP.SplitB)
823 else if (BO.getMBB() == FP.TrueB)
825 else if (BO.getMBB() == FP.FalseB)
843 MuxR = buildMux(FP.SplitB, FP.SplitB->getFirstTerminator(), RC,
844 FP.PredR, TR, TSR, FR, FSR);
855 PN->addOperand(MachineOperand::CreateMBB(FP.SplitB));
859 void HexagonEarlyIfConversion::convert(const FlowPattern &FP) {
861 MachineBasicBlock::iterator OldTI = FP.SplitB->getFirstTerminator();
862 assert(OldTI != FP.SplitB->end());
865 if (FP.TrueB) {
866 TSB = *FP.TrueB->succ_begin();
867 predicateBlockNB(FP.SplitB, OldTI, FP.TrueB, FP.PredR, true);
869 if (FP.FalseB) {
870 FSB = *FP.FalseB->succ_begin();
871 MachineBasicBlock::iterator At = FP.SplitB->getFirstTerminator();
872 predicateBlockNB(FP.SplitB, At, FP.FalseB, FP.PredR, false);
879 FP.SplitB->erase(OldTI, FP.SplitB->end());
880 while (FP.SplitB->succ_size() > 0) {
881 MachineBasicBlock *T = *FP.SplitB->succ_begin();
896 if (T != FP.TrueB && T != FP.FalseB) {
900 FP.SplitB->removeSuccessor(FP.SplitB->succ_begin());
907 if (FP.JoinB) {
908 assert(!SSB || SSB == FP.JoinB);
909 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump))
910 .addMBB(FP.JoinB);
911 FP.SplitB->addSuccessor(FP.JoinB);
915 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jumpt))
916 .addReg(FP.PredR)
918 FP.SplitB->addSuccessor(TSB);
924 MachineInstrBuilder MIB = BuildMI(*FP.SplitB, FP.SplitB->end(), DL, D);
926 MIB.addReg(FP.PredR);
928 FP.SplitB->addSuccessor(FSB);
935 BuildMI(*FP.SplitB, FP.SplitB->end(), DL, HII->get(Hexagon::J2_jump))
937 FP.SplitB->addSuccessor(SSB);
943 if (FP.JoinB) {
944 updatePhiNodes(FP.JoinB, FP);
947 updatePhiNodes(TSB, FP);
949 updatePhiNodes(FSB, FP);
1025 void HexagonEarlyIfConversion::simplifyFlowGraph(const FlowPattern &FP) {
1026 if (FP.TrueB)
1027 removeBlock(FP.TrueB);
1028 if (FP.FalseB)
1029 removeBlock(FP.FalseB);
1031 FP.SplitB->updateTerminator();
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);