blob: 2b207e8ae9ef5c58b2b0a83cb3b1a2e172f0d04f [file] [log] [blame]
;; This test checks if CFI instructions for all callee saved registers are emitted
;; correctly with basic block sections.
; RUN: llc %s -mtriple=x86_64 -filetype=asm --basic-block-sections=all --frame-pointer=all -o - | FileCheck --check-prefix=SECTIONS_CFI %s
; SECTIONS_CFI: _Z3foob:
; SECTIONS_CFI: .cfi_offset %rbp, -16
; SECTIONS_CFI: .cfi_offset [[RA:%r.+]], -56
; SECTIONS_CFI-NEXT: .cfi_offset [[RB:%r.+]], -48
; SECTIONS_CFI-NEXT: .cfi_offset [[RC:%r.+]], -40
; SECTIONS_CFI-NEXT: .cfi_offset [[RD:%r.+]], -32
; SECTIONS_CFI-NEXT: .cfi_offset [[RE:%r.+]], -24
; SECTIONS_CFI: _Z3foob.__part.1:
; SECTIONS_CFI: .cfi_offset %rbp, -16
; SECTIONS_CFI: .cfi_offset [[RA]], -56
; SECTIONS_CFI-NEXT: .cfi_offset [[RB]], -48
; SECTIONS_CFI-NEXT: .cfi_offset [[RC]], -40
; SECTIONS_CFI-NEXT: .cfi_offset [[RD]], -32
; SECTIONS_CFI-NEXT: .cfi_offset [[RE]], -24
; SECTIONS_CFI: _Z3foob.__part.2:
; SECTIONS_CFI: .cfi_offset %rbp, -16
; SECTIONS_CFI: .cfi_offset [[RA]], -56
; SECTIONS_CFI-NEXT: .cfi_offset [[RB]], -48
; SECTIONS_CFI-NEXT: .cfi_offset [[RC]], -40
; SECTIONS_CFI-NEXT: .cfi_offset [[RD]], -32
; SECTIONS_CFI-NEXT: .cfi_offset [[RE]], -24
;; void foo(bool b) {
;; if (b) // adds a basic block
;; // clobber all callee-save registers to force them to be callee-saved and to
;; // be described by cfi_offset directives.
;; asm("nop" ::: "r12", "r13", "r14", "r15", "rbx");
;; }
define dso_local void @_Z3foob(i1 zeroext %b) {
entry:
%b.addr = alloca i8, align 1
%frombool = zext i1 %b to i8
store i8 %frombool, i8* %b.addr, align 1
%0 = load i8, i8* %b.addr, align 1
%tobool = trunc i8 %0 to i1
br i1 %tobool, label %if.then, label %if.end
if.then: ; preds = %entry
call void asm sideeffect "nop", "~{r12},~{r13},~{r14},~{r15},~{rbx},~{dirflag},~{fpsr},~{flags}"() #1, !srcloc !2
br label %if.end
if.end: ; preds = %if.then, %entry
ret void
}
!2 = !{i32 38}