[LLVMdev] alias set collapse and LICM
Hal Finkel
hfinkel at anl.gov
Mon Apr 27 15:49:23 PDT 2015
[+Danny]
----- Original Message -----
> From: "Sanjoy Das" <sanjoy at playingwithpointers.com>
> To: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu>
> Cc: "Philip Reames" <listmail at philipreames.com>, "Hal Finkel" <hfinkel at anl.gov>, "Chandler Carruth"
> <chandlerc at google.com>
> Sent: Monday, April 27, 2015 4:58:09 PM
> Subject: alias set collapse and LICM
>
> I'm current facing an issue related to AliasSetTracker/LICM: the
> transitive closure of the alias sets is materially more conservative
> than individual aliasing queries and this conservatism leads to
> generally worse optimization in LICM.
>
> For instance, consider this module:
>
> declare i32 @only_reads() readonly
> declare void @escape(i32*, i32*, i32*)
>
> define void @f(i32 %count) {
> entry:
> %a = alloca i32
> %b = alloca i32
> %c = alloca i32
> call void @escape(i32* %a, i32* %b, i32* %c)
> %enter = icmp sle i32 0, %count
> br i1 %enter, label %loop, label %exit
>
> loop:
> %idx = phi i32 [ 0, %entry ], [ %idx.inc, %loop ]
> %idx.inc = add i32 %idx, 1
> %take.be = icmp slt i32 %idx, %count
>
> %a.load = load i32, i32* %a
> store i32 %a.load, i32* %b
>
> %v = call i32 @only_reads()
> store i32 %v, i32* %c
>
> br i1 %take.be, label %loop, label %exit
>
> exit:
> ret void
> }
>
> BasicAA knows that %a, %b and %c are all pairwise NoAlias, and given
> that, LICM should be able to hoist `%a.load` out of the loop. That
> does not happen because the read only call to `@only_reads` collapses
> the alias sets for %a, %b and %c into one and so as far as LICM is
> concerned, they all alias each other. The store to `%b` now
> "clobbers" `%a.load`.
Each alias set currently keeps track of its AccessType (Ref/Mod/ModRef). Maybe we should not collapse Ref access sets with Mod ones?
-Hal
>
> One potential fix is to do N^2 alias queries (every mem operation in
> the loop with every other mem operation) before hoisting a load, but
> I
> suspect AliasSetTracker exists mainly to make LICM faster than N^2,
> so
> I'm ruling this solution out.
>
> The solution I like: have LICM create two AliasSetTracker
> objects. The first one tracks all memory operations, as the alias
> set
> tracker object does now. The second one only tracks mods. When
> hoisting a load we check if any alias set in the mod tracker aliases
> the load location -- if not, the load is okay to hoist to the
> preheader from the data dependence point of view. In the worst case,
> this is 2x more (than now) work for building the alias sets and no
> more
> extra work when checking if we can hoist a load.
>
> Before I dive into implementing this, I have a few questions:
>
> * is this even the right problem to solve? Or should I look at
> other
> passes for this optimization?
>
> * do you think this will be too expensive? If so, does it make
> sense
> to do this only on -O3?`
>
> -- Sanjoy
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list