/// Handle a rare case where the disintegrated nodes instructions /// no longer dominate all their uses. Not sure if this is really nessasary void StructurizeCFG::rebuildSSA() { SSAUpdater Updater; for (const auto &BB : ParentRegion->blocks()) for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II) { bool Initialized = false; for (auto I = II->use_begin(), E = II->use_end(); I != E;) { Use &U = *I++; Instruction *User = cast<Instruction>(U.getUser()); if (User->getParent() == BB) { continue; } else if (PHINode *UserPN = dyn_cast<PHINode>(User)) { if (UserPN->getIncomingBlock(U) == BB) continue; } if (DT->dominates(II, User)) continue; if (!Initialized) { Value *Undef = UndefValue::get(II->getType()); Updater.Initialize(II->getType(), ""); Updater.AddAvailableValue(&Func->getEntryBlock(), Undef); Updater.AddAvailableValue(BB, II); Initialized = true; } Updater.RewriteUseAfterInsertions(U); } } }
/// isLCSSAForm - Return true if the Loop is in LCSSA form bool Loop::isLCSSAForm(DominatorTree &DT) const { // Sort the blocks vector so that we can use binary search to do quick // lookups. SmallPtrSet<BasicBlock*, 16> LoopBBs(block_begin(), block_end()); for (block_iterator BI = block_begin(), E = block_end(); BI != E; ++BI) { BasicBlock *BB = *BI; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;++I) for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) { User *U = *UI; BasicBlock *UserBB = cast<Instruction>(U)->getParent(); if (PHINode *P = dyn_cast<PHINode>(U)) UserBB = P->getIncomingBlock(UI); // Check the current block, as a fast-path, before checking whether // the use is anywhere in the loop. Most values are used in the same // block they are defined in. Also, blocks not reachable from the // entry are special; uses in them don't need to go through PHIs. if (UserBB != BB && !LoopBBs.count(UserBB) && DT.isReachableFromEntry(UserBB)) return false; } } return true; }
/// If there's a single exit block, sink any loop-invariant values that /// were defined in the preheader but not used inside the loop into the /// exit block to reduce register pressure in the loop. void IndVarSimplify::SinkUnusedInvariants(Loop *L) { BasicBlock *ExitBlock = L->getExitBlock(); if (!ExitBlock) return; BasicBlock *Preheader = L->getLoopPreheader(); if (!Preheader) return; Instruction *InsertPt = ExitBlock->getFirstNonPHI(); BasicBlock::iterator I = Preheader->getTerminator(); while (I != Preheader->begin()) { --I; // New instructions were inserted at the end of the preheader. if (isa<PHINode>(I)) break; // Don't move instructions which might have side effects, since the side // effects need to complete before instructions inside the loop. Also // don't move instructions which might read memory, since the loop may // modify memory. Note that it's okay if the instruction might have // undefined behavior: LoopSimplify guarantees that the preheader // dominates the exit block. if (I->mayHaveSideEffects() || I->mayReadFromMemory()) continue; // Don't sink static AllocaInsts out of the entry block, which would // turn them into dynamic allocas! if (AllocaInst *AI = dyn_cast<AllocaInst>(I)) if (AI->isStaticAlloca()) continue; // Determine if there is a use in or before the loop (direct or // otherwise). bool UsedInLoop = false; for (Value::use_iterator UI = I->use_begin(), UE = I->use_end(); UI != UE; ++UI) { BasicBlock *UseBB = cast<Instruction>(UI)->getParent(); if (PHINode *P = dyn_cast<PHINode>(UI)) { unsigned i = PHINode::getIncomingValueNumForOperand(UI.getOperandNo()); UseBB = P->getIncomingBlock(i); } if (UseBB == Preheader || L->contains(UseBB)) { UsedInLoop = true; break; } } // If there is, the def must remain in the preheader. if (UsedInLoop) continue; // Otherwise, sink it to the exit block. Instruction *ToMove = I; bool Done = false; if (I != Preheader->begin()) --I; else Done = true; ToMove->moveBefore(InsertPt); if (Done) break; InsertPt = ToMove; } }
bool RemoveExtendsPass::runOnFunction(Function& f) { CurrentFile::set(__FILE__); bool changed = false ; //see if there are any ROCCCNames or ROCCCSizes that caused the extend for(Function::iterator BB = f.begin(); BB != f.end(); ++BB) { begin: for(BasicBlock::iterator II = BB->begin(); II != BB->end(); ++II) { if( dynamic_cast<FPExtInst*>(&*II) or dynamic_cast<ZExtInst*>(&*II) or dynamic_cast<SExtInst*>(&*II) or dynamic_cast<BitCastInst*>(&*II) ) { INTERNAL_MESSAGE("Attempting to remove uses of " << II->getName() << "\n"); for(Value::use_iterator UI = II->use_begin(); UI != II->use_end(); ++UI) { dynamic_cast<Instruction*>(*UI)->replaceUsesOfWith(II, II->getOperand(0)); goto begin; } if( II->use_begin() == II->use_end() ) { II->eraseFromParent(); II = BB->begin(); } else { INTERNAL_ERROR("Extend " << *II << " is still used in " << **II->use_begin() << "!"); assert(0 and "Extend operation still exists!"); } } } } return changed ; }
/// Handle a rare case where the disintegrated nodes instructions /// no longer dominate all their uses. Not sure if this is really nessasary void StructurizeCFG::rebuildSSA() { SSAUpdater Updater; for (Region::block_iterator I = ParentRegion->block_begin(), E = ParentRegion->block_end(); I != E; ++I) { BasicBlock *BB = *I; for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II) { bool Initialized = false; for (Use *I = &II->use_begin().getUse(), *Next; I; I = Next) { Next = I->getNext(); Instruction *User = cast<Instruction>(I->getUser()); if (User->getParent() == BB) { continue; } else if (PHINode *UserPN = dyn_cast<PHINode>(User)) { if (UserPN->getIncomingBlock(*I) == BB) continue; } if (DT->dominates(II, User)) continue; if (!Initialized) { Value *Undef = UndefValue::get(II->getType()); Updater.Initialize(II->getType(), ""); Updater.AddAvailableValue(&Func->getEntryBlock(), Undef); Updater.AddAvailableValue(BB, II); Initialized = true; } Updater.RewriteUseAfterInsertions(*I); } } } }
/// isLCSSAForm - Return true if the Loop is in LCSSA form bool Loop::isLCSSAForm() const { // Sort the blocks vector so that we can use binary search to do quick // lookups. SmallPtrSet<BasicBlock *, 16> LoopBBs(block_begin(), block_end()); for (block_iterator BI = block_begin(), E = block_end(); BI != E; ++BI) { BasicBlock *BB = *BI; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;++I) for (Value::use_iterator UI = I->use_begin(), E = I->use_end(); UI != E; ++UI) { BasicBlock *UserBB = cast<Instruction>(*UI)->getParent(); if (PHINode *P = dyn_cast<PHINode>(*UI)) UserBB = P->getIncomingBlock(UI); // Check the current block, as a fast-path. Most values are used in // the same block they are defined in. if (UserBB != BB && !LoopBBs.count(UserBB)) return false; } } return true; }
bool UnregisteredFanoutAnalysisPass::runOnFunction(Function& f) { CurrentFile::set(__FILE__); bool changed = false ; if (f.isDeclaration() || f.getDFFunction() == NULL) { return changed ; } unsigned int MAX_FANOUT = 50; std::ifstream file(".ROCCC/.timingInfo"); if (!file) { INTERNAL_SERIOUS_WARNING("Could not open timing information file for max fanout!\n"); } else { while( !file.eof() ) { std::string name; int value = -1; file >> name; //allow comments if( name.find("#") == 0 or name.find("//") == 0 or name.find("--") == 0 ) { std::string temp; std::getline(file, temp); } else { file >> value; } if( name == "MaxFanoutRegistered" and value >= 0 ) { MAX_FANOUT = value; } } } LOG_MESSAGE2("Pipelining", "Fanout Analysis", "In order to reduce the negative effect on frequency that a high unregistered fanout can have, operations with a fanout greater than " << MAX_FANOUT << " will be registered.\n"); std::map<DFBasicBlock*, bool> allBlocks = getPipelineBlocks(f); for(std::map<DFBasicBlock*,bool>::iterator BBI = allBlocks.begin(); BBI != allBlocks.end(); ++BBI) { if( BBI->second ) { for( BasicBlock::iterator II = BBI->first->begin(); II != BBI->first->end(); ++II ) { unsigned int realFanout = 0; for(Instruction::use_iterator UI = II->use_begin(); UI != II->use_end(); ++UI) { if( dynamic_cast<Instruction*>(*UI) and allBlocks.find(dynamic_cast<Instruction*>(*UI)->getParent()->getDFBasicBlock()) != allBlocks.end() and allBlocks.find(dynamic_cast<Instruction*>(*UI)->getParent()->getDFBasicBlock())->second != false and !isDefinition(dynamic_cast<Instruction*>(*UI), II) ) { ++realFanout; } } if( realFanout > MAX_FANOUT ) { LOG_MESSAGE2("Pipelining", "Fanout Analysis", getValueName(II) << " has fanout of " << realFanout << "; " "Putting " << getValueName(II) << " into own pipeline stage.\n"); Pipelining::TimingRequirements* timing = Pipelining::TimingRequirements::getCurrentRequirements(&f); timing->setBasicBlockDelay(BBI->first, timing->getDesiredDelay()); } } } } return changed ; }
void DSWP::buildPDG(Loop *L) { //Initialize PDG for (Loop::block_iterator bi = L->getBlocks().begin(); bi != L->getBlocks().end(); bi++) { BasicBlock *BB = *bi; for (BasicBlock::iterator ui = BB->begin(); ui != BB->end(); ui++) { Instruction *inst = &(*ui); //standardlize the name for all expr if (util.hasNewDef(inst)) { inst->setName(util.genId()); dname[inst] = inst->getNameStr(); } else { dname[inst] = util.genId(); } pdg[inst] = new vector<Edge>(); rev[inst] = new vector<Edge>(); } } //LoopInfo &li = getAnalysis<LoopInfo>(); /* * Memory dependency analysis */ MemoryDependenceAnalysis &mda = getAnalysis<MemoryDependenceAnalysis>(); for (Loop::block_iterator bi = L->getBlocks().begin(); bi != L->getBlocks().end(); bi++) { BasicBlock *BB = *bi; for (BasicBlock::iterator ii = BB->begin(); ii != BB->end(); ii++) { Instruction *inst = &(*ii); //data dependence = register dependence + memory dependence //begin register dependence for (Value::use_iterator ui = ii->use_begin(); ui != ii->use_end(); ui++) { if (Instruction *user = dyn_cast<Instruction>(*ui)) { addEdge(inst, user, REG); } } //finish register dependence //begin memory dependence MemDepResult mdr = mda.getDependency(inst); //TODO not sure clobbers mean!! if (mdr.isDef()) { Instruction *dep = mdr.getInst(); if (isa<LoadInst>(inst)) { if (isa<StoreInst>(dep)) { addEdge(dep, inst, DTRUE); //READ AFTER WRITE } } if (isa<StoreInst>(inst)) { if (isa<LoadInst>(dep)) { addEdge(dep, inst, DANTI); //WRITE AFTER READ } if (isa<StoreInst>(dep)) { addEdge(dep, inst, DOUT); //WRITE AFTER WRITE } } //READ AFTER READ IS INSERT AFTER PDG BUILD } //end memory dependence }//for ii }//for bi /* * begin control dependence */ PostDominatorTree &pdt = getAnalysis<PostDominatorTree>(); //cout << pdt.getRootNode()->getBlock()->getNameStr() << endl; /* * alien code part 1 */ LoopInfo *LI = &getAnalysis<LoopInfo>(); std::set<BranchInst*> backedgeParents; for (Loop::block_iterator bi = L->getBlocks().begin(); bi != L->getBlocks().end(); bi++) { BasicBlock *BB = *bi; for (BasicBlock::iterator ii = BB->begin(); ii != BB->end(); ii++) { Instruction *inst = ii; if (BranchInst *brInst = dyn_cast<BranchInst>(inst)) { // get the loop this instruction (and therefore basic block) belongs to Loop *instLoop = LI->getLoopFor(BB); bool branchesToHeader = false; for (int i = brInst->getNumSuccessors() - 1; i >= 0 && !branchesToHeader; i--) { // if the branch could exit, store it if (LI->getLoopFor(brInst->getSuccessor(i)) != instLoop) { branchesToHeader = true; } } if (branchesToHeader) { backedgeParents.insert(brInst); } } } } //build information for predecessor of blocks in post dominator tree for (Function::iterator bi = func->begin(); bi != func->end(); bi++) { BasicBlock *BB = bi; DomTreeNode *dn = pdt.getNode(BB); for (DomTreeNode::iterator di = dn->begin(); di != dn->end(); di++) { BasicBlock *CB = (*di)->getBlock(); pre[CB] = BB; } } // // //add dependency within a basicblock // for (Loop::block_iterator bi = L->getBlocks().begin(); bi != L->getBlocks().end(); bi++) { // BasicBlock *BB = *bi; // Instruction *pre = NULL; // for (BasicBlock::iterator ui = BB->begin(); ui != BB->end(); ui++) { // Instruction *inst = &(*ui); // if (pre != NULL) { // addEdge(pre, inst, CONTROL); // } // pre = inst; // } // } // //the special kind of dependence need loop peeling ? I don't know whether this is needed // for (Loop::block_iterator bi = L->getBlocks().begin(); bi != L->getBlocks().end(); bi++) { // BasicBlock *BB = *bi; // for (succ_iterator PI = succ_begin(BB); PI != succ_end(BB); ++PI) { // BasicBlock *succ = *PI; // // checkControlDependence(BB, succ, pdt); // } // } /* * alien code part 2 */ // add normal control dependencies // loop through each instruction for (Loop::block_iterator bbIter = L->block_begin(); bbIter != L->block_end(); ++bbIter) { BasicBlock *bb = *bbIter; // check the successors of this basic block if (BranchInst *branchInst = dyn_cast<BranchInst>(bb->getTerminator())) { if (branchInst->getNumSuccessors() > 1) { BasicBlock * succ = branchInst->getSuccessor(0); // if the successor is nested shallower than the current basic block, continue if (LI->getLoopDepth(bb) < LI->getLoopDepth(succ)) { continue; } // otherwise, add all instructions to graph as control dependence while (succ != NULL && succ != bb && LI->getLoopDepth(succ) >= LI->getLoopDepth(bb)) { Instruction *terminator = bb->getTerminator(); for (BasicBlock::iterator succInstIter = succ->begin(); &(*succInstIter) != succ->getTerminator(); ++succInstIter) { addEdge(terminator, &(*succInstIter), CONTROL); } if (BranchInst *succBrInst = dyn_cast<BranchInst>(succ->getTerminator())) { if (succBrInst->getNumSuccessors() > 1) { addEdge(terminator, succ->getTerminator(), CONTROL); } } if (BranchInst *br = dyn_cast<BranchInst>(succ->getTerminator())) { if (br->getNumSuccessors() == 1) { succ = br->getSuccessor(0); } else { succ = NULL; } } else { succ = NULL; } } } } } /* * alien code part 3 */ for (std::set<BranchInst*>::iterator exitIter = backedgeParents.begin(); exitIter != backedgeParents.end(); ++exitIter) { BranchInst *exitBranch = *exitIter; if (exitBranch->isConditional()) { BasicBlock *header = LI->getLoopFor(exitBranch->getParent())->getHeader(); for (BasicBlock::iterator ctrlIter = header->begin(); ctrlIter != header->end(); ++ctrlIter) { addEdge(exitBranch, &(*ctrlIter), CONTROL); } } } //end control dependence }
bool LoopUnroll::visitLoop(Loop *L) { bool Changed = false; // Recurse through all subloops before we process this loop. Copy the loop // list so that the child can update the loop tree if it needs to delete the // loop. std::vector<Loop*> SubLoops(L->begin(), L->end()); for (unsigned i = 0, e = SubLoops.size(); i != e; ++i) Changed |= visitLoop(SubLoops[i]); // We only handle single basic block loops right now. if (L->getBlocks().size() != 1) return Changed; BasicBlock *BB = L->getHeader(); BranchInst *BI = dyn_cast<BranchInst>(BB->getTerminator()); if (BI == 0) return Changed; // Must end in a conditional branch ConstantInt *TripCountC = dyn_cast_or_null<ConstantInt>(L->getTripCount()); if (!TripCountC) return Changed; // Must have constant trip count! unsigned TripCount = TripCountC->getRawValue(); if (TripCount != TripCountC->getRawValue() || TripCount == 0) return Changed; // More than 2^32 iterations??? unsigned LoopSize = ApproximateLoopSize(L); DEBUG(std::cerr << "Loop Unroll: F[" << BB->getParent()->getName() << "] Loop %" << BB->getName() << " Loop Size = " << LoopSize << " Trip Count = " << TripCount << " - "); uint64_t Size = (uint64_t)LoopSize*(uint64_t)TripCount; if (Size > UnrollThreshold) { DEBUG(std::cerr << "TOO LARGE: " << Size << ">" << UnrollThreshold << "\n"); return Changed; } DEBUG(std::cerr << "UNROLLING!\n"); BasicBlock *LoopExit = BI->getSuccessor(L->contains(BI->getSuccessor(0))); // Create a new basic block to temporarily hold all of the cloned code. BasicBlock *NewBlock = new BasicBlock(); // For the first iteration of the loop, we should use the precloned values for // PHI nodes. Insert associations now. std::map<const Value*, Value*> LastValueMap; std::vector<PHINode*> OrigPHINode; for (BasicBlock::iterator I = BB->begin(); PHINode *PN = dyn_cast<PHINode>(I); ++I) { OrigPHINode.push_back(PN); if (Instruction *I =dyn_cast<Instruction>(PN->getIncomingValueForBlock(BB))) if (I->getParent() == BB) LastValueMap[I] = I; } // Remove the exit branch from the loop BB->getInstList().erase(BI); assert(TripCount != 0 && "Trip count of 0 is impossible!"); for (unsigned It = 1; It != TripCount; ++It) { char SuffixBuffer[100]; sprintf(SuffixBuffer, ".%d", It); std::map<const Value*, Value*> ValueMap; BasicBlock *New = CloneBasicBlock(BB, ValueMap, SuffixBuffer); // Loop over all of the PHI nodes in the block, changing them to use the // incoming values from the previous block. for (unsigned i = 0, e = OrigPHINode.size(); i != e; ++i) { PHINode *NewPHI = cast<PHINode>(ValueMap[OrigPHINode[i]]); Value *InVal = NewPHI->getIncomingValueForBlock(BB); if (Instruction *InValI = dyn_cast<Instruction>(InVal)) if (InValI->getParent() == BB) InVal = LastValueMap[InValI]; ValueMap[OrigPHINode[i]] = InVal; New->getInstList().erase(NewPHI); } for (BasicBlock::iterator I = New->begin(), E = New->end(); I != E; ++I) RemapInstruction(I, ValueMap); // Now that all of the instructions are remapped, splice them into the end // of the NewBlock. NewBlock->getInstList().splice(NewBlock->end(), New->getInstList()); delete New; // LastValue map now contains values from this iteration. std::swap(LastValueMap, ValueMap); } // If there was more than one iteration, replace any uses of values computed // in the loop with values computed during the last iteration of the loop. if (TripCount != 1) { std::set<User*> Users; for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) Users.insert(I->use_begin(), I->use_end()); // We don't want to reprocess entries with PHI nodes in them. For this // reason, we look at each operand of each user exactly once, performing the // stubstitution exactly once. for (std::set<User*>::iterator UI = Users.begin(), E = Users.end(); UI != E; ++UI) { Instruction *I = cast<Instruction>(*UI); if (I->getParent() != BB && I->getParent() != NewBlock) RemapInstruction(I, LastValueMap); } } // Now that we cloned the block as many times as we needed, stitch the new // code into the original block and delete the temporary block. BB->getInstList().splice(BB->end(), NewBlock->getInstList()); delete NewBlock; // Now loop over the PHI nodes in the original block, setting them to their // incoming values. BasicBlock *Preheader = L->getLoopPreheader(); for (unsigned i = 0, e = OrigPHINode.size(); i != e; ++i) { PHINode *PN = OrigPHINode[i]; PN->replaceAllUsesWith(PN->getIncomingValueForBlock(Preheader)); BB->getInstList().erase(PN); } // Finally, add an unconditional branch to the block to continue into the exit // block. new BranchInst(LoopExit, BB); // At this point, the code is well formed. We now do a quick sweep over the // inserted code, doing constant propagation and dead code elimination as we // go. for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ) { Instruction *Inst = I++; if (isInstructionTriviallyDead(Inst)) BB->getInstList().erase(Inst); else if (Constant *C = ConstantFoldInstruction(Inst)) { Inst->replaceAllUsesWith(C); BB->getInstList().erase(Inst); } } // Update the loop information for this loop. Loop *Parent = L->getParentLoop(); // Move all of the basic blocks in the loop into the parent loop. LI->changeLoopFor(BB, Parent); // Remove the loop from the parent. if (Parent) delete Parent->removeChildLoop(std::find(Parent->begin(), Parent->end(),L)); else delete LI->removeLoop(std::find(LI->begin(), LI->end(), L)); // FIXME: Should update dominator analyses // Now that everything is up-to-date that will be, we fold the loop block into // the preheader and exit block, updating our analyses as we go. LoopExit->getInstList().splice(LoopExit->begin(), BB->getInstList(), BB->getInstList().begin(), prior(BB->getInstList().end())); LoopExit->getInstList().splice(LoopExit->begin(), Preheader->getInstList(), Preheader->getInstList().begin(), prior(Preheader->getInstList().end())); // Make all other blocks in the program branch to LoopExit now instead of // Preheader. Preheader->replaceAllUsesWith(LoopExit); // Remove BB and LoopExit from our analyses. LI->removeBlock(Preheader); LI->removeBlock(BB); // If the preheader was the entry block of this function, move the exit block // to be the new entry of the loop. Function *F = LoopExit->getParent(); if (Preheader == &F->front()) F->getBasicBlockList().splice(F->begin(), F->getBasicBlockList(), LoopExit); // Actually delete the blocks now. F->getBasicBlockList().erase(Preheader); F->getBasicBlockList().erase(BB); ++NumUnrolled; return true; }
// TransformSetJmpCall - The setjmp call is a bit trickier to transform. // We're going to convert all setjmp calls to nops. Then all "call" and // "invoke" instructions in the function are converted to "invoke" where // the "except" branch is used when returning from a longjmp call. void LowerSetJmp::TransformSetJmpCall(CallInst* Inst) { BasicBlock* ABlock = Inst->getParent(); Function* Func = ABlock->getParent(); // Add this setjmp to the setjmp map. const Type* SBPTy = PointerType::getUnqual(Type::Int8Ty); CastInst* BufPtr = new BitCastInst(Inst->getOperand(1), SBPTy, "SBJmpBuf", Inst); std::vector<Value*> Args = make_vector<Value*>(GetSetJmpMap(Func), BufPtr, ConstantInt::get(Type::Int32Ty, SetJmpIDMap[Func]++), 0); CallInst::Create(AddSJToMap, Args.begin(), Args.end(), "", Inst); // We are guaranteed that there are no values live across basic blocks // (because we are "not in SSA form" yet), but there can still be values live // in basic blocks. Because of this, splitting the setjmp block can cause // values above the setjmp to not dominate uses which are after the setjmp // call. For all of these occasions, we must spill the value to the stack. // std::set<Instruction*> InstrsAfterCall; // The call is probably very close to the end of the basic block, for the // common usage pattern of: 'if (setjmp(...))', so keep track of the // instructions after the call. for (BasicBlock::iterator I = ++BasicBlock::iterator(Inst), E = ABlock->end(); I != E; ++I) InstrsAfterCall.insert(I); for (BasicBlock::iterator II = ABlock->begin(); II != BasicBlock::iterator(Inst); ++II) // Loop over all of the uses of instruction. If any of them are after the // call, "spill" the value to the stack. for (Value::use_iterator UI = II->use_begin(), E = II->use_end(); UI != E; ++UI) if (cast<Instruction>(*UI)->getParent() != ABlock || InstrsAfterCall.count(cast<Instruction>(*UI))) { DemoteRegToStack(*II); break; } InstrsAfterCall.clear(); // Change the setjmp call into a branch statement. We'll remove the // setjmp call in a little bit. No worries. BasicBlock* SetJmpContBlock = ABlock->splitBasicBlock(Inst); assert(SetJmpContBlock && "Couldn't split setjmp BB!!"); SetJmpContBlock->setName(ABlock->getName()+"SetJmpCont"); // Add the SetJmpContBlock to the set of blocks reachable from a setjmp. DFSBlocks.insert(SetJmpContBlock); // This PHI node will be in the new block created from the // splitBasicBlock call. PHINode* PHI = PHINode::Create(Type::Int32Ty, "SetJmpReturn", Inst); // Coming from a call to setjmp, the return is 0. PHI->addIncoming(ConstantInt::getNullValue(Type::Int32Ty), ABlock); // Add the case for this setjmp's number... SwitchValuePair SVP = GetSJSwitch(Func, GetRethrowBB(Func)); SVP.first->addCase(ConstantInt::get(Type::Int32Ty, SetJmpIDMap[Func] - 1), SetJmpContBlock); // Value coming from the handling of the exception. PHI->addIncoming(SVP.second, SVP.second->getParent()); // Replace all uses of this instruction with the PHI node created by // the eradication of setjmp. Inst->replaceAllUsesWith(PHI); Inst->getParent()->getInstList().erase(Inst); ++SetJmpsTransformed; }
void RegionExtractor::findInputsOutputs(ValueSet &Inputs, ValueSet &Outputs) const { for (SetVector<BasicBlock *>::const_iterator I = Blocks.begin(), E = Blocks.end(); I != E; ++I) { BasicBlock *BB = *I; // If a used value is defined outside the region, it's an input. If an // instruction is used outside the region, it's an output. for (BasicBlock::iterator II = BB->begin(), IE = BB->end(); II != IE; ++II) { for (User::op_iterator OI = II->op_begin(), OE = II->op_end(); OI != OE; ++OI) if (definedInCaller(Blocks, *OI)) Inputs.insert(*OI); #if LLVM_VERSION_MINOR == 5 for (User *U : II->users()) if (!definedInRegion(Blocks, U)) { #else for (Value::use_iterator UI = II->use_begin(), UE = II->use_end(); UI != UE; ++UI) if (!definedInRegion(Blocks, *UI)) { #endif Outputs.insert(II); break; } } } } /// severSplitPHINodes - If a PHI node has multiple inputs from outside of the /// region, we need to split the entry block of the region so that the PHI node /// is easier to deal with. void RegionExtractor::severSplitPHINodes(BasicBlock *&Header) { unsigned NumPredsFromRegion = 0; unsigned NumPredsOutsideRegion = 0; if (Header != &Header->getParent()->getEntryBlock()) { PHINode *PN = dyn_cast<PHINode>(Header->begin()); if (!PN) return; // No PHI nodes. // If the header node contains any PHI nodes, check to see if there is more // than one entry from outside the region. If so, we need to sever the // header block into two. for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) if (Blocks.count(PN->getIncomingBlock(i))) ++NumPredsFromRegion; else ++NumPredsOutsideRegion; // If there is one (or fewer) predecessor from outside the region, we don't // need to do anything special. if (NumPredsOutsideRegion <= 1) return; } // Otherwise, we need to split the header block into two pieces: one // containing PHI nodes merging values from outside of the region, and a // second that contains all of the code for the block and merges back any // incoming values from inside of the region. BasicBlock::iterator AfterPHIs = Header->getFirstNonPHI(); BasicBlock *NewBB = Header->splitBasicBlock(AfterPHIs, Header->getName()+".ce"); // We only want to code extract the second block now, and it becomes the new // header of the region. BasicBlock *OldPred = Header; Blocks.remove(OldPred); Blocks.insert(NewBB); Header = NewBB; // Okay, update dominator sets. The blocks that dominate the new one are the // blocks that dominate TIBB plus the new block itself. if (DT) DT->splitBlock(NewBB); // Okay, now we need to adjust the PHI nodes and any branches from within the // region to go to the new header block instead of the old header block. if (NumPredsFromRegion) { PHINode *PN = cast<PHINode>(OldPred->begin()); // Loop over all of the predecessors of OldPred that are in the region, // changing them to branch to NewBB instead. for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) if (Blocks.count(PN->getIncomingBlock(i))) { TerminatorInst *TI = PN->getIncomingBlock(i)->getTerminator(); TI->replaceUsesOfWith(OldPred, NewBB); } // Okay, everything within the region is now branching to the right block, we // just have to update the PHI nodes now, inserting PHI nodes into NewBB. for (AfterPHIs = OldPred->begin(); isa<PHINode>(AfterPHIs); ++AfterPHIs) { PHINode *PN = cast<PHINode>(AfterPHIs); // Create a new PHI node in the new region, which has an incoming value // from OldPred of PN. PHINode *NewPN = PHINode::Create(PN->getType(), 1 + NumPredsFromRegion, PN->getName()+".ce", NewBB->begin()); NewPN->addIncoming(PN, OldPred); // Loop over all of the incoming value in PN, moving them to NewPN if they // are from the extracted region. for (unsigned i = 0; i != PN->getNumIncomingValues(); ++i) { if (Blocks.count(PN->getIncomingBlock(i))) { NewPN->addIncoming(PN->getIncomingValue(i), PN->getIncomingBlock(i)); PN->removeIncomingValue(i); --i; } } } } }