/**
*
*/
package xsched.analysis.wala.schedule_extraction;
import java.util.Set;
import xsched.analysis.wala.WalaConstants;
import com.ibm.wala.ssa.SSAInvokeInstruction;
import com.ibm.wala.ssa.SSANewInstruction;
import com.ibm.wala.ssa.SSAPhiInstruction;
import com.ibm.wala.ssa.SSAInstruction.Visitor;
import com.ibm.wala.util.debug.Assertions;
class NormalNodeVisitor extends Visitor {
protected final NormalNodeFlowData data;
public NormalNodeVisitor(NormalNodeFlowData data) {
assert data != null;
assert ! data.isInitial();
this.data = data;
}
@Override
public void visitInvoke(SSAInvokeInstruction instruction) {
if(WalaConstants.isHappensBeforeCall(instruction)) {
int lhs = instruction.getReceiver();
int rhs = instruction.getUse(1);
for(LoopContext loopContext : data.loopContexts()) {
//resolve the ssa variables
Set<TaskVariable> lhsVariables = data.taskVariableForSSAVariable(loopContext, lhs);
Set<TaskVariable> rhsVariables = data.taskVariableForSSAVariable(loopContext, rhs);
for(TaskVariable lhsVariable : lhsVariables) {
for(TaskVariable rhsVariable : rhsVariables) {
data.addHappensBeforeEdge(lhsVariable, rhsVariable);
}
}
}
}
}
@Override
public void visitNew(SSANewInstruction instruction) {
if(WalaConstants.isNewTaskSite(instruction)) {
for(LoopContext loopContext : data.loopContexts()) {
TaskVariable task = new TaskVariable(loopContext, instruction.getDef());
data.addTaskScheduleSite(task);
data.killHappensBeforeRelationshipsContaining(task);
}
}
}
@Override
public void visitPhi(SSAPhiInstruction instruction) {
Assertions.UNREACHABLE();
}
}