Lines Matching defs:SourceRegion
157 bool validateCandidates(CoalescingCandidateInfo &SourceRegion,
175 bool mergeCandidates(CoalescingCandidateInfo &SourceRegion,
181 bool canMerge(CoalescingCandidateInfo &SourceRegion,
483 /// \param[in] SourceRegion The candidate to move statements from
485 /// \return true if all instructions in SourceRegion.BranchBlock can be merged
489 CoalescingCandidateInfo &SourceRegion,
492 if (TargetRegion.BranchTargetBlock != SourceRegion.BranchBlock)
493 llvm_unreachable("Expecting SourceRegion to immediately follow TargetRegion");
494 else if (!MDT->dominates(TargetRegion.BranchBlock, SourceRegion.BranchBlock))
495 llvm_unreachable("Expecting TargetRegion to dominate SourceRegion");
496 else if (!MPDT->dominates(SourceRegion.BranchBlock, TargetRegion.BranchBlock))
497 llvm_unreachable("Expecting SourceRegion to post-dominate TargetRegion");
499 !SourceRegion.FallThroughBlock->empty())
508 /// 1. Move to the beginning of the SourceRegion.BranchTargetBlock;
511 /// TargetRegion.BranchTargetBlock (also SourceRegion.BranchBlock).
515 /// SourceRegion.BranchTargetBlock. This is not possible if any register defined
517 /// SourceRegion.BranchTargetBlock. In this case, check whether the statement
526 /// \param[in] SourceRegion The candidate to move statements from
528 /// \return true if all instructions in SourceRegion.BranchBlock can be merged
531 bool PPCBranchCoalescing::canMerge(CoalescingCandidateInfo &SourceRegion,
533 if (!validateCandidates(SourceRegion, TargetRegion))
537 // SourceRegion.BranchTargetBlock.
539 I = SourceRegion.BranchBlock->instr_begin(),
540 E = SourceRegion.BranchBlock->getFirstNonPHI();
544 if (Use.isPHI() && Use.getParent() == SourceRegion.BranchTargetBlock) {
552 if (Use.getParent() == SourceRegion.BranchBlock) {
556 SourceRegion.MustMoveDown = true;
562 // TargetRegion.BranchBlock (up) or SourceRegion.BranchTargetBlock (down)
564 I = SourceRegion.BranchBlock->getFirstNonPHI(),
565 E = SourceRegion.BranchBlock->end();
567 if (!canMoveToBeginning(*I, *SourceRegion.BranchTargetBlock)) {
570 SourceRegion.MustMoveUp = true;
575 SourceRegion.MustMoveDown = true;
579 return (SourceRegion.MustMoveUp && SourceRegion.MustMoveDown) ? false : true;
582 /// Merge the instructions from SourceRegion.BranchBlock,
583 /// SourceRegion.BranchTargetBlock, and SourceRegion.FallThroughBlock into
588 /// successors from blocks in SourceRegion. Finally, the blocks in SourceRegion
608 /// | SourceRegion.BranchBlock |
612 /// | | SourceRegion.FallThroughBlock |
616 /// | SourceRegion.BranchTargetBlock |
623 /// | SourceRegion.BranchBlock |
628 /// | | SourceRegion.FallThroughBlock |
632 /// | SourceRegion.BranchTargetBlock |
635 /// \param[in] SourceRegion The candidate to move blocks from
638 bool PPCBranchCoalescing::mergeCandidates(CoalescingCandidateInfo &SourceRegion,
641 if (SourceRegion.MustMoveUp && SourceRegion.MustMoveDown) {
646 if (!validateCandidates(SourceRegion, TargetRegion))
650 // Move any PHIs in SourceRegion.BranchBlock down to the branch-taken block
651 moveAndUpdatePHIs(SourceRegion.BranchBlock, SourceRegion.BranchTargetBlock);
653 // Move remaining instructions in SourceRegion.BranchBlock into
656 SourceRegion.BranchBlock->getFirstNonPHI();
658 SourceRegion.BranchBlock->getFirstTerminator();
660 MachineBasicBlock *Source = SourceRegion.MustMoveDown
661 ? SourceRegion.BranchTargetBlock
665 SourceRegion.MustMoveDown
666 ? SourceRegion.BranchTargetBlock->getFirstNonPHI()
669 Source->splice(Target, SourceRegion.BranchBlock, firstInstr, lastInstr);
674 // Remove SourceRegion.FallThroughBlock before transferring successors of
675 // SourceRegion.BranchBlock to TargetRegion.BranchBlock.
676 SourceRegion.BranchBlock->removeSuccessor(SourceRegion.FallThroughBlock);
678 SourceRegion.BranchBlock);
680 // SourceRegion.BranchTargetBlock
681 // In this case, TargetRegion.BranchTargetBlock == SourceRegion.BranchBlock.
683 SourceRegion.BranchBlock, SourceRegion.BranchTargetBlock);
684 // Remove the branch statement(s) in SourceRegion.BranchBlock
686 SourceRegion.BranchBlock->terminators().begin();
687 while (I != SourceRegion.BranchBlock->terminators().end()) {
702 SourceRegion.FallThroughBlock);
703 TargetRegion.FallThroughBlock->removeSuccessor(SourceRegion.BranchBlock);
707 assert(SourceRegion.BranchBlock->empty() &&
709 SourceRegion.BranchBlock->eraseFromParent();
711 assert(SourceRegion.FallThroughBlock->empty() &&
713 SourceRegion.FallThroughBlock->eraseFromParent();