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); }
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"); } } }