
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>
29 lines
994 B
LLVM
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 }
|