Teach GlobalOpt to delete aliases with internal linkage (after
authorDuncan Sands <baldrick@free.fr>
Tue, 8 Dec 2009 10:10:20 +0000 (10:10 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 8 Dec 2009 10:10:20 +0000 (10:10 +0000)
forwarding any uses).  GlobalDCE can also do this, but is only
run at -O3.

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

lib/Transforms/IPO/GlobalOpt.cpp
test/Transforms/GlobalOpt/2009-02-15-ResolveAlias.ll

index 4635d0e61c394f737ec2224369749ae8286c3d9c..1793bbf48ef2dc4d3cf66f05d6277ad272aa1063 100644 (file)
@@ -2493,29 +2493,28 @@ bool GlobalOpt::OptimizeGlobalAliases(Module &M) {
       Changed = true;
     }
 
-    // If the aliasee has internal linkage, give it the name and linkage
-    // of the alias, and delete the alias.  This turns:
-    //   define internal ... @f(...)
-    //   @a = alias ... @f
-    // into:
-    //   define ... @a(...)
-    if (!Target->hasLocalLinkage())
-      continue;
-
-    // The transform is only useful if the alias does not have internal linkage.
-    if (J->hasLocalLinkage())
-      continue;
+    // If the alias is externally visible, we may still be able to simplify it.
+    if (!J->hasLocalLinkage()) {
+      // If the aliasee has internal linkage, give it the name and linkage
+      // of the alias, and delete the alias.  This turns:
+      //   define internal ... @f(...)
+      //   @a = alias ... @f
+      // into:
+      //   define ... @a(...)
+      if (!Target->hasLocalLinkage())
+        continue;
 
-    // Do not perform the transform if multiple aliases potentially target the
-    // aliasee.  This check also ensures that it is safe to replace the section
-    // and other attributes of the aliasee with those of the alias.
-    if (!hasOneUse)
-      continue;
+      // Do not perform the transform if multiple aliases potentially target the
+      // aliasee.  This check also ensures that it is safe to replace the section
+      // and other attributes of the aliasee with those of the alias.
+      if (!hasOneUse)
+        continue;
 
-    // Give the aliasee the name, linkage and other attributes of the alias.
-    Target->takeName(J);
-    Target->setLinkage(J->getLinkage());
-    Target->GlobalValue::copyAttributesFrom(J);
+      // Give the aliasee the name, linkage and other attributes of the alias.
+      Target->takeName(J);
+      Target->setLinkage(J->getLinkage());
+      Target->GlobalValue::copyAttributesFrom(J);
+    }
 
     // Delete the alias.
     M.getAliasList().erase(J);
index 5e639fd8222e9c9e531d99d6e4347efd1a91cfd8..a5be2b17d4ad4c525f5f6193c061474b5af42c4e 100644 (file)
@@ -1,6 +1,8 @@
-; RUN: opt < %s -globalopt -S | grep {define void @a}
+; RUN: opt < %s -globalopt -S | FileCheck %s
 
 define internal void @f() {
+; CHECK-NOT: @f
+; CHECK: define void @a
        ret void
 }
 
@@ -10,3 +12,13 @@ define void @g() {
        call void()* @a()
        ret void
 }
+
+@b = alias internal void ()* @g
+; CHECK-NOT: @b
+
+define void @h() {
+       call void()* @b()
+; CHECK: call void @g
+       ret void
+}
+