LCOV - code coverage report
Current view: top level - lib/CodeGen - PHIEliminationUtils.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 17 17 100.0 %
Date: 2017-09-14 15:23:50 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- PHIEliminationUtils.cpp - Helper functions for PHI elimination ----===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : 
      10             : #include "PHIEliminationUtils.h"
      11             : #include "llvm/ADT/SmallPtrSet.h"
      12             : #include "llvm/CodeGen/MachineBasicBlock.h"
      13             : #include "llvm/CodeGen/MachineFunction.h"
      14             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      15             : using namespace llvm;
      16             : 
      17             : // findCopyInsertPoint - Find a safe place in MBB to insert a copy from SrcReg
      18             : // when following the CFG edge to SuccMBB. This needs to be after any def of
      19             : // SrcReg, but before any subsequent point where control flow might jump out of
      20             : // the basic block.
      21             : MachineBasicBlock::iterator
      22       73015 : llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB,
      23             :                              unsigned SrcReg) {
      24             :   // Handle the trivial case trivially.
      25       73015 :   if (MBB->empty())
      26             :     return MBB->begin();
      27             : 
      28             :   // Usually, we just want to insert the copy before the first terminator
      29             :   // instruction. However, for the edge going to a landing pad, we must insert
      30             :   // the copy before the call/invoke instruction.
      31       71297 :   if (!SuccMBB->isEHPad())
      32       71180 :     return MBB->getFirstTerminator();
      33             : 
      34             :   // Discover any defs/uses in this basic block.
      35         117 :   SmallPtrSet<MachineInstr*, 8> DefUsesInMBB;
      36         117 :   MachineRegisterInfo& MRI = MBB->getParent()->getRegInfo();
      37         553 :   for (MachineInstr &RI : MRI.reg_instructions(SrcReg)) {
      38         218 :     if (RI.getParent() == MBB)
      39         171 :       DefUsesInMBB.insert(&RI);
      40             :   }
      41             : 
      42         117 :   MachineBasicBlock::iterator InsertPoint;
      43         117 :   if (DefUsesInMBB.empty()) {
      44             :     // No defs.  Insert the copy at the start of the basic block.
      45           1 :     InsertPoint = MBB->begin();
      46         232 :   } else if (DefUsesInMBB.size() == 1) {
      47             :     // Insert the copy immediately after the def/use.
      48         189 :     InsertPoint = *DefUsesInMBB.begin();
      49             :     ++InsertPoint;
      50             :   } else {
      51             :     // Insert the copy immediately after the last def/use.
      52          53 :     InsertPoint = MBB->end();
      53         918 :     while (!DefUsesInMBB.count(&*--InsertPoint)) {}
      54             :     ++InsertPoint;
      55             :   }
      56             : 
      57             :   // Make sure the copy goes after any phi nodes but before
      58             :   // any debug nodes.
      59         117 :   return MBB->SkipPHIsAndLabels(InsertPoint);
      60             : }

Generated by: LCOV version 1.13