[GlobalOpt] Don't remove inalloca from musttail-called functions

Otherwise the verifier complains about the mismatching function ABIs.

Differential revision: https://reviews.llvm.org/D83300
This commit is contained in:
Hans Wennborg 2020-07-07 14:51:34 +02:00
parent 642eed3713
commit 7fc279ca3d
2 changed files with 12 additions and 1 deletions

View File

@ -2442,7 +2442,7 @@ OptimizeFunctions(Module &M,
// 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;
}

View File

@ -35,6 +35,17 @@ define internal i32 @inalloca(i32* inalloca %p) {
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