mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-12 15:30:46 +00:00
[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
This commit is contained in:
parent
881e9f3177
commit
0bd53cd74c
@ -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();
|
||||
|
||||
|
23
test/Transforms/ArgumentPromotion/profile.ll
Normal file
23
test/Transforms/ArgumentPromotion/profile.ll
Normal file
@ -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}
|
Loading…
x
Reference in New Issue
Block a user