From 2fed6ac186b505a68a30e9e3851b942e74687d6e Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht Date: Tue, 23 Oct 2018 16:35:51 +0000 Subject: [PATCH] [DebugInfo][GlobalOpt] Fix -debugify for globalopt shrinking globals to booleans. Summary: TryToShrinkGlobalToBoolean, when possible, will split store + load into store + select . This preserves DebugLoc during that pass. Fixes PR37959. The test case here is the simplified .ll for: ``` static int foo; int bar() { foo = 5; return foo; } ``` Reviewers: dblaikie, gbedwell, aprantl Reviewed By: dblaikie Subscribers: mehdi_amini, JDevlieghere, dexonsmith, llvm-commits Tags: #debug-info Differential Revision: https://reviews.llvm.org/D53531 llvm-svn: 345046 --- llvm/lib/Transforms/IPO/GlobalOpt.cpp | 12 +++++++++--- .../GlobalOpt/shrink-global-to-bool-check-debug.ll | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 llvm/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index 5518ef8..3005aaf 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -1710,19 +1710,25 @@ static bool TryToShrinkGlobalToBoolean(GlobalVariable *GV, Constant *OtherVal) { assert(isa(StoreVal) && "Not a load of NewGV!"); } } - new StoreInst(StoreVal, NewGV, false, 0, - SI->getOrdering(), SI->getSyncScopeID(), SI); + StoreInst *NSI = + new StoreInst(StoreVal, NewGV, false, 0, SI->getOrdering(), + SI->getSyncScopeID(), SI); + NSI->setDebugLoc(SI->getDebugLoc()); } else { // Change the load into a load of bool then a select. LoadInst *LI = cast(UI); LoadInst *NLI = new LoadInst(NewGV, LI->getName()+".b", false, 0, LI->getOrdering(), LI->getSyncScopeID(), LI); - Value *NSI; + Instruction *NSI; if (IsOneZero) NSI = new ZExtInst(NLI, LI->getType(), "", LI); else NSI = SelectInst::Create(NLI, OtherVal, InitVal, "", LI); NSI->takeName(LI); + // Since LI is split into two instructions, NLI and NSI both inherit the + // same DebugLoc + NLI->setDebugLoc(LI->getDebugLoc()); + NSI->setDebugLoc(LI->getDebugLoc()); LI->replaceAllUsesWith(NSI); } UI->eraseFromParent(); diff --git a/llvm/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll b/llvm/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll new file mode 100644 index 0000000..7101912 --- /dev/null +++ b/llvm/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll @@ -0,0 +1,22 @@ +;RUN: opt -S -debugify -globalopt -f %s | FileCheck %s + +@foo = internal global i32 0, align 4 + +define dso_local i32 @bar() { +entry: + store i32 5, i32* @foo, align 4 + %0 = load i32, i32* @foo, align 4 + ret i32 %0 +} + +;CHECK: @bar +;CHECK-NEXT: entry: +;CHECK-NEXT: store i1 true, i1* @foo, !dbg ![[DbgLocStore:[0-9]+]] +;CHECK-NEXT: %.b = load i1, i1* @foo, !dbg ![[DbgLocLoadSel:[0-9]+]] +;CHECK-NEXT: %0 = select i1 %.b, i32 5, i32 0, !dbg ![[DbgLocLoadSel]] +;CHECK-NEXT: call void @llvm.dbg.value({{.*}}), !dbg ![[DbgLocLoadSel]] +;CHECK-NEXT: ret i32 %0, !dbg ![[DbgLocRet:[0-9]+]] + +;CHECK: ![[DbgLocStore]] = !DILocation(line: 1, +;CHECK: ![[DbgLocLoadSel]] = !DILocation(line: 2, +;CHECK: ![[DbgLocRet]] = !DILocation(line: 3, -- 2.7.4