[polly] r249607 - Allow invariant loads in the SCoP description
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 7 23:47:56 PDT 2015
On 10/07/2015 10:17 PM, Johannes Doerfert via llvm-commits wrote:
> Author: jdoerfert
> Date: Wed Oct 7 15:17:36 2015
> New Revision: 249607
>
> URL: http://llvm.org/viewvc/llvm-project?rev=249607&view=rev
> Log:
> Allow invariant loads in the SCoP description
>
> This patch allows invariant loads to be used in the SCoP description,
> e.g., as loop bounds, conditions or in memory access functions.
>
> First we collect "required invariant loads" during SCoP detection that
> would otherwise make an expression we care about non-affine. To this
> end a new level of abstraction was introduced before
> SCEVValidator::isAffineExpr() namely ScopDetection::isAffine() and
> ScopDetection::onlyValidRequiredInvariantLoads(). Here we can decide
> if we want a load inside the region to be optimistically assumed
> invariant or not. If we do, it will be marked as required and in the
> SCoP generation we bail if it is actually not invariant. If we don't
> it will be a non-affine expression as before. At the moment we
> optimistically assume all "hoistable" (namely non-loop-carried) loads
> to be invariant. This causes us to expand some SCoPs and dismiss them
> later but it also allows us to detect a lot we would dismiss directly
> if we would ask e.g., AliasAnalysis::canBasicBlockModify(). We also
> allow potential aliases between optimistically assumed invariant loads
> and other pointers as our runtime alias checks are sound in case the
> loads are actually invariant. Together with the invariant checks this
> combination allows to handle a lot more than LICM can.
>
> The code generation of the invariant loads had to be extended as we
> can now have dependences between parameters and invariant (hoisted)
> loads as well as the other way around, e.g.,
> test/Isl/CodeGen/invariant_load_parameters_cyclic_dependence.ll
> First, it is important to note that we cannot have real cycles but
> only dependences from a hoisted load to a parameter and from another
> parameter to that hoisted load (and so on). To handle such cases we
> materialize llvm::Values for parameters that are referred by a hoisted
> load on demand and then materialize the remaining parameters. Second,
> there are new kinds of dependences between hoisted loads caused by the
> constraints on their execution. If a hoisted load is conditionally
> executed it might depend on the value of another hoisted load. To deal
> with such situations we sort them already in the ScopInfo such that
> they can be generated in the order they are listed in the
> Scop::InvariantAccesses list (see compareInvariantAccesses). The
> dependences between hoisted loads caused by indirect accesses are
> handled the same way as before.
Thank you for this patch!
It caused one LNT compile time failure, though:
http://lab.llvm.org:8011/builders/perf-x86_64-penryn-O3-polly-fast/builds/12702
Best,
Tobias
More information about the llvm-commits
mailing list