Home | History | Annotate | Download | only in NVPTX
      1 //===- NVPTXSplitBBatBar.cpp - Split BB at Barrier  --*- C++ -*--===//
      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 // Split basic blocks so that a basic block that contains a barrier instruction
     10 // only contains the barrier instruction.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "NVPTXSplitBBatBar.h"
     15 #include "NVPTXUtilities.h"
     16 #include "llvm/IR/Function.h"
     17 #include "llvm/IR/Instructions.h"
     18 #include "llvm/IR/IntrinsicInst.h"
     19 #include "llvm/IR/Intrinsics.h"
     20 #include "llvm/Support/InstIterator.h"
     21 
     22 using namespace llvm;
     23 
     24 namespace llvm { FunctionPass *createSplitBBatBarPass(); }
     25 
     26 char NVPTXSplitBBatBar::ID = 0;
     27 
     28 bool NVPTXSplitBBatBar::runOnFunction(Function &F) {
     29 
     30   SmallVector<Instruction *, 4> SplitPoints;
     31   bool changed = false;
     32 
     33   // Collect all the split points in SplitPoints
     34   for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) {
     35     BasicBlock::iterator IB = BI->begin();
     36     BasicBlock::iterator II = IB;
     37     BasicBlock::iterator IE = BI->end();
     38 
     39     // Skit the first intruction. No splitting is needed at this
     40     // point even if this is a bar.
     41     while (II != IE) {
     42       if (IntrinsicInst *inst = dyn_cast<IntrinsicInst>(II)) {
     43         Intrinsic::ID id = inst->getIntrinsicID();
     44         // If this is a barrier, split at this instruction
     45         // and the next instruction.
     46         if (llvm::isBarrierIntrinsic(id)) {
     47           if (II != IB)
     48             SplitPoints.push_back(II);
     49           II++;
     50           if ((II != IE) && (!II->isTerminator())) {
     51             SplitPoints.push_back(II);
     52             II++;
     53           }
     54           continue;
     55         }
     56       }
     57       II++;
     58     }
     59   }
     60 
     61   for (unsigned i = 0; i != SplitPoints.size(); i++) {
     62     changed = true;
     63     Instruction *inst = SplitPoints[i];
     64     inst->getParent()->splitBasicBlock(inst, "bar_split");
     65   }
     66 
     67   return changed;
     68 }
     69 
     70 // This interface will most likely not be necessary, because this pass will
     71 // not be invoked by the driver, but will be used as a prerequisite to
     72 // another pass.
     73 FunctionPass *llvm::createSplitBBatBarPass() { return new NVPTXSplitBBatBar(); }
     74