[llvm] r345046 - [DebugInfo][GlobalOpt] Fix -debugify for globalopt shrinking globals to booleans.

Jordan Rupprecht via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 23 09:35:51 PDT 2018


Author: rupprecht
Date: Tue Oct 23 09:35:51 2018
New Revision: 345046

URL: http://llvm.org/viewvc/llvm-project?rev=345046&view=rev
Log:
[DebugInfo][GlobalOpt] Fix -debugify for globalopt shrinking globals to booleans.

Summary:
TryToShrinkGlobalToBoolean, when possible, will split store <value> + load <value> into store <bool> + select <bool ? value : 0>. 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

Added:
    llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll
Modified:
    llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp

Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=345046&r1=345045&r2=345046&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Tue Oct 23 09:35:51 2018
@@ -1710,19 +1710,25 @@ static bool TryToShrinkGlobalToBoolean(G
           assert(isa<LoadInst>(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<LoadInst>(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();

Added: llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll?rev=345046&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll (added)
+++ llvm/trunk/test/Transforms/GlobalOpt/shrink-global-to-bool-check-debug.ll Tue Oct 23 09:35:51 2018
@@ -0,0 +1,22 @@
+;RUN: opt -S -debugify -globalopt -f %s | FileCheck %s
+
+ at 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,




More information about the llvm-commits mailing list