OSDN Git Service

Make this more useful for cleaning up after the
authorDuncan Sands <baldrick@free.fr>
Sun, 15 Feb 2009 11:54:49 +0000 (11:54 +0000)
committerDuncan Sands <baldrick@free.fr>
Sun, 15 Feb 2009 11:54:49 +0000 (11:54 +0000)
one-definition-rule llvm-gcc changes (coming soon
to a tree near you!).

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

lib/Transforms/IPO/GlobalOpt.cpp

index 4208e90..b609829 100644 (file)
@@ -2405,26 +2405,16 @@ bool GlobalOpt::ResolveAliases(Module &M) {
     if (J->hasInternalLinkage())
       continue;
 
-    // Be conservative and do not perform the transform if multiple aliases
-    // potentially target the aliasee.  TODO: Make this more aggressive.
+    // 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 it would change the visibility.
-    if (J->getVisibility() != Target->getVisibility())
-      continue;
-
-    // Do not perform the transform if it would change the section.
-    if (J->hasSection() != Target->hasSection() ||
-        (J->hasSection() && J->getSection() != Target->getSection()))
-      continue;
-
-    // Give the aliasee the name and linkage of the alias.
+    // Give the aliasee the name, linkage and other attributes of the alias.
     Target->takeName(J);
     Target->setLinkage(J->getLinkage());
-
-    // The alignment is the only remaining attribute that may not match.
-    Target->setAlignment(std::max(J->getAlignment(), Target->getAlignment()));
+    Target->GlobalValue::copyAttributesFrom(J);
 
     // Delete the alias.
     M.getAliasList().erase(J);