mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
Remove tail marker when changing an argument to an alloca.
Argument promotion can replace an argument of a call with an alloca. This requires clearing the tail marker as it is very likely that the callee is now using an alloca in the caller. This fixes pr14710. llvm-svn: 199909
This commit is contained in:
parent
6f13c22a7a
commit
adb277286a
@ -807,6 +807,16 @@ CallGraphNode *ArgPromotion::DoPromotion(Function *F,
|
||||
I->replaceAllUsesWith(TheAlloca);
|
||||
TheAlloca->takeName(I);
|
||||
AA.replaceWithNewValue(I, TheAlloca);
|
||||
|
||||
// If the alloca is used in a call, we must clear the tail flag since
|
||||
// the callee now uses an alloca from the caller.
|
||||
for (Value::use_iterator UI = TheAlloca->use_begin(),
|
||||
E = TheAlloca->use_end(); UI != E; ++UI) {
|
||||
CallInst *Call = dyn_cast<CallInst>(*UI);
|
||||
if (!Call)
|
||||
continue;
|
||||
Call->setTailCall(false);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
19
test/Transforms/ArgumentPromotion/tail.ll
Normal file
19
test/Transforms/ArgumentPromotion/tail.ll
Normal file
@ -0,0 +1,19 @@
|
||||
; RUN: opt %s -argpromotion -S -o - | FileCheck %s
|
||||
|
||||
%pair = type { i32, i32 }
|
||||
|
||||
declare i8* @foo(%pair*)
|
||||
|
||||
define internal void @bar(%pair* byval %Data) {
|
||||
; CHECK: define internal void @bar(i32 %Data.0, i32 %Data.1)
|
||||
; CHECK: %Data = alloca %pair
|
||||
; CHECK-NOT: tail
|
||||
; CHECK: call i8* @foo(%pair* %Data)
|
||||
tail call i8* @foo(%pair* %Data)
|
||||
ret void
|
||||
}
|
||||
|
||||
define void @zed(%pair* byval %Data) {
|
||||
call void @bar(%pair* byval %Data)
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue
Block a user