Commit 2ebf064c authored by Chandler Carruth's avatar Chandler Carruth
Browse files

Merge r322521 - just regenerates the CHECK lines using the script. Will allow

subsequent cherrypicks to be much cleaner.

llvm-svn: 332928
parent 74d8a849
Loading
Loading
Loading
Loading
+249 −127
Original line number Diff line number Diff line
; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s --check-prefix=CHECK --check-prefix=PUSHF
; RUN: llc < %s -mtriple=x86_64-pc-win32 -mattr=+sahf | FileCheck %s --check-prefix=SAHF
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=x86_64-pc-win32              | FileCheck %s --check-prefix=ALL --check-prefix=PUSHF
; RUN: llc < %s -mtriple=x86_64-pc-win32 -mattr=+sahf | FileCheck %s --check-prefix=ALL --check-prefix=SAHF

define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f1:
  ; CHECK:       movl    48(%rbp), %eax
; ALL-LABEL: f1:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    movq %rsp, %rbp
; ALL-NEXT:    .seh_setframe 5, 0
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    movl 48(%rbp), %eax
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  ret i32 %p5
}

define void @f2(i32 %p, ...) "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f2:
  ; CHECK:      .seh_stackalloc 8
  ; CHECK:      movq    %rsp, %rbp
  ; CHECK:      .seh_setframe 5, 0
  ; CHECK:      movq    %rdx, 32(%rbp)
  ; CHECK:      leaq    32(%rbp), %rax
; ALL-LABEL: f2:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    pushq %rax
; ALL-NEXT:    .seh_stackalloc 8
; ALL-NEXT:    movq %rsp, %rbp
; ALL-NEXT:    .seh_setframe 5, 0
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    movq %r9, 48(%rbp)
; ALL-NEXT:    movq %r8, 40(%rbp)
; ALL-NEXT:    movq %rdx, 32(%rbp)
; ALL-NEXT:    leaq 32(%rbp), %rax
; ALL-NEXT:    movq %rax, (%rbp)
; ALL-NEXT:    addq $8, %rsp
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %ap = alloca i8, align 8
  call void @llvm.va_start(i8* %ap)
  ret void
}

define i8* @f3() "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f3:
  ; CHECK:      movq    %rsp, %rbp
  ; CHECK:      .seh_setframe 5, 0
  ; CHECK:      movq    8(%rbp), %rax
; ALL-LABEL: f3:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    movq %rsp, %rbp
; ALL-NEXT:    .seh_setframe 5, 0
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    movq 8(%rbp), %rax
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %ra = call i8* @llvm.returnaddress(i32 0)
  ret i8* %ra
}

define i8* @f4() "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f4:
  ; CHECK:      pushq   %rbp
  ; CHECK:      .seh_pushreg 5
  ; CHECK:      subq    $304, %rsp
  ; CHECK:      .seh_stackalloc 304
  ; CHECK:      leaq    128(%rsp), %rbp
  ; CHECK:      .seh_setframe 5, 128
  ; CHECK:      .seh_endprologue
  ; CHECK:      movq    184(%rbp), %rax
; ALL-LABEL: f4:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    subq $304, %rsp # imm = 0x130
; ALL-NEXT:    .seh_stackalloc 304
; ALL-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; ALL-NEXT:    .seh_setframe 5, 128
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    movq 184(%rbp), %rax
; ALL-NEXT:    addq $304, %rsp # imm = 0x130
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  alloca [300 x i8]
  %ra = call i8* @llvm.returnaddress(i32 0)
  ret i8* %ra
