forked from OSchip/llvm-project
[GVN+LICM] Use line 0 locations for better crash attribution
This is a follow-up to r291037+r291258, which used null debug locations to prevent jumpy line tables. Using line 0 locations achieves the same effect, but works better for crash attribution because it preserves the right inline scope. Differential Revision: https://reviews.llvm.org/D60913 llvm-svn: 358791
This commit is contained in:
parent
a9c2ba3fff
commit
282b26ec4d
|
@ -46,6 +46,7 @@
|
|||
#include "llvm/IR/Constant.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/DebugLoc.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/Function.h"
|
||||
|
@ -1206,9 +1207,8 @@ bool GVN::PerformLoadPRE(LoadInst *LI, AvailValInBlkVect &ValuesPerBlock,
|
|||
// Instructions that have been inserted in predecessor(s) to materialize
|
||||
// the load address do not retain their original debug locations. Doing
|
||||
// so could lead to confusing (but correct) source attributions.
|
||||
// FIXME: How do we retain source locations without causing poor debugging
|
||||
// behavior?
|
||||
I->setDebugLoc(DebugLoc());
|
||||
if (const DebugLoc &DL = I->getDebugLoc())
|
||||
I->setDebugLoc(DebugLoc::get(0, 0, DL.getScope(), DL.getInlinedAt()));
|
||||
|
||||
// FIXME: We really _ought_ to insert these value numbers into their
|
||||
// parent's availability map. However, in doing so, we risk getting into
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include "llvm/IR/CFG.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/DataLayout.h"
|
||||
#include "llvm/IR/DebugInfoMetadata.h"
|
||||
#include "llvm/IR/DerivedTypes.h"
|
||||
#include "llvm/IR/Dominators.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
|
@ -1652,13 +1653,10 @@ static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop,
|
|||
// Move the new node to the destination block, before its terminator.
|
||||
moveInstructionBefore(I, *Dest->getTerminator(), *SafetyInfo, MSSAU);
|
||||
|
||||
// Do not retain debug locations when we are moving instructions to different
|
||||
// basic blocks, because we want to avoid jumpy line tables. Calls, however,
|
||||
// need to retain their debug locs because they may be inlined.
|
||||
// FIXME: How do we retain source locations without causing poor debugging
|
||||
// behavior?
|
||||
if (!isa<CallInst>(I))
|
||||
I.setDebugLoc(DebugLoc());
|
||||
// Apply line 0 debug locations when we are moving instructions to different
|
||||
// basic blocks because we want to avoid jumpy line tables.
|
||||
if (const DebugLoc &DL = I.getDebugLoc())
|
||||
I.setDebugLoc(DebugLoc::get(0, 0, DL.getScope(), DL.getInlinedAt()));
|
||||
|
||||
if (isa<LoadInst>(I))
|
||||
++NumMovedLoads;
|
||||
|
|
|
@ -18,8 +18,9 @@
|
|||
; We make sure that the instruction that is hoisted into the preheader
|
||||
; does not have a debug location.
|
||||
; CHECK: for.body.lr.ph:
|
||||
; CHECK: getelementptr{{.*}}%p.addr, i64 4{{$}}
|
||||
; CHECK: getelementptr{{.*}}%p.addr, i64 4{{.*}} !dbg [[zero:![0-9]+]]
|
||||
; CHECK: for.body:
|
||||
; CHECK: [[zero]] = !DILocation(line: 0
|
||||
;
|
||||
; ModuleID = 't.ll'
|
||||
source_filename = "test.c"
|
||||
|
|
|
@ -4,8 +4,8 @@ target datalayout = "e-p:64:64:64"
|
|||
|
||||
; CHECK-LABEL: @foo(
|
||||
; CHECK: entry.end_crit_edge:
|
||||
; CHECK: %[[INDEX:[a-z0-9.]+]] = sext i32 %x to i64{{$}}
|
||||
; CHECK: %[[ADDRESS:[a-z0-9.]+]] = getelementptr [100 x i32], [100 x i32]* @G, i64 0, i64 %[[INDEX]]{{$}}
|
||||
; CHECK: %[[INDEX:[a-z0-9.]+]] = sext i32 %x to i64{{.*}} !dbg [[ZERO_LOC:![0-9]+]]
|
||||
; CHECK: %[[ADDRESS:[a-z0-9.]+]] = getelementptr [100 x i32], [100 x i32]* @G, i64 0, i64 %[[INDEX]]{{.*}} !dbg [[ZERO_LOC]]
|
||||
; CHECK: %n.pre = load i32, i32* %[[ADDRESS]], !dbg [[N_LOC:![0-9]+]]
|
||||
; CHECK: br label %end
|
||||
; CHECK: then:
|
||||
|
@ -14,7 +14,8 @@ target datalayout = "e-p:64:64:64"
|
|||
; CHECK: %n = phi i32 [ %n.pre, %entry.end_crit_edge ], [ %z, %then ], !dbg [[N_LOC]]
|
||||
; CHECK: ret i32 %n
|
||||
|
||||
; CHECK: [[N_LOC]] = !DILocation(line: 47, column: 1, scope: !{{.*}})
|
||||
; CHECK-DAG: [[N_LOC]] = !DILocation(line: 47, column: 1, scope: !{{.*}})
|
||||
; CHECK-DAG: [[ZERO_LOC]] = !DILocation(line: 0
|
||||
|
||||
@G = external global [100 x i32]
|
||||
define i32 @foo(i32 %x, i32 %z) !dbg !6 {
|
||||
|
|
Loading…
Reference in New Issue