mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
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:
parent
34f849098b
commit
7a154cf228
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user