OSDN Git Service

Look for a loop's starting location in the llvm.loop metadata
authorHal Finkel <hfinkel@anl.gov>
Wed, 25 May 2016 21:42:37 +0000 (21:42 +0000)
committerHal Finkel <hfinkel@anl.gov>
Wed, 25 May 2016 21:42:37 +0000 (21:42 +0000)
commitd86e7af14a43fa97b47292a20c1e0402fa501ac7
treef06b3ba6fd74a911dfac2cc9068485bd48d37faf
parent65aab132bb1d4afc0d78d3797992249c062514d2
Look for a loop's starting location in the llvm.loop metadata

Getting accurate locations for loops is important, because those locations are
used by the frontend to generate optimization remarks. Currently, optimization
remarks for loops often appear on the wrong line, often the first line of the
loop body instead of the loop itself. This is confusing because that line might
itself be another loop, or might be somewhere else completely if the body was
inlined function call. This happens because of the way we find the loop's
starting location. First, we look for a preheader, and if we find one, and its
terminator has a debug location, then we use that. Otherwise, we look for a
location on an instruction in the loop header.

The fallback heuristic is not bad, but will almost always find the beginning of
the body, and not the loop statement itself. The preheader location search
often fails because there's often not a preheader, and even when there is a
preheader, depending on how it was formed, it sometimes carries the location of
some preceeding code.

I don't see any good theoretical way to fix this problem. On the other hand,
this seems like a straightforward solution: Put the debug location in the
loop's llvm.loop metadata. A companion Clang patch will cause Clang to insert
llvm.loop metadata with appropriate locations when generating debugging
information. With these changes, our loop remarks have much more accurate
locations.

Differential Revision: http://reviews.llvm.org/D19738

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270771 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/Analysis/LoopInfo.h
lib/Analysis/LoopInfo.cpp
test/Transforms/LoopVectorize/X86/vectorization-remarks-loopid-dbg.ll [new file with mode: 0644]