diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2442,7 +2442,7 @@ // FIXME: We should also hoist alloca affected by this to the entry // block if possible. if (F->getAttributes().hasAttrSomewhere(Attribute::InAlloca) && - !F->hasAddressTaken()) { + !F->hasAddressTaken() && !hasMustTailCallers(F)) { RemoveAttribute(F, Attribute::InAlloca); Changed = true; } diff --git a/llvm/test/Transforms/GlobalOpt/fastcc.ll b/llvm/test/Transforms/GlobalOpt/fastcc.ll --- a/llvm/test/Transforms/GlobalOpt/fastcc.ll +++ b/llvm/test/Transforms/GlobalOpt/fastcc.ll @@ -35,6 +35,17 @@ ret i32 %rv } +define i32 @inalloca2_caller(i32* inalloca %p) { + %rv = musttail call i32 @inalloca2(i32* inalloca %p) + ret i32 %rv +} +define internal i32 @inalloca2(i32* inalloca %p) { +; Because of the musttail caller, this inalloca cannot be dropped. +; CHECK-LABEL: define internal i32 @inalloca2(i32* inalloca %p) + %rv = load i32, i32* %p + ret i32 %rv +} + define internal i32 @preallocated(i32* preallocated(i32) %p) { ; CHECK-LABEL: define internal fastcc i32 @preallocated(i32* %p) %rv = load i32, i32* %p