From 0bd53cd74c0c9cad162582ff59c82286e19fc7ee Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Thu, 13 Apr 2017 18:10:30 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300229 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/ArgumentPromotion.cpp | 5 ++++- test/Transforms/ArgumentPromotion/profile.ll | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/ArgumentPromotion/profile.ll diff --git a/lib/Transforms/IPO/ArgumentPromotion.cpp b/lib/Transforms/IPO/ArgumentPromotion.cpp index 00235d46dc5..940c1ead096 100644 --- a/lib/Transforms/IPO/ArgumentPromotion.cpp +++ b/lib/Transforms/IPO/ArgumentPromotion.cpp @@ -291,7 +291,7 @@ doPromotion(Function *F, SmallPtrSetImpl &ArgsToPromote, CallSite NewCS; if (InvokeInst *II = dyn_cast(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(Call)->getTailCallKind()); @@ -302,6 +302,9 @@ doPromotion(Function *F, SmallPtrSetImpl &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/test/Transforms/ArgumentPromotion/profile.ll b/test/Transforms/ArgumentPromotion/profile.ll new file mode 100644 index 00000000000..f667f9ea2c2 --- /dev/null +++ b/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} -- 2.11.0