void Decompiler::sortBasicBlock(BasicBlock *BB) { BasicBlock::InstListType *Cur = &BB->getInstList(); BasicBlock::InstListType::iterator P, I, E, S; I = Cur->begin(); E = Cur->end(); while (I != E) { P = I; if (++I == E) { break; // Note the terminator is always last instruction } if (Dis->getDebugOffset(P->getDebugLoc()) <= Dis->getDebugOffset(I->getDebugLoc())) { continue; } while (--P != Cur->begin() && Dis->getDebugOffset(P->getDebugLoc()) > Dis->getDebugOffset(I->getDebugLoc())) { // Do nothing. } // Insert at P, remove at I S = I; ++S; Instruction *Tmp = &(*I); Cur->remove(I); Cur->insertAfter(P, Tmp); I = S; } I = Cur->begin(); E = Cur->end(); while (I != E) { // outs() << "Line #: " << I->getDebugLoc().getLine() << "\n"; ++I; } }
// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI) // with a value, then remove and delete the original instruction. // void llvm::ReplaceInstWithValue(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Value *V) { Instruction &I = *BI; // Replaces all of the uses of the instruction with uses of the value I.replaceAllUsesWith(V); std::string OldName = I.getName(); // Delete the unnecessary instruction now... BI = BIL.erase(BI); // Make sure to propagate a name if there is one already... if (OldName.size() && !V->hasName()) V->setName(OldName, &BIL.getParent()->getSymbolTable()); }
/// ReplaceInstWithValue - Replace all uses of an instruction (specified by BI) /// with a value, then remove and delete the original instruction. /// void llvm::ReplaceInstWithValue(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Value *V) { Instruction &I = *BI; // Replaces all of the uses of the instruction with uses of the value I.replaceAllUsesWith(V); // Make sure to propagate a name if there is one already. if (I.hasName() && !V->hasName()) V->takeName(&I); // Delete the unnecessary instruction now... BI = BIL.erase(BI); }
/// ReplaceInstWithInst - Replace the instruction specified by BI with the /// instruction specified by I. The original instruction is deleted and BI is /// updated to point to the new instruction. /// void llvm::ReplaceInstWithInst(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Instruction *I) { assert(I->getParent() == 0 && "ReplaceInstWithInst: Instruction already inserted into basic block!"); // Insert the new instruction into the basic block... BasicBlock::iterator New = BIL.insert(BI, I); // Replace all uses of the old instruction, and delete it. ReplaceInstWithValue(BIL, BI, I); // Move BI back to point to the newly inserted instruction BI = New; }
void llvm::ReplaceInstWithInst(BasicBlock::InstListType &BIL, BasicBlock::iterator &BI, Instruction *I) { assert(I->getParent() == nullptr && "ReplaceInstWithInst: Instruction already inserted into basic block!"); // Copy debug location to newly added instruction, if it wasn't already set // by the caller. if (!I->getDebugLoc()) I->setDebugLoc(BI->getDebugLoc()); // Insert the new instruction into the basic block... BasicBlock::iterator New = BIL.insert(BI, I); // Replace all uses of the old instruction, and delete it. ReplaceInstWithValue(BIL, BI, I); // Move BI back to point to the newly inserted instruction BI = New; }