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;
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #2
0
 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);
 }
Exemple #3
0
 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;
         }
     }
 }
Exemple #4
0
        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;
                                }
                            }
                        }
                    }
                }
            }
        }
Exemple #6
0
        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();
        }