[llvm-dev] An issue with new PM's requirements on call graph changes
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 3 16:43:29 PDT 2017
On 06/30/2017 03:02 AM, Chandler Carruth wrote:
> I have hit a fairly isolated practical issue deploying the new PM, but
> it does point to a latent theoretical issues as well. I see various
> ways to address it, but want feedback from others before moving forward.
>
> The issue is that we can introduce out-of-thin-air calls to known
> library functions (`SimplifyLibCalls`, etc). These can be introduced
> in function passes (`InstCombine` in particular) and that seems highly
> desirable.
>
> These all look like one of these cases:
> 1a) Introducing a new call to an LLVM intrinsic
> 1b) Replacing an existing call with a call to an LLVM intrinsic
> 2a) Introducing a new call to a declared library function (but not
> defined)
> 2b) Replacing an existing call with a call to a declared library function
> 3a) Introducing a new call to a defined library function
> 3b) Replacing an existing call with a call to a defined library function
>
> Both #1 and #2 are easy to handle in reality. Intrinsics and declared
> functions don't impact the PM's call graph because there is no need to
> order the walk over them. But #3 is a real issue.
>
> The only case I have found that actually hits #3 at all hits #3b when
> building FORTIFY code with the new pass manager because after inlining
> we do a lot of (really nice) optimizations on library calls to remove
> unnecessary FORTIFY checks. But this is in *theory* a problem when
> LTO-ing with libc. More likely it could be a problem when LTO-ing with
> a vector math library.
This latter case concerns me most. When the vectorizer creates the
vectorized version of a loop, that's new code (the original code for the
loop stays in place as a fall back). Further, the vectorizer can (today)
create calls to vector math library functions, and a setup where we LTO
with the definitions of those functions is certainly possible (and
desirable). As a result, this issue does not seem all that theoretical
to me.
Moreover, once we have support for OpenMP simd functions, we'll end up
in exactly this situation on a regular basis, and we can't have
intrinsics for all of the possible user-defined functions (unless the
intrinsic just takes a function pointer and we clean it up afterwards
somehow). In short, I think we do need to correctly handle this situation.
FWIW, I can also see this situation come up in other instrumentation
cases as well. There are plenty of cases where it is useful to LTO with
a runtime library.
Thanks again,
Hal
>
> So what do we do?
>
> My initial idea: find all *defined* library functions in the module,
> and every time we create a ref edge to one of them, synthesize a ref
> edge to all of them. This should completely solve #3b above. But it
> doesn't really address #3a at all.
>
> Is that OK? It would be very convenient to say that if we want to
> introduce truly novel and new calls to library functions, we should
> have an LLVM intrinsic to model those routines.
>
> But we actually have an example (I think) of #3a, introducing a call
> to a library function out of the blue: memset_pattern. =/
>
> The only way I see to reasonably handle #3a is to have *every*
> function implicitly contain a reference edge to every defined library
> function in the module. This is, needless to say, amazingly wasteful.
> Hence my email. How important is this?
>
> If we need to correctly handle this, I think I would probably
> implement this by actually changing the *iteration* of reference edges
> in the graph to just implicitly walk the list of defined library
> functions so that we didn't burn any space on this. But it will make
> iteration of reference edges slower and add a reasonable amount of
> complexity. So I'd like to hear some other opinions before going down
> either of these roads.
>
>
> Thanks,
> -Chandler
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list