use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class BoissinotDestructor method computeValueInterference.
private void computeValueInterference() {
List<BasicBlock> topoorder = dom_dfs.getTopoOrder();
for (BasicBlock bl : topoorder) {
for (Stmt stmt : bl) {
int opcode = stmt.getOpcode();
if (opcode == Opcode.LOCAL_STORE) {
CopyVarStmt copy = (CopyVarStmt) stmt;
Expr e = copy.getExpression();
Local b = copy.getVariable().getLocal();
if (!copy.isSynthetic() && e.getOpcode() == Opcode.LOCAL_LOAD) {
LinkedHashSet<Local> vc = values.get(((VarExpr) e).getLocal());
vc.add(b);
values.put(b, vc);
} else {
values.getNonNull(b);
}
} else if (opcode == Opcode.PHI_STORE) {
CopyPhiStmt copy = (CopyPhiStmt) stmt;
values.getNonNull(copy.getVariable().getLocal());
} else if (opcode == ParallelCopyVarStmt.PARALLEL_STORE) {
ParallelCopyVarStmt copy = (ParallelCopyVarStmt) stmt;
for (CopyPair p : copy.pairs) {
LinkedHashSet<Local> valueClass = values.getNonNull(p.source);
valueClass.add(p.targ);
values.put(p.targ, valueClass);
}
}
}
}
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class BoissinotDestructor method interference.
private boolean interference(Local a, Local b, boolean sameConClass) {
equalAncOut.put(a, null);
if (sameConClass) {
b = equalAncOut.get(b);
}
Local tmp = b;
while (tmp != null && !intersect(a, tmp)) {
tmp = equalAncIn.get(tmp);
}
if (values.getNonNull(a) != values.getNonNull(b)) {
return tmp != null;
} else {
equalAncOut.put(a, tmp);
return false;
}
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class SSABlockLivenessAnalyser method precomputeBlock.
// compute def, use, and phi for given block
private void precomputeBlock(BasicBlock b) {
def.getNonNull(b);
use.getNonNull(b);
phiUse.getNonNull(b);
phiDef.getNonNull(b);
// we have to iterate in reverse order because a definition will kill a use in the current block
// this is so that uses do not escape a block if its def is in the same block. this is basically
// simulating a statement graph analysis
ListIterator<Stmt> it = b.listIterator(b.size());
while (it.hasPrevious()) {
Stmt stmt = it.previous();
int opcode = stmt.getOpcode();
if (opcode == Opcode.PHI_STORE) {
CopyPhiStmt copy = (CopyPhiStmt) stmt;
phiDef.get(b).add(copy.getVariable().getLocal());
PhiExpr phi = copy.getExpression();
for (Map.Entry<BasicBlock, Expr> e : phi.getArguments().entrySet()) {
BasicBlock exprSource = e.getKey();
Expr phiExpr = e.getValue();
GenericBitSet<Local> useSet = phiUse.get(b).getNonNull(exprSource);
if (phiExpr.getOpcode() == Opcode.LOCAL_LOAD) {
useSet.add(((VarExpr) phiExpr).getLocal());
} else
for (Expr child : phiExpr.enumerateOnlyChildren()) {
if (child.getOpcode() == Opcode.LOCAL_LOAD) {
useSet.add(((VarExpr) child).getLocal());
}
}
}
} else {
if (opcode == Opcode.LOCAL_STORE) {
CopyVarStmt copy = (CopyVarStmt) stmt;
Local l = copy.getVariable().getLocal();
def.get(b).add(l);
use.get(b).remove(l);
Expr e = copy.getExpression();
// adding it as live-in.
if (e.getOpcode() == Opcode.CATCH) {
if (hasNaturalPredecessors(cfg, b)) {
use.get(b).add(l);
}
}
}
for (Expr c : stmt.enumerateOnlyChildren()) {
if (c.getOpcode() == Opcode.LOCAL_LOAD) {
VarExpr v = (VarExpr) c;
use.get(b).add(v.getLocal());
}
}
}
}
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class SSABlockLivenessAnalyser method compute.
public void compute() {
// negative handling always goes after positive and any adds
while (!queue.isEmpty()) {
BasicBlock b = queue.remove();
// System.out.println("\n\nProcessing " + b.getId());
GenericBitSet<Local> oldIn = new GenericBitSet<>(in.get(b));
GenericBitSet<Local> curIn = new GenericBitSet<>(use.get(b));
GenericBitSet<Local> curOut = locals.createBitSet();
// out[n] = U(s in succ[n])(in[s])
for (FlowEdge<BasicBlock> succEdge : cfg.getEdges(b)) curOut.addAll(in.get(succEdge.dst()));
// negative phi handling for defs
for (FlowEdge<BasicBlock> succEdge : cfg.getEdges(b)) curOut.removeAll(phiDef.get(succEdge.dst()));
// positive phi handling for uses, see ยง5.4.2 "Meaning of copy statements in Sreedhar's method"
for (FlowEdge<BasicBlock> succEdge : cfg.getEdges(b)) curOut.addAll(phiUse.get(succEdge.dst()).getNonNull(b));
// negative phi handling for uses
for (FlowEdge<BasicBlock> predEdge : cfg.getReverseEdges(b)) curIn.removeAll(phiUse.get(b).getNonNull(predEdge.src()).relativeComplement(use.get(b)));
// positive phi handling for defs
curIn.addAll(phiDef.get(b));
oldIn.addAll(phiDef.get(b));
// in[n] = use[n] U(out[n] - def[n])
curIn.addAll(curOut.relativeComplement(def.get(b)));
in.put(b, curIn);
out.put(b, curOut);
// queue preds if dataflow state changed
if (!oldIn.equals(curIn)) {
cfg.getReverseEdges(b).stream().map(e -> e.src()).forEach(this::enqueue);
// for (BasicBlock b2 : cfg.vertices())
// System.out.println(b2.getId() + " |||| IN: " + in.get(b2) + " ||||| OUT: " + out.get(b2));
}
}
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class SSADefUseMap method build.
protected void build(BasicBlock b, Stmt stmt, Set<Local> usedLocals) {
if (stmt instanceof AbstractCopyStmt) {
AbstractCopyStmt copy = (AbstractCopyStmt) stmt;
Local l = copy.getVariable().getLocal();
defs.put(l, b);
if (copy instanceof CopyPhiStmt) {
phiDefs.put(l, (CopyPhiStmt) copy);
PhiExpr phi = (PhiExpr) copy.getExpression();
for (Entry<BasicBlock, Expr> en : phi.getArguments().entrySet()) {
Local ul = ((VarExpr) en.getValue()).getLocal();
uses.getNonNull(ul).add(en.getKey());
phiUses.get(b).add(ul);
}
return;
}
}
for (Local usedLocal : usedLocals) uses.getNonNull(usedLocal).add(b);
}
Aggregations