[llvm-commits] [llvm] r73230 - in /llvm/trunk: lib/Transforms/IPO/MergeFunctions.cpp test/Transforms/MergeFunc/fold-weak.ll
Nick Lewycky
nicholas at mxc.ca
Fri Jun 12 08:57:11 PDT 2009
Author: nicholas
Date: Fri Jun 12 10:56:56 2009
New Revision: 73230
URL: http://llvm.org/viewvc/llvm-project?rev=73230&view=rev
Log:
Given two identical weak functions, produce one internal function and two weak
thunks.
Added:
llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll
Modified:
llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
Modified: llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp?rev=73230&r1=73229&r2=73230&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp (original)
+++ llvm/trunk/lib/Transforms/IPO/MergeFunctions.cpp Fri Jun 12 10:56:56 2009
@@ -458,8 +458,8 @@
}
static void ThunkGToF(Function *F, Function *G) {
- Function *NewG = Function::Create(G->getFunctionType(), G->getLinkage(),
- "", G->getParent());
+ Function *NewG = Function::Create(G->getFunctionType(), G->getLinkage(), "",
+ G->getParent());
BasicBlock *BB = BasicBlock::Create("", NewG);
std::vector<Value *> Args;
@@ -539,8 +539,21 @@
}
break;
- case ExternalWeak:
- return false;
+ case ExternalWeak: {
+ assert(catG == ExternalWeak);
+
+ // Make them both thunks to the same internal function.
+ F->setAlignment(std::max(F->getAlignment(), G->getAlignment()));
+ Function *H = Function::Create(F->getFunctionType(), F->getLinkage(), "",
+ F->getParent());
+ H->copyAttributesFrom(F);
+ H->takeName(F);
+
+ ThunkGToF(F, G);
+ ThunkGToF(F, H);
+
+ F->setLinkage(GlobalValue::InternalLinkage);
+ } break;
case Internal:
switch (catG) {
Added: llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll?rev=73230&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll (added)
+++ llvm/trunk/test/Transforms/MergeFunc/fold-weak.ll Fri Jun 12 10:56:56 2009
@@ -0,0 +1,13 @@
+; RUN: llvm-as < %s | opt -mergefunc | llvm-dis > %t
+; RUN: grep {define weak} %t | count 2
+; RUN: grep {call} %t | 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
+}
More information about the llvm-commits
mailing list