; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
;; Check that we accept functions with '$' in the name.
; RUN: llc -mtriple=x86_64 < %s | FileCheck %s
;; Check that we accept .Ldsolocal$local: below the function label.
; RUN: llc -mtriple=x86_64 -relocation-model=pic < %s | FileCheck %s --check-prefix=PIC
;; Check that we accept .seh_proc below the function label.
; RUN: llc -mtriple=x86_64-windows -relocation-model=pic < %s | FileCheck %s --check-prefix=WIN
@gv0 = dso_local global i32 0, align 4
@gv1 = dso_preemptable global i32 0, align 4
define hidden i32 @"_Z54bar$ompvariant$bar"() {
; CHECK-LABEL: _Z54bar$ompvariant$bar:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl $2, %eax
; CHECK-NEXT: retq
;
; PIC-LABEL: _Z54bar$ompvariant$bar:
; PIC: # %bb.0: # %entry
; PIC-NEXT: movl $2, %eax
; PIC-NEXT: retq
;
; WIN-LABEL: _Z54bar$ompvariant$bar:
; WIN: # %bb.0: # %entry
; WIN-NEXT: movl $2, %eax
; WIN-NEXT: retq
entry:
ret i32 2
}
define dso_local i32 @dsolocal() {
; CHECK-LABEL: dsolocal:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushq %rax
; CHECK-NEXT: .cfi_def_cfa_offset 16
; CHECK-NEXT: callq ext@PLT
; CHECK-NEXT: movl $2, %eax
; CHECK-NEXT: popq %rcx
; CHECK-NEXT: .cfi_def_cfa_offset 8
; CHECK-NEXT: retq
;
; PIC-LABEL: dsolocal:
; PIC: # %bb.0: # %entry
; PIC-NEXT: pushq %rax
; PIC-NEXT: .cfi_def_cfa_offset 16
; PIC-NEXT: callq ext@PLT
; PIC-NEXT: movl $2, %eax
; PIC-NEXT: popq %rcx
; PIC-NEXT: .cfi_def_cfa_offset 8
; PIC-NEXT: retq
;
; WIN-LABEL: dsolocal:
; WIN: # %bb.0: # %entry
; WIN-NEXT: subq $40, %rsp
; WIN-NEXT: .seh_stackalloc 40
; WIN-NEXT: .seh_endprologue
; WIN-NEXT: callq ext
; WIN-NEXT: movl $2, %eax
; WIN-NEXT: addq $40, %rsp
; WIN-NEXT: retq
; WIN-NEXT: .seh_endproc
entry:
call void @ext()
ret i32 2
}
declare void @ext()
define i32 @load() {
; CHECK-LABEL: load:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: movl gv0(%rip), %eax
; CHECK-NEXT: movq gv1@GOTPCREL(%rip), %rcx
; CHECK-NEXT: addl (%rcx), %eax
; CHECK-NEXT: retq
;
; PIC-LABEL: load:
; PIC: # %bb.0: # %entry
; PIC-NEXT: movl .Lgv0$local(%rip), %eax
; PIC-NEXT: movq gv1@GOTPCREL(%rip), %rcx
; PIC-NEXT: addl (%rcx), %eax
; PIC-NEXT: retq
;
; WIN-LABEL: load:
; WIN: # %bb.0: # %entry
; WIN-NEXT: movl gv0(%rip), %eax
; WIN-NEXT: addl gv1(%rip), %eax
; WIN-NEXT: retq
entry:
%a = load i32, i32* @gv0
%b = load i32, i32* @gv1
%c = add i32 %a, %b
ret i32 %c
}
declare i32 @pers(...)
define i32 @eh() personality ptr @pers {
; CHECK-LABEL: eh:
; CHECK: # %bb.0:
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: retq
;
; PIC-LABEL: eh:
; PIC: # %bb.0:
; PIC-NEXT: xorl %eax, %eax
; PIC-NEXT: retq
;
; WIN-LABEL: eh:
; WIN: # %bb.0:
; WIN-NEXT: xorl %eax, %eax
; WIN-NEXT: retq
; WIN-NEXT: .Lfunc_end0:
; WIN-NEXT: .seh_handlerdata
; WIN-NEXT: .text
; WIN-NEXT: .seh_endproc
ret i32 0
}