package net.sf.orcc.backends.llvm.transform; import java.util.HashMap; import java.util.Map; import net.sf.orcc.ir.BlockBasic; import net.sf.orcc.ir.BlockIf; import net.sf.orcc.ir.BlockWhile; import net.sf.orcc.ir.InstLoad; import net.sf.orcc.ir.InstStore; import net.sf.orcc.ir.Instruction; import net.sf.orcc.ir.Procedure; import net.sf.orcc.ir.Var; import net.sf.orcc.ir.util.AbstractIrVisitor; import net.sf.orcc.util.Void; public class TemplateInfoComputing extends AbstractIrVisitor<Void> { private int blockIndex = 0; private Map<Instruction, Integer> accessMap; private Map<Var, Integer> tmpAccessMap; public TemplateInfoComputing() { tmpAccessMap = new HashMap<Var, Integer>(); } @Override public Void caseBlockBasic(BlockBasic blockBasic) { blockBasic.getCfgNode().setNumber(blockIndex); blockIndex++; return super.caseBlockBasic(blockBasic); } @Override public Void caseBlockIf(BlockIf blockIf) { blockIf.getCfgNode().setNumber(blockIndex); blockIndex++; return super.caseBlockIf(blockIf); } @Override public Void caseInstLoad(InstLoad load) { Var var = load.getSource().getVariable(); int accessNb; if (tmpAccessMap.containsKey(var)) { accessNb = tmpAccessMap.get(var); tmpAccessMap.remove(var); } else { accessNb = 0; } accessMap.put(load, accessNb); accessNb++; tmpAccessMap.put(var, accessNb); return null; } @Override public Void caseInstStore(InstStore store) { Var var = store.getTarget().getVariable(); int accessNb; if (tmpAccessMap.containsKey(var)) { accessNb = tmpAccessMap.get(var); tmpAccessMap.remove(var); } else { accessNb = 0; } accessMap.put(store, accessNb); accessNb++; tmpAccessMap.put(var, accessNb); return null; } @Override public Void caseBlockWhile(BlockWhile blockWhile) { blockWhile.getCfgNode().setNumber(blockIndex); blockIndex++; return super.caseBlockWhile(blockWhile); } @Override public Void caseProcedure(Procedure procedure) { accessMap = new HashMap<Instruction, Integer>(); tmpAccessMap.clear(); super.caseProcedure(procedure); procedure.setAttribute("accessMap", accessMap); return null; } }