Teach GlobalOpt to delete aliases with internal linkage (after

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
This commit is contained in:
Duncan Sands 2009-12-08 10:10:20 +00:00
parent 34f849098b
commit 7a154cf228
2 changed files with 33 additions and 22 deletions

View 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;
// 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;
// The transform is only useful if the alias does not have internal linkage.
if (J->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);

View 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
}