diff --git a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp index d873da7d684cf..1709ac28d3c56 100644 --- a/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVFrameLowering.cpp @@ -526,7 +526,8 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF, RealStackSize = FirstSPAdjustAmount; } - if (RVFI->isPushable(MF) && FirstFrameSetup->getOpcode() == RISCV::CM_PUSH) { + if (RVFI->isPushable(MF) && FirstFrameSetup != MBB.end() && + FirstFrameSetup->getOpcode() == RISCV::CM_PUSH) { // Use available stack adjustment in push instruction to allocate additional // stack space. uint64_t Spimm = std::min(StackSize, (uint64_t)48); diff --git a/llvm/test/CodeGen/RISCV/pei-crash.ll b/llvm/test/CodeGen/RISCV/pei-crash.ll new file mode 100644 index 0000000000000..7778f9580cf69 --- /dev/null +++ b/llvm/test/CodeGen/RISCV/pei-crash.ll @@ -0,0 +1,28 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 +; RUN: llc -O0 --frame-pointer=none -mtriple=riscv32 -mattr=+zcmp \ +; RUN: -verify-machineinstrs < %s | FileCheck %s +define dso_local i64 @a() #0 { +; CHECK-LABEL: a: +; CHECK: # %bb.0: # %entry +; CHECK-NEXT: addi sp, sp, -16 +; CHECK-NEXT: .LBB0_1: # %entry +; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 +; CHECK-NEXT: rdcycleh a0 +; CHECK-NEXT: sw a0, 8(sp) # 4-byte Folded Spill +; CHECK-NEXT: rdcycle a1 +; CHECK-NEXT: sw a1, 12(sp) # 4-byte Folded Spill +; CHECK-NEXT: rdcycleh a1 +; CHECK-NEXT: bne a0, a1, .LBB0_1 +; CHECK-NEXT: # %bb.2: # %entry +; CHECK-NEXT: lw a1, 8(sp) # 4-byte Folded Reload +; CHECK-NEXT: lw a0, 12(sp) # 4-byte Folded Reload +; CHECK-NEXT: addi sp, sp, 16 +; CHECK-NEXT: ret +entry: + %0 = call i64 @llvm.readcyclecounter() + ret i64 %0 +} + +declare i64 @llvm.readcyclecounter() #1 + +attributes #0 = { noinline nounwind optnone }