LCOV - code coverage report
Current view: top level - lib/CodeGen - PHIEliminationUtils.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 15 15 100.0 %
Date: 2018-10-20 13:21:21 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      424460 : llvm::findPHICopyInsertPoint(MachineBasicBlock* MBB, MachineBasicBlock* SuccMBB,
      23             :                              unsigned SrcReg) {
      24             :   // Handle the trivial case trivially.
      25      424460 :   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      415168 :   if (!SuccMBB->isEHPad())
      32      409097 :     return MBB->getFirstTerminator();
      33             : 
      34             :   // Discover any defs/uses in this basic block.
      35             :   SmallPtrSet<MachineInstr*, 8> DefUsesInMBB;
      36        6071 :   MachineRegisterInfo& MRI = MBB->getParent()->getRegInfo();
      37       12650 :   for (MachineInstr &RI : MRI.reg_instructions(SrcReg)) {
      38        6579 :     if (RI.getParent() == MBB)
      39        5466 :       DefUsesInMBB.insert(&RI);
      40             :   }
      41             : 
      42             :   MachineBasicBlock::iterator InsertPoint;
      43        6071 :   if (DefUsesInMBB.empty()) {
      44             :     // No defs.  Insert the copy at the start of the basic block.
      45         679 :     InsertPoint = MBB->begin();
      46        5392 :   } else if (DefUsesInMBB.size() == 1) {
      47             :     // Insert the copy immediately after the def/use.
      48        5323 :     InsertPoint = *DefUsesInMBB.begin();
      49             :     ++InsertPoint;
      50             :   } else {
      51             :     // Insert the copy immediately after the last def/use.
      52          69 :     InsertPoint = MBB->end();
      53         681 :     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        6071 :   return MBB->SkipPHIsAndLabels(InsertPoint);
      60             : }

Generated by: LCOV version 1.13