mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Changes from Duncan's review:
* merge two weak functions by making them both alias a third non-weak fn * don't reimplement CallSite::hasArgument * whitelist the safe linkage types git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58568 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e491515730
commit
6feb333695
@ -54,6 +54,7 @@
|
|||||||
#include "llvm/Instructions.h"
|
#include "llvm/Instructions.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/Pass.h"
|
#include "llvm/Pass.h"
|
||||||
|
#include "llvm/Support/CallSite.h"
|
||||||
#include "llvm/Support/Compiler.h"
|
#include "llvm/Support/Compiler.h"
|
||||||
#include "llvm/Support/Debug.h"
|
#include "llvm/Support/Debug.h"
|
||||||
#include <map>
|
#include <map>
|
||||||
@ -265,6 +266,28 @@ static bool fold(std::vector<Function *> &FnVec, unsigned i, unsigned j) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (F->hasWeakLinkage() && G->hasWeakLinkage()) {
|
||||||
|
GlobalAlias *GA_F = new GlobalAlias(F->getType(), F->getLinkage(), "",
|
||||||
|
0, F->getParent());
|
||||||
|
GA_F->takeName(F);
|
||||||
|
GA_F->setVisibility(F->getVisibility());
|
||||||
|
F->setAlignment(std::max(F->getAlignment(), G->getAlignment()));
|
||||||
|
F->replaceAllUsesWith(GA_F);
|
||||||
|
F->setName("folded." + GA_F->getName());
|
||||||
|
F->setLinkage(GlobalValue::ExternalLinkage);
|
||||||
|
GA_F->setAliasee(F);
|
||||||
|
|
||||||
|
GlobalAlias *GA_G = new GlobalAlias(G->getType(), G->getLinkage(), "",
|
||||||
|
F, G->getParent());
|
||||||
|
GA_G->takeName(G);
|
||||||
|
GA_G->setVisibility(G->getVisibility());
|
||||||
|
G->replaceAllUsesWith(GA_G);
|
||||||
|
G->eraseFromParent();
|
||||||
|
|
||||||
|
++NumFunctionsMerged;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
DOUT << "Failed on " << F->getName() << " and " << G->getName() << "\n";
|
DOUT << "Failed on " << F->getName() << " and " << G->getName() << "\n";
|
||||||
|
|
||||||
++NumMergeFails;
|
++NumMergeFails;
|
||||||
@ -289,13 +312,9 @@ static bool hasAddressTaken(User *U) {
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Make sure we aren't passing U as a parameter to call instead of the
|
// Make sure we aren't passing U as a parameter to call instead of the
|
||||||
// callee. getOperand(0) is the callee for both CallInst and InvokeInst.
|
// callee.
|
||||||
// Check the other operands to see if any of them is F.
|
if (CallSite(cast<Instruction>(Use)).hasArgument(U))
|
||||||
for (User::op_iterator OI = I->op_begin() + 1, OE = I->op_end(); OI != OE;
|
return true;
|
||||||
++OI) {
|
|
||||||
if (*OI == U)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@ -310,8 +329,8 @@ bool MergeFunctions::runOnModule(Module &M) {
|
|||||||
if (F->isDeclaration() || F->isIntrinsic())
|
if (F->isDeclaration() || F->isIntrinsic())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (F->hasLinkOnceLinkage() || F->hasCommonLinkage() ||
|
if (!F->hasInternalLinkage() && !F->hasExternalLinkage() &&
|
||||||
F->hasDLLImportLinkage() || F->hasDLLExportLinkage())
|
!F->hasWeakLinkage())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (hasAddressTaken(F))
|
if (hasAddressTaken(F))
|
||||||
|
11
test/Transforms/MergeFunc/fold-weak.ll
Normal file
11
test/Transforms/MergeFunc/fold-weak.ll
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
; RUN: llvm-as < %s | opt -mergefunc | llvm-dis | grep {alias weak} | count 2
|
||||||
|
|
||||||
|
define weak i32 @sum(i32 %x, i32 %y) {
|
||||||
|
%sum = add i32 %x, %y
|
||||||
|
ret i32 %sum
|
||||||
|
}
|
||||||
|
|
||||||
|
define weak i32 @add(i32 %x, i32 %y) {
|
||||||
|
%sum = add i32 %x, %y
|
||||||
|
ret i32 %sum
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user