public void Transform() { SetInitialValues(); var wl = new WorkList <SsaIdentifier>(); wl.AddRange(ssa.Identifiers); while (wl.TryGetWorkItem(out var sid) && !listener.IsCanceled()) { var oldValue = ctx.GetValue(sid.Identifier); if (oldValue is InvalidConstant) { continue; } var newValue = Evaluate(sid); if (!cmp.Equals(oldValue, newValue)) { ctx.SetValue(sid.Identifier, newValue); foreach (var use in sid.Uses) { var uc = new InstructionUseCollector(); var uses = uc.CollectUses(use); wl.AddRange(uses.Keys.Select(id => ssa.Identifiers[id])); } } } }
public List <Statement> GetDefiningStatementClosure(Identifier id) { var visited = new HashSet <SsaIdentifier>(); var wl = new WorkList <SsaIdentifier>(); var stms = new List <Statement>(); wl.Add(ssaIds[id]); while (wl.GetWorkItem(out var sid)) { if (visited.Contains(sid)) { continue; } visited.Add(sid); if (sid.DefStatement == null) { continue; } switch (sid.DefStatement.Instruction) { case AliasAssignment alias: if (alias.Src is Identifier idAlias) { wl.Add(ssaIds[idAlias]); } else { stms.Add(sid.DefStatement); } break; case Assignment ass: if (ass.Src is Identifier idSrc) { wl.Add(ssaIds[idSrc]); } else { stms.Add(sid.DefStatement); } break; case PhiAssignment phi: wl.AddRange(phi.Src.Arguments.Select(a => ssaIds[(Identifier)a.Value])); break; default: stms.Add(sid.DefStatement); break; } } return(stms); }
public void Transform() { var wl = new WorkList <Statement>(ssa.Procedure.Statements); while (wl.GetWorkItem(out var stm)) { var prjf = new ProjectionFilter(ssa, stm, sac); var instr = stm.Instruction.Accept(prjf); stm.Instruction = instr; wl.AddRange(prjf.NewStatements); } }
/// <summary> /// For each procedure/SSA state, compute the variables that are live-out /// (and which bit ranges are live-out) and store them in the procedure flow. /// </summary> private void CollectLiveOutStorages() { var wl = new WorkList <SsaState>(ssaStates); while (wl.GetWorkItem(out SsaState ssa)) { var liveOut = CollectLiveOutStorages(ssa.Procedure); var flow = dataFlow.ProcedureFlows[ssa.Procedure]; var changed = MergeLiveOut(flow, liveOut); if (changed) { wl.AddRange(program.CallGraph.Callees(ssa.Procedure).Select(p => procToSsa[p])); } } }