void Analyse() { var cfg = verifier.Program.ProcessLoops(impl); var modSet = LoopInvariantGenerator.GetModifiedVariables(verifier.RootRegion(impl)); var multiDefMap = new VarDefMap(); FindAssignments(verifier.RootRegion(impl), multiDefMap); foreach (var e in multiDefMap.Where(i => i.Value.Count == 2)) { AnalyseAssignment(e.Key, e.Value, cfg, modSet); } }
void AddAssignment(IRegion region, VarDefMap multiDefMap, SimpleAssignLhs lhs, Expr rhs) { if (lhs == null) { return; } var variable = lhs.DeepAssignedVariable; if (!multiDefMap.ContainsKey(variable)) { multiDefMap[variable] = new List <Tuple <IRegion, Expr> >(); } multiDefMap[variable].Add(new Tuple <IRegion, Expr>(region, rhs)); }
void FindAssignments(IRegion region, VarDefMap multiDefMap) { foreach (var c in region.CmdsChildRegions()) { var aCmd = c as AssignCmd; if (aCmd != null) { foreach (var a in aCmd.Lhss.Zip(aCmd.Rhss)) { AddAssignment(region, multiDefMap, a.Item1 as SimpleAssignLhs, a.Item2); } } var child = c as IRegion; if (child != null) { FindAssignments(child, multiDefMap); } } }