diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp index caf4f61d027db..34c0201bb0dbe 100644 --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -376,8 +376,8 @@ void PEI::calculateCallFrameInfo(MachineFunction &MF) { } assert(!MFI.isMaxCallFrameSizeComputed() || - (MFI.getMaxCallFrameSize() == MaxCallFrameSize && - MFI.adjustsStack() == AdjustsStack)); + (MFI.getMaxCallFrameSize() >= MaxCallFrameSize && + !(AdjustsStack && !MFI.adjustsStack()))); MFI.setAdjustsStack(AdjustsStack); MFI.setMaxCallFrameSize(MaxCallFrameSize); diff --git a/llvm/test/CodeGen/AArch64/compute-call-frame-size-unreachable-pass.ll b/llvm/test/CodeGen/AArch64/compute-call-frame-size-unreachable-pass.ll new file mode 100644 index 0000000000000..6e2bc6e856008 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/compute-call-frame-size-unreachable-pass.ll @@ -0,0 +1,26 @@ +; RUN: llc < %s -mtriple aarch64-- + +; This tests that the MFI assert in unreachableblockelim pass +; does not trigger + +%struct.ngtcp2_crypto_aead = type { i8*, i64 } +%struct.ngtcp2_crypto_aead_ctx = type { i8* } + +; Function Attrs: noinline optnone +define internal fastcc void @decrypt_pkt() unnamed_addr #0 !type !0 !type !1 { +entry: + br i1 false, label %cont, label %trap, !nosanitize !2 + +trap: ; preds = %entry + unreachable, !nosanitize !2 + +cont: ; preds = %entry + %call = call i32 undef(i8* undef, %struct.ngtcp2_crypto_aead* undef, %struct.ngtcp2_crypto_aead_ctx* undef, i8* undef, i64 undef, i8* undef, i64 undef, i8* undef, i64 undef) + ret void +} + +attributes #0 = { noinline optnone } + +!0 = !{i64 0, !"_ZTSFlPhPK18ngtcp2_crypto_aeadPKhmS4_mlP16ngtcp2_crypto_kmPFiS_S2_PK22ngtcp2_crypto_aead_ctxS4_mS4_mS4_mEE"} +!1 = !{i64 0, !"_ZTSFlPvPKvS1_mS1_mlS_S_E.generalized"} +!2 = !{}