[polly] r248861 - Identify and hoist definitively invariant loads
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 01:09:40 PDT 2015
[Resend, the previous message was blocked]
On 10/01/2015 03:35 PM, Johannes Doerfert wrote:
> On 10/01, Tobias Grosser wrote:
>> On 09/30/2015 10:51 PM, Johannes Doerfert wrote:
>>> On 09/30, Tobias Grosser wrote:
>>>> On 09/30/2015 01:47 AM, Johannes Doerfert via llvm-commits wrote:
[...]
>>> I am not 100% following but let me state 3 things:
>>> 1) I am pretty sure that removing the accesses from the statements is
>>> what we want and should do. Keeping them around has bad
>>> consequences in many later passes, mainly artifacts in the AST
>>> generation and additional "filter" code in the code generation.
>>
>> Could you give an example. I currently do not see how any memory references
>> would even influence the generated AST.
> A memory reference doesn't explicitly but a statement that would be
> empty without it and is only present to hold that reference we will
> never execute at that position does.
Could we not just drop read-only statements similar to how we today drop
read-write-none statements?
>>> 2) The global map was mainly used during OpenMP code generation for
>>> values that were "generated somewhere before" the current block and
>>> that is what I am using it for. The actual documentation in the
>>> block generator states:
>>>
>>> @param GlobalMap A mapping from llvm::Values used in the original scop
>>> region to a new set of llvm::Values. Each reference to
>>> an original value appearing in this mapping is replaced
>>> with the new value it is mapped to.c
>>>
>>> I think preloaded invariant accesses fit this description
>>> perfectly.
>>
>> This map is specifically for code generation, but all analysis (e.g. the
>> set of accessed values that need to be passed to the subfunction) is done
>> on the polyhedral representation. The problem with GlobalMaps is that you
>> have no idea why a value is in GlobalMaps, so you either pass always the
>> entire content of GlobalMaps or you need to rescan each ScopStmt to determine
>> which elements of GlobalMaps are relevant for a loop-subtree and which
>> of them needs to be passed. This can currently avoided as we know that the
>> ScopStmts memory accesses are the only ones that need to be considered.
> We can hand down all preloaded values to the subfunction, that should
> solve the problem (see r249010).
It unbreaks the build, but is not really optimal. In a large kernel, we
now always pass down _all_ invariant loads, instead of just passing down
the ones that are actually used in the parallel loop body. For a large
scop (the largest scop I currently play with has 266 statements), this
is rather inefficient.
Best,
Tobias
More information about the llvm-commits
mailing list