xref: /minix3/minix/llvm/passes/magic/support/VariableRefs.cpp (revision 3e457fe321c6af238c180a2b4a0f010f8b4f8c31)
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 Moolenbroek VariableRefs::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 Moolenbroek bool 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 Moolenbroek Instruction* VariableRefs::getInstruction() const {
33*3e457fe3SDavid van Moolenbroek     return instruction;
34*3e457fe3SDavid van Moolenbroek }
35*3e457fe3SDavid van Moolenbroek 
isInstructionInEntryBlock() const36*3e457fe3SDavid van Moolenbroek bool 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 Moolenbroek void 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 Moolenbroek void 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 Moolenbroek void 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