diff options
author | Duncan Sands <baldrick@free.fr> | 2008-09-08 11:07:35 +0000 |
---|---|---|
committer | Duncan Sands <baldrick@free.fr> | 2008-09-08 11:07:35 +0000 |
commit | 34c8847b2d27433ec7b81c824b66771e7665873a (patch) | |
tree | af9d31831d43b3fc9041478408a3b0fcd3c9de36 | |
parent | d7b9851c4e634ed3599b1a4c70b1c76c90a11686 (diff) |
Update the callgraph correctly in ArgumentPromotion.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55895 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Transforms/IPO/ArgumentPromotion.cpp | 7 | ||||
-rw-r--r-- | test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll | 12 | ||||
-rw-r--r-- | test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll | 25 |
3 files changed, 44 insertions, 0 deletions
diff --git a/lib/Transforms/IPO/ArgumentPromotion.cpp b/lib/Transforms/IPO/ArgumentPromotion.cpp index b508714e85..f3b29fe61b 100644 --- a/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -607,6 +607,10 @@ Function *ArgPromotion::DoPromotion(Function *F, // changes. AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); + // Get the callgraph information that we need to update to reflect our + // changes. + CallGraph &CG = getAnalysis<CallGraph>(); + // Loop over all of the callers of the function, transforming the call sites // to pass in the loaded pointers. // @@ -710,6 +714,9 @@ Function *ArgPromotion::DoPromotion(Function *F, // the old call with a new one. AA.replaceWithNewValue(Call, New); + // Update the callgraph to know that the callsite has been transformed. + CG[Call->getParent()->getParent()]->replaceCallSite(Call, New); + if (!Call->use_empty()) { Call->replaceAllUsesWith(New); New->takeName(Call); diff --git a/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll b/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll new file mode 100644 index 0000000000..047ff0a48c --- /dev/null +++ b/test/Transforms/ArgumentPromotion/2008-09-07-CGUpdate.ll @@ -0,0 +1,12 @@ +; RUN: llvm-as < %s | opt -inline -argpromotion -disable-output + +define internal fastcc i32 @hash(i32* %ts, i32 %mod) nounwind { +entry: + unreachable +} + +define void @encode(i32* %m, i32* %ts, i32* %new) nounwind { +entry: + %0 = call fastcc i32 @hash( i32* %ts, i32 0 ) nounwind ; <i32> [#uses=0] + unreachable +} diff --git a/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll b/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll new file mode 100644 index 0000000000..d406165500 --- /dev/null +++ b/test/Transforms/ArgumentPromotion/2008-09-08-CGUpdateSelfEdge.ll @@ -0,0 +1,25 @@ +; RUN: llvm-as < %s | opt -argpromotion -disable-output + +define internal fastcc i32 @term_SharingList(i32* %Term, i32* %List) nounwind { +entry: + br i1 false, label %bb, label %bb5 + +bb: ; preds = %entry + %0 = call fastcc i32 @term_SharingList( i32* null, i32* %List ) nounwind ; <i32> [#uses=0] + unreachable + +bb5: ; preds = %entry + ret i32 0 +} + +define i32 @term_Sharing(i32* %Term) nounwind { +entry: + br i1 false, label %bb.i, label %bb14 + +bb.i: ; preds = %entry + %0 = call fastcc i32 @term_SharingList( i32* null, i32* null ) nounwind ; <i32> [#uses=0] + ret i32 1 + +bb14: ; preds = %entry + ret i32 0 +} |