1*3e457fe3SDavid van Moolenbroek #include <magic/support/VariableRefs.h> 2*3e457fe3SDavid van Moolenbroek 3*3e457fe3SDavid van Moolenbroek using namespace llvm; 4*3e457fe3SDavid van Moolenbroek 5*3e457fe3SDavid van Moolenbroek namespace llvm { 6*3e457fe3SDavid van Moolenbroek 7*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 8*3e457fe3SDavid van Moolenbroek // Constructors, destructor, and operators 9*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 10*3e457fe3SDavid van Moolenbroek VariableRefs()11*3e457fe3SDavid van MoolenbroekVariableRefs::VariableRefs() { 12*3e457fe3SDavid van Moolenbroek clear(); 13*3e457fe3SDavid van Moolenbroek } 14*3e457fe3SDavid van Moolenbroek 15*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 16*3e457fe3SDavid van Moolenbroek // Getters 17*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 18*3e457fe3SDavid van Moolenbroek isUnnecessaryInstruction(Instruction * inst) const19*3e457fe3SDavid van Moolenbroekbool VariableRefs::isUnnecessaryInstruction(Instruction* inst) const { 20*3e457fe3SDavid van Moolenbroek //have already instruction in the entry block, skip 21*3e457fe3SDavid van Moolenbroek if(instructionInEntryBlock) { 22*3e457fe3SDavid van Moolenbroek return true; 23*3e457fe3SDavid van Moolenbroek } 24*3e457fe3SDavid van Moolenbroek //have already instruction in the same block, skip 25*3e457fe3SDavid van Moolenbroek if(instruction && inst->getParent() == instruction->getParent()) { 26*3e457fe3SDavid van Moolenbroek return true; 27*3e457fe3SDavid van Moolenbroek } 28*3e457fe3SDavid van Moolenbroek 29*3e457fe3SDavid van Moolenbroek return false; 30*3e457fe3SDavid van Moolenbroek } 31*3e457fe3SDavid van Moolenbroek getInstruction() const32*3e457fe3SDavid van MoolenbroekInstruction* VariableRefs::getInstruction() const { 33*3e457fe3SDavid van Moolenbroek return instruction; 34*3e457fe3SDavid van Moolenbroek } 35*3e457fe3SDavid van Moolenbroek isInstructionInEntryBlock() const36*3e457fe3SDavid van Moolenbroekbool VariableRefs::isInstructionInEntryBlock() const { 37*3e457fe3SDavid van Moolenbroek return instructionInEntryBlock; 38*3e457fe3SDavid van Moolenbroek } 39*3e457fe3SDavid van Moolenbroek 40*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 41*3e457fe3SDavid van Moolenbroek // Other public methods 42*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 43*3e457fe3SDavid van Moolenbroek addInstruction(Instruction * inst)44*3e457fe3SDavid van Moolenbroekvoid VariableRefs::addInstruction(Instruction* inst) { 45*3e457fe3SDavid van Moolenbroek //no instruction yet, update instruction 46*3e457fe3SDavid van Moolenbroek if(!instruction) { 47*3e457fe3SDavid van Moolenbroek instruction = inst; 48*3e457fe3SDavid van Moolenbroek return; 49*3e457fe3SDavid van Moolenbroek } 50*3e457fe3SDavid van Moolenbroek //have already instruction in another block, give up and resort to a single instruction in the entry block 51*3e457fe3SDavid van Moolenbroek setFunctionEntryInstruction(inst->getParent()->getParent()); 52*3e457fe3SDavid van Moolenbroek } 53*3e457fe3SDavid van Moolenbroek clear()54*3e457fe3SDavid van Moolenbroekvoid VariableRefs::clear() { 55*3e457fe3SDavid van Moolenbroek instruction = NULL; 56*3e457fe3SDavid van Moolenbroek instructionInEntryBlock = false; 57*3e457fe3SDavid van Moolenbroek } 58*3e457fe3SDavid van Moolenbroek 59*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 60*3e457fe3SDavid van Moolenbroek // Private methods 61*3e457fe3SDavid van Moolenbroek //===----------------------------------------------------------------------===// 62*3e457fe3SDavid van Moolenbroek setFunctionEntryInstruction(Function * function)63*3e457fe3SDavid van Moolenbroekvoid VariableRefs::setFunctionEntryInstruction(Function* function) { 64*3e457fe3SDavid van Moolenbroek this->instruction = function->front().getFirstNonPHI(); 65*3e457fe3SDavid van Moolenbroek this->instructionInEntryBlock = true; 66*3e457fe3SDavid van Moolenbroek } 67*3e457fe3SDavid van Moolenbroek 68*3e457fe3SDavid van Moolenbroek } 69