@@ -46,13 +88,24 @@ define i8* @f4() "no-frame-pointer-elim"="true" {
declare void @external(i8*)

define void @f5() "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f5:
  ; CHECK:      subq    $336, %rsp
  ; CHECK:      .seh_stackalloc 336
  ; CHECK:      leaq    128(%rsp), %rbp
  ; CHECK:      .seh_setframe 5, 128
  ; CHECK:      leaq    -92(%rbp), %rcx
  ; CHECK:      callq   external
; ALL-LABEL: f5:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    subq $336, %rsp # imm = 0x150
; ALL-NEXT:    .seh_stackalloc 336
; ALL-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; ALL-NEXT:    .seh_setframe 5, 128
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    leaq -92(%rbp), %rcx
; ALL-NEXT:    callq external
; ALL-NEXT:    nop
; ALL-NEXT:    addq $336, %rsp # imm = 0x150
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %a = alloca [300 x i8]
  %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
  call void @external(i8* %gep)
@@ -60,13 +113,24 @@ define void @f5() "no-frame-pointer-elim"="true" {
}

define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f6:
  ; CHECK:      subq    $336, %rsp
  ; CHECK:      .seh_stackalloc 336
  ; CHECK:      leaq    128(%rsp), %rbp
  ; CHECK:      .seh_setframe 5, 128
  ; CHECK:      leaq    -92(%rbp), %rcx
  ; CHECK:      callq   external
; ALL-LABEL: f6:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    subq $336, %rsp # imm = 0x150
; ALL-NEXT:    .seh_stackalloc 336
; ALL-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; ALL-NEXT:    .seh_setframe 5, 128
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    leaq -92(%rbp), %rcx
; ALL-NEXT:    callq external
; ALL-NEXT:    nop
; ALL-NEXT:    addq $336, %rsp # imm = 0x150
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %a = alloca [300 x i8]
  %gep = getelementptr [300 x i8], [300 x i8]* %a, i32 0, i32 0
  call void @external(i8* %gep)
@@ -74,130 +138,189 @@ define void @f6(i32 %p, ...) "no-frame-pointer-elim"="true" {
}

define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f7:
  ; CHECK:      pushq   %rbp
  ; CHECK:      .seh_pushreg 5
  ; CHECK:      subq    $304, %rsp
  ; CHECK:      .seh_stackalloc 304
  ; CHECK:      leaq    128(%rsp), %rbp
  ; CHECK:      .seh_setframe 5, 128
  ; CHECK:      andq    $-64, %rsp
  ; CHECK:      movl    224(%rbp), %eax
  ; CHECK:      leaq    176(%rbp), %rsp
; ALL-LABEL: f7:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    subq $304, %rsp # imm = 0x130
; ALL-NEXT:    .seh_stackalloc 304
; ALL-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; ALL-NEXT:    .seh_setframe 5, 128
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    andq $-64, %rsp
; ALL-NEXT:    movl 224(%rbp), %eax
; ALL-NEXT:    leaq 176(%rbp), %rsp
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  alloca [300 x i8], align 64
  ret i32 %e
}

define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f8:
  ; CHECK:        subq    $352, %rsp
  ; CHECK:        .seh_stackalloc 352
  ; CHECK:        leaq    128(%rsp), %rbp
  ; CHECK:        .seh_setframe 5, 128

; ALL-LABEL: f8:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    pushq %rsi
; ALL-NEXT:    .seh_pushreg 6
; ALL-NEXT:    pushq %rbx
; ALL-NEXT:    .seh_pushreg 3
; ALL-NEXT:    subq $352, %rsp # imm = 0x160
; ALL-NEXT:    .seh_stackalloc 352
; ALL-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; ALL-NEXT:    .seh_setframe 5, 128
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    andq $-64, %rsp
; ALL-NEXT:    movq %rsp, %rbx
; ALL-NEXT:    movl 288(%rbp), %esi
; ALL-NEXT:    movl %ecx, %eax
; ALL-NEXT:    leaq 15(,%rax,4), %rcx
; ALL-NEXT:    movabsq $34359738352, %rax # imm = 0x7FFFFFFF0
; ALL-NEXT:    andq %rcx, %rax
; ALL-NEXT:    callq __chkstk
; ALL-NEXT:    subq %rax, %rsp
; ALL-NEXT:    subq $32, %rsp
; ALL-NEXT:    movq %rbx, %rcx
; ALL-NEXT:    callq external
; ALL-NEXT:    addq $32, %rsp
; ALL-NEXT:    movl %esi, %eax
; ALL-NEXT:    leaq 224(%rbp), %rsp
; ALL-NEXT:    popq %rbx
; ALL-NEXT:    popq %rsi
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %alloca = alloca [300 x i8], align 64
  ; CHECK:        andq    $-64, %rsp
  ; CHECK:        movq    %rsp, %rbx

  alloca i32, i32 %a
  ; CHECK:        movl    %ecx, %eax
  ; CHECK:        leaq    15(,%rax,4), %rcx
  ; CHECK:        movabsq $34359738352, %rax
  ; CHECK:        andq    %rcx, %rax
  ; CHECK:        callq   __chkstk
  ; CHECK:        subq    %rax, %rsp

  %gep = getelementptr [300 x i8], [300 x i8]* %alloca, i32 0, i32 0
  call void @external(i8* %gep)
  ; CHECK:        subq    $32, %rsp
  ; CHECK:        movq    %rbx, %rcx
  ; CHECK:        callq   external
  ; CHECK:        addq    $32, %rsp

  ret i32 %e
  ; CHECK:        movl    %esi, %eax
  ; CHECK:        leaq    224(%rbp), %rsp
}

