[Patch] Use address-taken to disambiguate global var and indirect accesses
Evan Cheng
evan.cheng at apple.com
Mon Oct 21 14:29:36 PDT 2013
Hi Shuxin,
This needs some comments:
+ if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(O1))
+ if (GV->notAddressTaken())
+ return NoAlias;
+
+ if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(O2))
+ if (GV->notAddressTaken())
+ return NoAlias;
Evan
On Oct 21, 2013, at 11:27 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Ping.
>
> (add testing cases. Forget attaching testing case in my previous mail).
> Thanks
> Shuxin
>
>
> -------- Original Message --------
> Subject: [Patch] Use address-taken to disambiguate global var and indirect accesses
> Date: Tue, 15 Oct 2013 14:39:51 -0700
> From: Shuxin Yang <shuxin.llvm at gmail.com>
> To: Commit Messages and Patches for LLVM <llvm-commits at cs.uiuc.edu>
>
> Hi,
>
> The attached patch is to take advantage of address-taken to
> disambiguate global
> variable and indirect memory accesses.
>
> The motivation
> ===========
> I was asked to investigate the problem where the static variable
> is not hoisted as
> loop invariant:
>
> ---------------
> static int xyz;
> void foo(int *p) {
> for (int i = 0; i < xyz; i++)
> *p++ = ....
> }
> -----------------
>
> The compiler dose have a concept call "addr-capture". However, I
> don't think it can
> be used for disambiguate global variable and indirect access. The
> reasons is that
> a variable dose not have its address *CAPTURED*, dose not necessarily
> mean this variable
> cannot be indirectly accessed.
>
> So, I rely on "address taken"
>
> How it works
> ========
> 1. In globalopt, when a global var is identified as
> not-addr-taken, cache the result
> to GlobalVariable::notAddrTaken.
>
> 2. In alias-analyzer, supposed the mem-op involved are m1 and m2.
> Let o1 and o2
> be the "object" (obtained via get_underlying_object() of m1
> and m2 respectively.
>
> if O1 != O2 && one of the them are global-variable without
> address taken,
> then m1 and m2 are disjointed access.
>
> Misc:
> =========
> Note that I *cache* the result of not-addr-taken. Unlike
> function, it is far more expensive
> to figure out if a globalvar has its address taken or not. So, it is not
> appropriate to analyze
> the address-taken on the fly.
>
> On the other hand, I personally think not-addr-taken flag is
> almost maintenance free.
> (FIXME) Only few optimizer could make a not-addr-taken variable become
> addr-taken (say, outlining),
> and I don't think currently we have such passes (FIXME again!). In case
> such rare cases take place,
> it is up to the pass the to reset the not-addr-taken flags.
>
> Of course, a variable previously considered addr-taken may later on
> proved to be not-addr-taken.
> In that case, compiler dose not have to update it -- it is
> conservatively correct.
>
> Performance impact
> =============
> Measured on an oldish Mac Tower with 2x 2.26Ghz Quad-Core Xeon. Both
> base-line and
> the change are measured for couple of times. I did take a look of why
> Olden/power is sped up --
> the loads of static variable "P" and "Q" are promoted in many places. I
> have not yet got chance
> to investigate why the speedup to pairlocalalign with O3 disappear in
> O3+LTO.
>
>
> o. test-suite w/ O3:
> -------------------
> Benchmarks/Olden/power/power 1.6129 1.354
> -16.0518321036642
> Benchmarks/mafft/pairlocalalign 31.4211 26.5794
> -15.4090722476298
> Benchmarks/Ptrdist/yacr2/yacr2 0.881 0.804
> -8.74006810442678
>
> o. test-suite w/ O3 + LTO
> -------------------------
> Benchmarks/Olden/power/power 1.6143 1.3419 -16.8741869540978
> Applications/spiff/spiff 2.9203 2.849 -2.44152997979659
>
> o. spec2kint w/ O3+LTO
> ----------------------
> bzip2 75.02 73.92 -1.4
>
>
> Thanks
> Shuxin
>
>
>
>
>
> <addrtaken.patch><addrtaken.test.patch>_______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20131021/530a1122/attachment.html>
More information about the llvm-commits
mailing list