Nemanja Ivanovic 227607190e
[RISCV] Fix crash in PEI with empty entry block with Zcmp (#72117)
We check the opcode of the first instruction in the block where the
prologue is inserted without checking if the iterator points to any
instructions. When the basic block is empty, that causes a crash. One
way the prologue block can be empty is when it starts with a call to
__builtin_readcyclecounter on RV32 since that produces a loop.

Co-authored-by: Nemanja Ivanovic <nemanja@synopsys.com>
2023-11-17 16:18:44 +01:00

29 lines
994 B
LLVM

; 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 }