public void Visit(Assignment instruction)
        {
            if (instruction.Left is VariableExpression variable)
            {
                WrittenVariables.Add(variable.Name);
            }
            else if (instruction.Left is ArrayExpression array)
            {
                ReadVariables.Add(array.Name);
                WrittenArrays.Add(array);
                _VisitItems(array.Accessors);
            }

            instruction.Right.Accept(this);
        }
Beispiel #2
0
        private static void GenerateCandidateForEnablednessWhenAccessingSharedArrays(GPUVerifier verifier, Implementation impl, IRegion region)
        {
            Block header = region.Header();

            if (verifier.uniformityAnalyser.IsUniform(impl.Name, header))
            {
                return;
            }

            var CFG = Program.GraphFromImpl(impl);
            Dictionary <Block, HashSet <Block> > ControlDependence = CFG.ControlDependence();

            ControlDependence.TransitiveClosure();
            CFG.ComputeLoops();

            List <Expr> Guards = new List <Expr>();

            foreach (var b in ControlDependence.Keys.Where(Item => ControlDependence[Item].Contains(region.Header())))
            {
                foreach (var succ in CFG.Successors(b).Where(Item => CFG.DominatorMap.DominatedBy(header, Item)))
                {
                    var Guard = MaybeExtractGuard(verifier, impl, succ);
                    if (Guard != null)
                    {
                        Guards.Add(Guard);
                        break;
                    }
                }
            }

            if (Guards.Count == 0)
            {
                return;
            }

            IEnumerable <Variable> ReadVariables;
            IEnumerable <Variable> WrittenVariables;

            GetReadAndWrittenVariables(region, out ReadVariables, out WrittenVariables);

            foreach (var v in ReadVariables.Where(Item => verifier.KernelArrayInfo.GetGlobalAndGroupSharedArrays(false).Contains(Item) &&
                                                  !verifier.KernelArrayInfo.GetReadOnlyGlobalAndGroupSharedArrays(true).Contains(Item)))
            {
                foreach (var g in Guards)
                {
                    verifier.AddCandidateInvariant(region,
                                                   Expr.Imp(Expr.Ident(verifier.FindOrCreateAccessHasOccurredVariable(v.Name, AccessType.READ)),
                                                            g), "accessOnlyIfEnabledInEnclosingScopes", "do_not_predicate");
                }
            }

            foreach (var v in WrittenVariables.Where(Item => verifier.KernelArrayInfo.GetGlobalAndGroupSharedArrays(false).Contains(Item)))
            {
                foreach (var g in Guards)
                {
                    verifier.AddCandidateInvariant(region,
                                                   Expr.Imp(Expr.Ident(verifier.FindOrCreateAccessHasOccurredVariable(v.Name, AccessType.WRITE)),
                                                            g), "accessOnlyIfEnabledInEnclosingScopes", "do_not_predicate");
                }
            }
        }
 public void Visit(ArrayExpression expression)
 {
     ReadVariables.Add(expression.Name);
     ReadArrays.Add(expression);
     _VisitItems(expression.Accessors);
 }
 public void Visit(VariableExpression expression)
 {
     ReadVariables.Add(expression.Name);
 }