LCOV - code coverage report
Current view: top level - lib/Target/AMDGPU - SIFixControlFlowLiveIntervals.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 18 22 81.8 %
Date: 2017-08-04 15:09:32 Functions: 7 9 77.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- SIFixControlFlowLiveIntervals.cpp - Fix CF live intervals ---------===//
       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             : /// \file
      11             : /// \brief Spilling of EXEC masks used for control flow messes up control flow
      12             : /// lowering, so mark all live intervals associated with CF instructions as
      13             : /// non-spillable.
      14             : ///
      15             : //===----------------------------------------------------------------------===//
      16             : 
      17             : #include "AMDGPU.h"
      18             : #include "SIInstrInfo.h"
      19             : #include "llvm/CodeGen/LiveIntervalAnalysis.h"
      20             : #include "llvm/CodeGen/MachineFunctionPass.h"
      21             : #include "llvm/CodeGen/MachineRegisterInfo.h"
      22             : 
      23             : using namespace llvm;
      24             : 
      25             : #define DEBUG_TYPE "si-fix-cf-live-intervals"
      26             : 
      27             : namespace {
      28             : 
      29        1391 : class SIFixControlFlowLiveIntervals : public MachineFunctionPass {
      30             : public:
      31             :   static char ID;
      32             : 
      33             : public:
      34        1399 :   SIFixControlFlowLiveIntervals() : MachineFunctionPass(ID) {
      35        1399 :     initializeSIFixControlFlowLiveIntervalsPass(*PassRegistry::getPassRegistry());
      36        1399 :   }
      37             : 
      38             :   bool runOnMachineFunction(MachineFunction &MF) override;
      39             : 
      40        1399 :   StringRef getPassName() const override { return "SI Fix CF Live Intervals"; }
      41             : 
      42        1399 :   void getAnalysisUsage(AnalysisUsage &AU) const override {
      43        1399 :     AU.addRequired<LiveIntervals>();
      44        1399 :     AU.setPreservesAll();
      45        1399 :     MachineFunctionPass::getAnalysisUsage(AU);
      46        1399 :   }
      47             : };
      48             : 
      49             : } // End anonymous namespace.
      50             : 
      51       51962 : INITIALIZE_PASS_BEGIN(SIFixControlFlowLiveIntervals, DEBUG_TYPE,
      52             :                       "SI Fix CF Live Intervals", false, false)
      53       51962 : INITIALIZE_PASS_DEPENDENCY(LiveIntervals)
      54      310861 : INITIALIZE_PASS_END(SIFixControlFlowLiveIntervals, DEBUG_TYPE,
      55             :                     "SI Fix CF Live Intervals", false, false)
      56             : 
      57             : char SIFixControlFlowLiveIntervals::ID = 0;
      58             : 
      59             : char &llvm::SIFixControlFlowLiveIntervalsID = SIFixControlFlowLiveIntervals::ID;
      60             : 
      61           0 : FunctionPass *llvm::createSIFixControlFlowLiveIntervalsPass() {
      62           0 :   return new SIFixControlFlowLiveIntervals();
      63             : }
      64             : 
      65       14300 : bool SIFixControlFlowLiveIntervals::runOnMachineFunction(MachineFunction &MF) {
      66       14300 :   LiveIntervals *LIS = &getAnalysis<LiveIntervals>();
      67             : 
      68       59115 :   for (const MachineBasicBlock &MBB : MF) {
      69      592900 :     for (const MachineInstr &MI : MBB) {
      70             :       switch (MI.getOpcode()) {
      71             :         case AMDGPU::SI_IF:
      72             :         case AMDGPU::SI_ELSE:
      73             :         case AMDGPU::SI_BREAK:
      74             :         case AMDGPU::SI_IF_BREAK:
      75             :         case AMDGPU::SI_ELSE_BREAK:
      76             :         case AMDGPU::SI_END_CF: {
      77           0 :           unsigned Reg = MI.getOperand(0).getReg();
      78           0 :           LIS->getInterval(Reg).markNotSpillable();
      79             :           break;
      80             :         }
      81             :         default:
      82             :           break;
      83             :       }
      84             :     }
      85             :   }
      86             : 
      87       14300 :   return false;
      88             : }

Generated by: LCOV version 1.13