diff options
| author | Reid Kleckner <rnk@google.com> | 2017-04-13 18:10:30 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-04-13 18:10:30 +0000 |
| commit | 3a1150352db548888caab09e2314845bd11ebdbb (patch) | |
| tree | 74b1e1c6894cd871683eed685b982b2c88e35917 | |
| parent | 4ae261bcf70f9f11607e55011fdbb5182fbf7d56 (diff) | |
| download | bcm5719-llvm-3a1150352db548888caab09e2314845bd11ebdbb.tar.gz bcm5719-llvm-3a1150352db548888caab09e2314845bd11ebdbb.zip | |
[ArgPromotion] Don't drop !prof metadata on promoted calls
Noticed by inspection while doing attribute work. DAE, InstCombineCalls,
and ArgPromotion have a fair amount of duplicated code for hacking on
call sites, and you can find bugs by comparing them.
Add a test case for this.
llvm-svn: 300229
| -rw-r--r-- | llvm/lib/Transforms/IPO/ArgumentPromotion.cpp | 5 | ||||
| -rw-r--r-- | llvm/test/Transforms/ArgumentPromotion/profile.ll | 23 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp index 00235d46dc5..940c1ead096 100644 --- a/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/llvm/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -291,7 +291,7 @@ doPromotion(Function *F, SmallPtrSetImpl<Argument *> &ArgsToPromote, CallSite NewCS; if (InvokeInst *II = dyn_cast<InvokeInst>(Call)) { NewCS = InvokeInst::Create(NF, II->getNormalDest(), II->getUnwindDest(), - Args, OpBundles, "", Call); + Args, OpBundles, "", Call); } else { auto *NewCall = CallInst::Create(NF, Args, OpBundles, "", Call); NewCall->setTailCallKind(cast<CallInst>(Call)->getTailCallKind()); @@ -302,6 +302,9 @@ doPromotion(Function *F, SmallPtrSetImpl<Argument *> &ArgsToPromote, AttributeList::get(F->getContext(), CallPAL.getFnAttributes(), CallPAL.getRetAttributes(), ArgAttrVec)); NewCS->setDebugLoc(Call->getDebugLoc()); + uint64_t W; + if (Call->extractProfTotalWeight(W)) + NewCS->setProfWeight(W); Args.clear(); ArgAttrVec.clear(); diff --git a/llvm/test/Transforms/ArgumentPromotion/profile.ll b/llvm/test/Transforms/ArgumentPromotion/profile.ll new file mode 100644 index 00000000000..f667f9ea2c2 --- /dev/null +++ b/llvm/test/Transforms/ArgumentPromotion/profile.ll @@ -0,0 +1,23 @@ +; RUN: opt -argpromotion -mem2reg -S < %s | FileCheck %s +target datalayout = "E-p:64:64:64-a0:0:8-f32:32:32-f64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-v64:64:64-v128:128:128" + +; Checks if !prof metadata is corret in deadargelim. + +define void @caller() #0 { + %x = alloca i32 + store i32 42, i32* %x + call void @promote_i32_ptr(i32* %x), !prof !0 +; CHECK: call void @promote_i32_ptr(i32 42), !prof ![[PROF:[0-9]]] + ret void +} + +define internal void @promote_i32_ptr(i32* %xp) { + %x = load i32, i32* %xp + call void @use_i32(i32 %x) + ret void +} + +declare void @use_i32(i32) + +; CHECK: ![[PROF]] = !{!"branch_weights", i32 30} +!0 = !{!"branch_weights", i32 30} |