define i64 @f9() {
; ALL-LABEL: f9:
; ALL:       # %bb.0: # %entry
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    movq %rsp, %rbp
; ALL-NEXT:    .seh_setframe 5, 0
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    pushfq
; ALL-NEXT:    popq %rax
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
entry:
  ; CHECK-LABEL: f9:
  ; CHECK:      pushq   %rbp
  ; CHECK:      .seh_pushreg 5
  ; CHECK-NEXT: movq    %rsp, %rbp
  ; CHECK:      .seh_setframe 5, 0
  ; CHECK:      .seh_endprologue

  %call = call i64 @llvm.x86.flags.read.u64()
  ; CHECK-NEXT: pushfq
  ; CHECK-NEXT: popq    %rax

  ret i64 %call
  ; CHECK-NEXT: popq    %rbp
  ; CHECK-NEXT: retq
}

declare i64 @dummy()

define i64 @f10(i64* %foo, i64 %bar, i64 %baz) {
  ; CHECK-LABEL: f10:
  ; CHECK:      pushq   %rbp
  ; CHECK:      .seh_pushreg 5
  ; CHECK:      pushq   %rsi
  ; CHECK:      .seh_pushreg 6
  ; CHECK:      pushq   %rdi
  ; CHECK:      .seh_pushreg 7
  ; CHECK:      subq    $32, %rsp
  ; CHECK:      .seh_stackalloc 32
  ; CHECK:      leaq    32(%rsp), %rbp
  ; CHECK:      .seh_setframe 5, 32
  ; CHECK:      .seh_endprologue

  %cx = cmpxchg i64* %foo, i64 %bar, i64 %baz seq_cst seq_cst
  ; PUSHF:      lock cmpxchgq
; PUSHF-LABEL: f10:
; PUSHF:       # %bb.0:
; PUSHF-NEXT:    pushq %rbp
; PUSHF-NEXT:    .seh_pushreg 5
; PUSHF-NEXT:    pushq %rsi
; PUSHF-NEXT:    .seh_pushreg 6
; PUSHF-NEXT:    pushq %rdi
; PUSHF-NEXT:    .seh_pushreg 7
; PUSHF-NEXT:    subq $32, %rsp
; PUSHF-NEXT:    .seh_stackalloc 32
; PUSHF-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; PUSHF-NEXT:    .seh_setframe 5, 32
; PUSHF-NEXT:    .seh_endprologue
; PUSHF-NEXT:    movq %rdx, %rsi
; PUSHF-NEXT:    movq %rsi, %rax
; PUSHF-NEXT:    lock cmpxchgq %r8, (%rcx)
; PUSHF-NEXT:    pushfq
  ; PUSHF-NEXT: popq %[[REG:.*]]
  ; SAHF:       lock cmpxchgq
; PUSHF-NEXT:    popq %rdi
; PUSHF-NEXT:    callq dummy
; PUSHF-NEXT:    pushq %rdi
; PUSHF-NEXT:    popfq
; PUSHF-NEXT:    cmovneq %rsi, %rax
; PUSHF-NEXT:    addq $32, %rsp
; PUSHF-NEXT:    popq %rdi
; PUSHF-NEXT:    popq %rsi
; PUSHF-NEXT:    popq %rbp
; PUSHF-NEXT:    retq
; PUSHF-NEXT:    .seh_handlerdata
; PUSHF-NEXT:    .text
; PUSHF-NEXT:    .seh_endproc
;
; SAHF-LABEL: f10:
; SAHF:       # %bb.0:
; SAHF-NEXT:    pushq %rbp
; SAHF-NEXT:    .seh_pushreg 5
; SAHF-NEXT:    pushq %rsi
; SAHF-NEXT:    .seh_pushreg 6
; SAHF-NEXT:    pushq %rdi
; SAHF-NEXT:    .seh_pushreg 7
; SAHF-NEXT:    subq $32, %rsp
; SAHF-NEXT:    .seh_stackalloc 32
; SAHF-NEXT:    leaq {{[0-9]+}}(%rsp), %rbp
; SAHF-NEXT:    .seh_setframe 5, 32
; SAHF-NEXT:    .seh_endprologue
; SAHF-NEXT:    movq %rdx, %rsi
; SAHF-NEXT:    movq %rsi, %rax
; SAHF-NEXT:    lock cmpxchgq %r8, (%rcx)
; SAHF-NEXT:    seto %al
; SAHF-NEXT:    lahf

; SAHF-NEXT:    movq %rax, %rdi
; SAHF-NEXT:    callq dummy
; SAHF-NEXT:    pushq %rax
; SAHF-NEXT:    movq %rdi, %rax
; SAHF-NEXT:    addb $127, %al
; SAHF-NEXT:    sahf
; SAHF-NEXT:    popq %rax
; SAHF-NEXT:    cmovneq %rsi, %rax
; SAHF-NEXT:    addq $32, %rsp
; SAHF-NEXT:    popq %rdi
; SAHF-NEXT:    popq %rsi
; SAHF-NEXT:    popq %rbp
; SAHF-NEXT:    retq
; SAHF-NEXT:    .seh_handlerdata
; SAHF-NEXT:    .text
; SAHF-NEXT:    .seh_endproc
  %cx = cmpxchg i64* %foo, i64 %bar, i64 %baz seq_cst seq_cst
  %v = extractvalue { i64, i1 } %cx, 0
  %p = extractvalue { i64, i1 } %cx, 1

  %call = call i64 @dummy()
  ; PUSHF:      callq dummy
  ; PUSHF-NEXT: pushq %[[REG]]
  ; PUSHF-NEXT: popfq
  ; SAHF:       callq dummy
  ; SAHF-NEXT:  pushq
  ; SAHF:       addb $127, %al
  ; SAHF-NEXT:  sahf
  ; SAHF-NEXT:  popq

  %sel = select i1 %p, i64 %call, i64 %bar
  ; CHECK-NEXT: cmovneq

  ret i64 %sel
  ; CHECK-NEXT: addq    $32, %rsp
  ; CHECK-NEXT: popq    %rdi
  ; CHECK-NEXT: popq    %rsi
  ; CHECK-NEXT: popq    %rbp
}

