[LLVMdev] Loop localize global variables (original) (raw)
Hal Finkel hfinkel at anl.gov
Tue Jul 21 19:12:51 PDT 2015
- Previous message: [LLVMdev] Loop localize global variables
- Next message: [LLVMdev] Loop localize global variables
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
----- Original Message -----
From: "Charlie Turner" <charlesturner7c5 at gmail.com> To: sundeepk at codeaurora.org Cc: "LLVM Developers Mailing List" <llvmdev at cs.uiuc.edu> Sent: Tuesday, July 21, 2015 9:22:04 AM Subject: Re: [LLVMdev] Loop localize global variables
Hi Sundeep, I am also interested in the load-store lifting transformation.
I am as well, LICM should certainly be taught to speculatively load/store to conditionally-accessed dereferenceable addresses when that is likely to be profitable.
For static globals as-in your example, the transformation in general would rely on a better static global aliasing information that is currently in review http://reviews.llvm.org/D10059
This will help, yes, but the transformation is quite useful regardless.
For non-static globals, one problem with loop-based analysis alone is that in a popular embedded benchmark suite, you get serious gains if you can localize the globals in code like int *G1; int *G2; foo () { G1 = malloc(...); for (...) { // Lots of stuff with G1 and G2 worth localizing } } That malloc is very important to consider when doing an alias query because now the aliasing infrastructure knows G1, G2 don't alias, and you won't see it from a loop pass. If you were to try and modify LICM to localize the globals for example, it would have to assume G1 and G2 MayAlias.
Why?
-Hal
I believe this implies we must use a FunctionPass, and I have a prototype that catches cases like the above, as well as the simpler ones. I can't commit myself however to when that will be ready, so I'm just sharing what I've found out, maybe it's helpful.
I'd be interested to hear your thoughts / approach in greater detail. Thanks! --Charlie. On 21 July 2015 at 06:10, <sundeepk at codeaurora.org> wrote: > typo corrected > > lclvar = gblvar; > for () { > ...access lclvar... > } > gblvar = lclvar; > > >> Hello all, >> >> I am writing to get some feedback on an optimization that I would >> like to >> upstream. The basic idea is to localize global variables inside >> loops so >> that it can be allocated into registers. For example, transform >> the >> following sequence >> >> static int gblvar; >> void foo() { >> >> for () { >> ...access gblvar... >> } >> >> } >> >> into something like >> >> static int gblvar; >> void foo() { >> int lclvar; >> >> lclvar = gblvar; >> for () { >> ...access clcvar... >> } >> gblvar = lclvar; >> >> } >> >> This transformation helps a couple of EEMBC benchmarks on both >> Aarch64 and >> Hexagon backends. I was wondering if there is interest to get this >> optimization upstreamed or if there is a better way of doing this. >> >> Thanks, >> Sundeep >> >> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, >> hosted by The Linux Foundation >> > > _> ________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-- Hal Finkel Assistant Computational Scientist Leadership Computing Facility Argonne National Laboratory
- Previous message: [LLVMdev] Loop localize global variables
- Next message: [LLVMdev] Loop localize global variables
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]