diff --git a/llvm/lib/CodeGen/PrologEpilogInserter.cpp b/llvm/lib/CodeGen/PrologEpilogInserter.cpp --- a/llvm/lib/CodeGen/PrologEpilogInserter.cpp +++ b/llvm/lib/CodeGen/PrologEpilogInserter.cpp @@ -376,7 +376,7 @@ } assert(!MFI.isMaxCallFrameSizeComputed() || - (MFI.getMaxCallFrameSize() == MaxCallFrameSize && + (MFI.getMaxCallFrameSize() >= MaxCallFrameSize && MFI.adjustsStack() == 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 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/compute-call-frame-size-unreachable-pass.ll @@ -0,0 +1,29 @@ +; RUN: llc < %s + +; This tests that the unreachableblockelim pass computes the size +; of the call frame before exiting + +target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128" +target triple = "aarch64-none-linux-android21" + +%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 = !{}