[PATCH] D31632: ThinLTOBitcodeWriter: handle aliases first in filterModule

Bob Haarman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 4 14:04:18 PDT 2017


inglorion updated this revision to Diff 94118.
inglorion added a comment.

Added LLVM IR test.


https://reviews.llvm.org/D31632

Files:
  lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
  test/ThinLTO/X86/promote-internals.ll


Index: test/ThinLTO/X86/promote-internals.ll
===================================================================
--- /dev/null
+++ test/ThinLTO/X86/promote-internals.ll
@@ -0,0 +1,23 @@
+; RUN: opt -thinlto-bc -o - %s | FileCheck %s
+; CHECK: {{^BC}}
+
+target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.0.24215"
+
+$al = comdat any
+
+ at anon = private unnamed_addr constant { [1 x i8*] } { [1 x i8*] [i8* null] }, comdat($al), !type !0
+
+ at al = internal unnamed_addr alias i8*, getelementptr inbounds ({ [1 x i8*] }, { [1 x i8*] }* @anon, i32 0, i32 0, i32 1)
+
+define i32 @bar() {
+  %call = call i32 @foo()
+  ret i32 %call
+}
+
+define internal i32 @foo() unnamed_addr align 2 {
+  store i8** @al, i8*** null, align 8
+  ret i32 0
+}
+
+!0 = !{i64 8, !"?AVA@@"}
Index: lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
===================================================================
--- lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
+++ lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
@@ -182,33 +182,14 @@
 
 void filterModule(
     Module *M, function_ref<bool(const GlobalValue *)> ShouldKeepDefinition) {
-  for (Function &F : *M) {
-    if (ShouldKeepDefinition(&F))
-      continue;
-
-    F.deleteBody();
-    F.setComdat(nullptr);
-    F.clearMetadata();
-  }
-
-  for (GlobalVariable &GV : M->globals()) {
-    if (ShouldKeepDefinition(&GV))
-      continue;
-
-    GV.setInitializer(nullptr);
-    GV.setLinkage(GlobalValue::ExternalLinkage);
-    GV.setComdat(nullptr);
-    GV.clearMetadata();
-  }
-
   for (Module::alias_iterator I = M->alias_begin(), E = M->alias_end();
        I != E;) {
     GlobalAlias *GA = &*I++;
     if (ShouldKeepDefinition(GA))
       continue;
 
     GlobalObject *GO;
-    if (I->getValueType()->isFunctionTy())
+    if (GA->getValueType()->isFunctionTy())
       GO = Function::Create(cast<FunctionType>(GA->getValueType()),
                             GlobalValue::ExternalLinkage, "", M);
     else
@@ -220,6 +201,25 @@
     GA->replaceAllUsesWith(GO);
     GA->eraseFromParent();
   }
+
+  for (Function &F : *M) {
+    if (ShouldKeepDefinition(&F))
+      continue;
+
+    F.deleteBody();
+    F.setComdat(nullptr);
+    F.clearMetadata();
+  }
+
+  for (GlobalVariable &GV : M->globals()) {
+    if (ShouldKeepDefinition(&GV))
+      continue;
+
+    GV.setInitializer(nullptr);
+    GV.setLinkage(GlobalValue::ExternalLinkage);
+    GV.setComdat(nullptr);
+    GV.clearMetadata();
+  }
 }
 
 void forEachVirtualFunction(Constant *C, function_ref<void(Function *)> Fn) {


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31632.94118.patch
Type: text/x-patch
Size: 2571 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170404/85720def/attachment.bin>


More information about the llvm-commits mailing list