define i8* @f11() "no-frame-pointer-elim"="true" {
  ; CHECK-LABEL: f11:
  ; CHECK:      pushq   %rbp
  ; CHECK:      movq    %rsp, %rbp
  ; CHECK:      .seh_setframe 5, 0
  ; CHECK:      leaq    8(%rbp), %rax
; ALL-LABEL: f11:
; ALL:       # %bb.0:
; ALL-NEXT:    pushq %rbp
; ALL-NEXT:    .seh_pushreg 5
; ALL-NEXT:    movq %rsp, %rbp
; ALL-NEXT:    .seh_setframe 5, 0
; ALL-NEXT:    .seh_endprologue
; ALL-NEXT:    leaq 8(%rbp), %rax
; ALL-NEXT:    popq %rbp
; ALL-NEXT:    retq
; ALL-NEXT:    .seh_handlerdata
; ALL-NEXT:    .text
; ALL-NEXT:    .seh_endproc
  %aora = call i8* @llvm.addressofreturnaddress()
  ret i8* %aora
}

define i8* @f12() {
  ; CHECK-LABEL: f12:
  ; CHECK-NOT:  push
  ; CHECK:      movq    %rsp, %rax
; ALL-LABEL: f12:
; ALL:       # %bb.0:
; ALL-NEXT:    movq %rsp, %rax
; ALL-NEXT:    retq
  %aora = call i8* @llvm.addressofreturnaddress()
  ret i8* %aora
}
@@ -205,5 +328,4 @@ define i8* @f12() {
declare i8* @llvm.returnaddress(i32) nounwind readnone
declare i8* @llvm.addressofreturnaddress() nounwind readnone
declare i64 @llvm.x86.flags.read.u64()

declare void @llvm.va_start(i8*) nounwind