ArgPromo+DebugInfo: Handle updating debug info over multiple applications of argument...
authorDavid Blaikie <dblaikie@gmail.com>
Wed, 23 Jul 2014 22:09:29 +0000 (22:09 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Wed, 23 Jul 2014 22:09:29 +0000 (22:09 +0000)
While the subprogram map cache used by Dead Argument Elimination works
there, I made a mistake when reusing it for Argument Promotion in
r212128 because ArgPromo may transform functions more than once whereas
DAE transforms each function only once, removing all the dead arguments
in one go.

To address this, ensure that the map is updated after each argument
promotion.

In retrospect it might be a little wasteful to create a map of all
subprograms when only handling a single CGSCC, but the alternative is
walking the debug info for each function in the CGSCC that gets updated.
It's not clear to me what the right tradeoff is there, but since the
current tradeoff seems to be working OK (and the code to keep things
updated is very cheap), let's stick with that for now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213805 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/ArgumentPromotion.cpp
test/Transforms/ArgumentPromotion/dbg.ll

index f9de54a173d189aad211158be9c4e7eaa614c9bf..097a351e30b175f1756a8c286be90ef92f2e75e6 100644 (file)
@@ -615,9 +615,13 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
 
   // Patch the pointer to LLVM function in debug info descriptor.
   auto DI = FunctionDIs.find(F);
-  if (DI != FunctionDIs.end())
-    DI->second.replaceFunction(NF);
-  
+  if (DI != FunctionDIs.end()) {
+    DISubprogram SP = DI->second;
+    SP.replaceFunction(NF);
+    FunctionDIs.erase(DI);
+    FunctionDIs[NF] = SP;
+  }
+
   DEBUG(dbgs() << "ARG PROMOTION:  Promoting to:" << *NF << "\n"
         << "From: " << *F);
   
index fd0b1e996eb5a8355cff31401ab0184559c244eb..1b69e5bbf3cbe35b616c5e1ff059e6e4b74403ee 100644 (file)
@@ -4,14 +4,15 @@
 
 declare void @sink(i32)
 
-define internal void @test(i32* %X) {
-  %1 = load i32* %X, align 8
-  call void @sink(i32 %1)
+define internal void @test(i32** %X) {
+  %1 = load i32** %X, align 8
+  %2 = load i32* %1, align 8
+  call void @sink(i32 %2)
   ret void
 }
 
-define void @caller(i32* %Y) {
-  call void @test(i32* %Y)
+define void @caller(i32** %Y) {
+  call void @test(i32** %Y)
   ret void
 }
 
@@ -20,6 +21,6 @@ define void @caller(i32* %Y) {
 
 !0 = metadata !{i32 2, metadata !"Debug Info Version", i32 1}
 !1 = metadata !{i32 8, i32 0, metadata !2, null}
-!2 = metadata !{i32 786478, null, null, metadata !"test", metadata !"test", metadata !"", i32 3, null, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32*)* @test, null, null, null, i32 3}
+!2 = metadata !{i32 786478, null, null, metadata !"test", metadata !"test", metadata !"", i32 3, null, i1 true, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (i32**)* @test, null, null, null, i32 3}
 !3 = metadata !{i32 786449, null, i32 4, metadata !"clang version 3.5.0 ", i1 false, metadata !"", i32 0, null, null, metadata !4, null, null, metadata !"", i32 2} ; [ DW_TAG_compile_unit ] [/usr/local/google/home/blaikie/dev/scratch/pr20038/reduce/<stdin>] [DW_LANG_C_plus_plus]
 !4 = metadata !{metadata !2}