use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class LatestValue method canPropagate.
public boolean canPropagate(AbstractCopyStmt def, Stmt use, Expr tail, boolean debug) {
Local local = def.getVariable().getLocal();
Set<Stmt> path = findReachable(def, use);
path.remove(def);
path.add(use);
if (debug) {
System.out.println();
System.out.println("from " + def);
System.out.println("to " + use);
System.out.println(this);
System.out.println("constraints: " + constraints.size());
for (Constraint c : constraints) {
System.out.println(" " + c);
}
System.out.println(" path:");
for (Stmt s : path) {
System.out.println(" " + s);
}
}
for (Stmt stmt : path) {
if (stmt != use) {
for (CodeUnit s : stmt.enumerateWithSelf()) {
for (Constraint c : constraints) {
if (c.fails(s)) {
if (debug) {
System.out.println(" Fail: " + c);
System.out.println(" stmt: " + stmt);
System.out.println(" c: " + s);
}
return false;
}
}
}
} else {
if (constraints.size() > 0) {
for (CodeUnit s : stmt.enumerateExecutionOrder()) {
if (s == tail && (s.getOpcode() == Opcode.LOCAL_LOAD && ((VarExpr) s).getLocal() == local)) {
break;
} else {
for (Constraint c : constraints) {
if (c.fails(s)) {
if (debug) {
System.out.println(" Fail: " + c);
System.out.println(" stmt: " + stmt);
System.out.println(" c: " + s);
}
return false;
}
}
}
}
}
}
}
return true;
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class GenerationPass method _var_expr.
protected VarExpr _var_expr(int index, Type type, boolean isStack) {
Local l = builder.graph.getLocals().get(index, isStack);
builder.locals.add(l);
return new VarExpr(l, type);
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class SSAGenPass method latest.
private VersionedLocal latest(int index, boolean isStack) {
LocalsPool handler = builder.graph.getLocals();
Local l = handler.get(index, isStack);
Stack<Integer> stack = stacks.get(l);
if (stack == null || stack.isEmpty()) {
System.err.println(builder.method.owner.name + "#" + builder.method.name);
System.err.println(builder.graph);
System.err.println(stacks);
throw new NullPointerException(l.toString());
}
return handler.get(index, stack.peek(), /*subscript*/
isStack);
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class DeadCodeEliminationPass method process.
public void process(ControlFlowGraph cfg) {
LocalsPool lp = cfg.getLocals();
boolean c;
do {
c = false;
SimpleDfs<BasicBlock> dfs = new SimpleDfs<>(cfg, cfg.getEntries().iterator().next(), SimpleDfs.PRE);
List<BasicBlock> pre = dfs.getPreOrder();
for (BasicBlock b : new HashSet<>(cfg.vertices())) {
if (!pre.contains(b)) {
// System.out.println("proc1: " + b);
for (FlowEdge<BasicBlock> fe : new HashSet<>(cfg.getEdges(b))) {
cfg.exciseEdge(fe);
}
// System.out.println("removed: ");
for (Stmt stmt : b) {
// System.out.println(" " + (b.indexOf(stmt)) + ". " + stmt);
if (stmt instanceof AbstractCopyStmt) {
AbstractCopyStmt copy = (AbstractCopyStmt) stmt;
lp.defs.remove(copy.getVariable().getLocal());
// System.out.println(" kill1 " + copy.getVariable().getLocal());
}
for (Expr e : stmt.enumerateOnlyChildren()) {
if (e.getOpcode() == Opcode.LOCAL_LOAD) {
VarExpr v = (VarExpr) e;
lp.uses.get(v.getLocal()).remove(v);
// System.out.println(" kill2 " + v.getLocal());
}
}
}
cfg.removeVertex(b);
deadBlocks++;
c = true;
} else {
// System.out.println("proc2: " + b);
UnconditionalJumpEdge<BasicBlock> uncond = null;
for (FlowEdge<BasicBlock> fe : cfg.getEdges(b)) {
if (fe.getType() == FlowEdges.UNCOND) {
uncond = (UnconditionalJumpEdge<BasicBlock>) fe;
}
}
if (uncond != null) {
BasicBlock dst = uncond.dst();
List<BasicBlock> verts = new ArrayList<>(cfg.vertices());
if (verts.indexOf(b) + 1 == verts.indexOf(dst)) {
ImmediateEdge<BasicBlock> im = new ImmediateEdge<>(b, dst);
cfg.exciseEdge(uncond);
cfg.addEdge(b, im);
Stmt stmt = b.remove(b.size() - 1);
if (stmt.getOpcode() != Opcode.UNCOND_JUMP) {
throw new IllegalStateException(b + " : " + stmt);
}
immediateJumps++;
c = true;
}
}
// if(cfg.getMethod().toString().equals("cf.k(IIIIII)V")) {}
Iterator<Stmt> it = b.iterator();
while (it.hasNext()) {
Stmt stmt = it.next();
if (stmt.getOpcode() == Opcode.LOCAL_STORE) {
AbstractCopyStmt copy = (AbstractCopyStmt) stmt;
if (copy.isSynthetic()) {
continue;
}
Local l = copy.getVariable().getLocal();
LocalsPool pool = cfg.getLocals();
// System.out.println("copy: "+ copy);
if (!ConstraintUtil.isUncopyable(copy.getExpression()) && pool.uses.get(l).size() == 0) {
for (Expr e : copy.getExpression().enumerateWithSelf()) {
if (e.getOpcode() == Opcode.LOCAL_LOAD) {
VarExpr v = (VarExpr) e;
Local l2 = v.getLocal();
pool.uses.remove(l2);
}
}
pool.uses.remove(l);
pool.defs.remove(l);
it.remove();
deadLocals++;
c = true;
}
} else if (stmt.getOpcode() == Opcode.NOP) {
it.remove();
c = true;
}
}
}
}
// for now
} while (c);
}
use of org.mapleir.ir.locals.Local in project maple-ir by LLVM-but-worse.
the class LiftConstructorCallsPass method tryLift.
private boolean tryLift(MethodNode m, ControlFlowGraph cfg) {
Local lvar0_0 = cfg.getLocals().get(0, 0, false);
/* only contains synthetic copies */
BasicBlock entry = cfg.getEntries().iterator().next();
for (BasicBlock b : cfg.vertices()) {
for (Stmt stmt : b) {
for (Expr e : stmt.enumerateOnlyChildren()) {
if (e.getOpcode() == INVOKE) {
InvocationExpr invoke = (InvocationExpr) e;
if (invoke.getOwner().equals(m.owner.superName) && invoke.getName().equals("<init>")) {
Expr p1 = invoke.getPhysicalReceiver();
if (p1.getOpcode() == LOCAL_LOAD && ((VarExpr) p1).getLocal() == lvar0_0) {
Set<FlowEdge<BasicBlock>> predsEdges = cfg.getReverseEdges(b);
FlowEdge<BasicBlock> incoming;
if (predsEdges.size() == 1 && ((incoming = predsEdges.iterator().next()).getType() == FlowEdges.IMMEDIATE) && incoming.src() == entry) {
// BasicBlock liftBlock = new BasicBlock(cfg, cfg.vertices().size() + 1, new LabelNode());
/* split the block before the invocation and
* insert a new block. */
split(cfg, b, stmt);
return true;
} else {
System.err.printf(" warn(nolift) for %s in %n%s%n", invoke, ControlFlowGraph.printBlock(b));
System.err.printf(" preds: %s%n", predsEdges);
}
} else {
throw new IllegalStateException(String.format("broken super call: %s", invoke));
}
}
}
}
}
}
return false;
}
Aggregations