/// <summary> /// Checks that there are no conflicting read and write accesses to arrays. /// </summary> /// <param name="loopIndex">The loop index of the loop that is subject for parallelization.</param> /// <param name="controlFlowGraph">The control flow graph of the body of the loop.</param> /// <param name="aliasAnalysis">A prelimary applied alias analysis already fed with possible aliases outside of the loop.</param> /// <param name="callGraph">The graph identifying the calls of methods for interprocedural analysis.</param> /// <param name="procedures">The control flow graphs of the invoked methods.</param> /// <returns><code>True</code> if there are no conflicting accesses to arrays.</returns> public static bool HasConflictingAccesses(string loopIndex, ControlFlowGraph controlFlowGraph, AliasAnalysis aliasAnalysis, CallGraph callGraph, IEnumerable <ControlFlowGraph> procedures) { var loopDependenceAnalysis = LoopDependenceAnalysis.Analyze(controlFlowGraph, loopIndex, callGraph, procedures); var arrayAccesses = ArrayAccessCollector.Collect(new[] { controlFlowGraph }.Concat(procedures).SelectMany(graph => graph.Nodes)); var verifier = new ArrayAccessVerifier(loopDependenceAnalysis, aliasAnalysis, arrayAccesses); return(verifier._ContainsLoopCarriedDependencies()); }
/// <summary> /// Checks that there are no conflicting read and write accesses to arrays. /// </summary> /// <param name="loopIndex">The loop index of the loop that is subject for parallelization.</param> /// <param name="controlFlowGraph">The control flow graph of the body of the loop.</param> /// <param name="aliasAnalysis">A prelimary applied alias analysis already fed with possible aliases outside of the loop.</param> /// <returns><code>True</code> if there are no conflicting accesses to arrays.</returns> public static bool HasConflictingAccesses(string loopIndex, ControlFlowGraph controlFlowGraph, AliasAnalysis aliasAnalysis) { var loopDependenceAnalysis = LoopDependenceAnalysis.Analyze(controlFlowGraph, loopIndex); var arrayAccesses = ArrayAccessCollector.Collect(controlFlowGraph); var verifier = new ArrayAccessVerifier(loopDependenceAnalysis, aliasAnalysis, arrayAccesses); return(verifier._ContainsLoopCarriedDependencies()); }