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 | 148c539e3dab2f2579e4601485d11c7272339b95 (patch) | |
| tree | af9d31831d43b3fc9041478408a3b0fcd3c9de36 | |
| parent | 104431b173524bc249d1d1956b2cdb76c5c18676 (diff) | |
| download | external_llvm-148c539e3dab2f2579e4601485d11c7272339b95.zip external_llvm-148c539e3dab2f2579e4601485d11c7272339b95.tar.gz external_llvm-148c539e3dab2f2579e4601485d11c7272339b95.tar.bz2 | |
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 b508714..f3b29fe 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 0000000..047ff0a --- /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 0000000..d406165 --- /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 +} |
