private void Analyse(Implementation impl, IRegion region) { foreach (Cmd c in region.Cmds()) { if (c is AssignCmd) { AssignCmd assign = c as AssignCmd; for (int i = 0; i != assign.Lhss.Count; i++) { if (assign.Lhss[i] is SimpleAssignLhs) { Variable lhs = (assign.Lhss[i] as SimpleAssignLhs).AssignedVariable.Decl; if (VariableHasPowerOfTwoType(lhs) && mayBePowerOfTwoInfo[impl.Name].ContainsKey(lhs.Name)) { Variable rhs = GetPowerOfTwoRhsVariable(assign.Rhss[i]); if (rhs != null) { mayBePowerOfTwoInfo[impl.Name][lhs.Name] = true; mayBePowerOfTwoInfo[impl.Name][rhs.Name] = true; } } } } } } }
internal static bool AccessesGlobalArrayOrUnsafeBarrier(IRegion region, GPUVerifier verifier) { // Heuristic to establish whether to speculate loop invariants for a specific loop // based on the commands that occur int the loop. foreach (Cmd c in region.Cmds()) { if (AccessesGlobalArrayOrUnsafeBarrier(c, verifier)) { return(true); } } return(false); }
void AnalyseRootRegion(IRegion rootRegion) { // We do not track the blocks, as the substitution should still // be usable after transformation of the CFG. foreach (var cmd in CollectCmds(rootRegion.Cmds())) { if (rootSubstitution.ContainsKey(cmd.Item1.Name)) { rootSubstitution[cmd.Item1.Name] = null; } else { rootSubstitution[cmd.Item1.Name] = cmd.Item2; } } }
internal static HashSet <Variable> GetModifiedVariables(IRegion region) { HashSet <Variable> result = new HashSet <Variable>(); foreach (Cmd c in region.Cmds()) { List <Variable> vars = new List <Variable>(); c.AddAssignedVariables(vars); foreach (Variable v in vars) { Debug.Assert(v != null); result.Add(v); } } return(result); }
private void Analyse(Implementation impl, IRegion region) { foreach (Cmd c in region.Cmds()) { if (c is AssignCmd) { AssignCmd assign = c as AssignCmd; for (int i = 0; i != assign.Lhss.Count; i++) { if (assign.Lhss[i] is SimpleAssignLhs) { Variable v = (assign.Lhss[i] as SimpleAssignLhs).AssignedVariable.Decl; if (mayBePowerOfTwoInfo[impl.Name].ContainsKey(v.Name)) { Expr expr = assign.Rhss[i]; if (IsTempVariable(expr)) { expr = verifier.VarDefAnalysesRegion[impl].DefOfVariableName((expr as IdentifierExpr).Name); } switch (IsPowerOfTwoOperation(v, expr)) { case Kind.No: break; case Kind.Inc: mayBePowerOfTwoInfo[impl.Name][v.Name] = Kind.Inc; break; case Kind.Dec: mayBePowerOfTwoInfo[impl.Name][v.Name] = Kind.Dec; break; default: Debug.Assert(false); break; } } } } } } }
private static void GetReadAndWrittenVariables(IRegion region, out IEnumerable <Variable> ReadVariables, out IEnumerable <Variable> WrittenVariables) { var readVisitor = new VariablesOccurringInExpressionVisitor(); var writeVisitor = new VariablesOccurringInExpressionVisitor(); foreach (AssignCmd assignment in region.Cmds().OfType <AssignCmd>()) { var mapLhss = assignment.Lhss.OfType <MapAssignLhs>(); foreach (var LhsRhs in mapLhss.Zip(assignment.Rhss)) { writeVisitor.Visit(LhsRhs.Item1); readVisitor.Visit(LhsRhs.Item2); } var simpleLhss = assignment.Lhss.OfType <SimpleAssignLhs>(); foreach (var LhsRhs in simpleLhss.Zip(assignment.Rhss)) { readVisitor.Visit(LhsRhs.Item2); } } ReadVariables = readVisitor.GetVariables(); WrittenVariables = writeVisitor.GetVariables(); }