; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py

; RUN: llc < %s -mtriple=aarch64 -regalloc=basic | FileCheck %s

; Test that the register allocator behaves differently with minsize functions.

declare void @foo(i32, ptr)

define void @optsize(i32 %arg, i32 %arg1, ptr %arg2, ptr %arg3, ptr %arg4, i32 %arg5, i1 %arg6) minsize {
; CHECK-LABEL: optsize:
; CHECK:       // %bb.0: // %bb
; CHECK-NEXT:    stp x30, x23, [sp, #-48]! // 16-byte Folded Spill
; CHECK-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-NEXT:    .cfi_def_cfa_offset 48
; CHECK-NEXT:    .cfi_offset w19, -8
; CHECK-NEXT:    .cfi_offset w20, -16
; CHECK-NEXT:    .cfi_offset w21, -24
; CHECK-NEXT:    .cfi_offset w22, -32
; CHECK-NEXT:    .cfi_offset w23, -40
; CHECK-NEXT:    .cfi_offset w30, -48
; CHECK-NEXT:    mov w23, w5
; CHECK-NEXT:    mov x22, x4
; CHECK-NEXT:    mov x21, x3
; CHECK-NEXT:    mov x20, x2
; CHECK-NEXT:    mov w19, w1
; CHECK-NEXT:  .LBB0_1: // %bb8
; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    cbz w19, .LBB0_1
; CHECK-NEXT:  // %bb.2: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    cmp w19, #39
; CHECK-NEXT:    b.eq .LBB0_6
; CHECK-NEXT:  // %bb.3: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    cmp w19, #34
; CHECK-NEXT:    b.eq .LBB0_6
; CHECK-NEXT:  // %bb.4: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    cmp w19, #10
; CHECK-NEXT:    b.ne .LBB0_1
; CHECK-NEXT:  // %bb.5: // %bb9
; CHECK-NEXT:    // in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    str wzr, [x20]
; CHECK-NEXT:    b .LBB0_1
; CHECK-NEXT:  .LBB0_6: // %bb10
; CHECK-NEXT:    // in Loop: Header=BB0_1 Depth=1
; CHECK-NEXT:    mov w0, w23
; CHECK-NEXT:    mov x1, x21
; CHECK-NEXT:    str wzr, [x22]
; CHECK-NEXT:    bl foo
; CHECK-NEXT:    b .LBB0_1
bb:
  br label %bb7

bb7:                                              ; preds = %bb13, %bb
  %phi = phi i32 [ 0, %bb ], [ %spec.select, %bb13 ]
  br label %bb8

bb8:                                              ; preds = %bb10, %bb9, %bb8, %bb7
  switch i32 %arg1, label %bb8 [
    i32 10, label %bb9
    i32 1, label %bb16
    i32 0, label %bb13
    i32 39, label %bb10
    i32 34, label %bb10
  ]

bb9:                                              ; preds = %bb8
  store i32 0, ptr %arg2, align 4
  br label %bb8

bb10:                                             ; preds = %bb8, %bb8
  store i32 0, ptr %arg4, align 4
  tail call void @foo(i32 %arg5, ptr %arg3)
  br label %bb8

bb13:                                             ; preds = %bb8
  %not.arg6 = xor i1 %arg6, true
  %spec.select = zext i1 %not.arg6 to i32
  br label %bb7

bb16:                                             ; preds = %bb8
  unreachable
}

define void @optspeed(i32 %arg, i32 %arg1, ptr %arg2, ptr %arg3, ptr %arg4, i32 %arg5, i1 %arg6) {
; CHECK-LABEL: optspeed:
; CHECK:       // %bb.0: // %bb
; CHECK-NEXT:    stp x30, x23, [sp, #-48]! // 16-byte Folded Spill
; CHECK-NEXT:    stp x22, x21, [sp, #16] // 16-byte Folded Spill
; CHECK-NEXT:    stp x20, x19, [sp, #32] // 16-byte Folded Spill
; CHECK-NEXT:    .cfi_def_cfa_offset 48
; CHECK-NEXT:    .cfi_offset w19, -8
; CHECK-NEXT:    .cfi_offset w20, -16
; CHECK-NEXT:    .cfi_offset w21, -24
; CHECK-NEXT:    .cfi_offset w22, -32
; CHECK-NEXT:    .cfi_offset w23, -40
; CHECK-NEXT:    .cfi_offset w30, -48
; CHECK-NEXT:    mov w22, w5
; CHECK-NEXT:    mov x21, x4
; CHECK-NEXT:    mov x20, x3
; CHECK-NEXT:    mov x23, x2
; CHECK-NEXT:    mov w19, w1
; CHECK-NEXT:    b .LBB1_2
; CHECK-NEXT:  .LBB1_1: // %bb10
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    mov w0, w22
; CHECK-NEXT:    mov x1, x20
; CHECK-NEXT:    str wzr, [x21]
; CHECK-NEXT:    bl foo
; CHECK-NEXT:  .LBB1_2: // %bb8
; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    cmp w19, #33
; CHECK-NEXT:    b.gt .LBB1_6
; CHECK-NEXT:  // %bb.3: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    cbz w19, .LBB1_2
; CHECK-NEXT:  // %bb.4: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    cmp w19, #10
; CHECK-NEXT:    b.ne .LBB1_2
; CHECK-NEXT:  // %bb.5: // %bb9
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    str wzr, [x23]
; CHECK-NEXT:    b .LBB1_2
; CHECK-NEXT:  .LBB1_6: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    cmp w19, #34
; CHECK-NEXT:    b.eq .LBB1_1
; CHECK-NEXT:  // %bb.7: // %bb8
; CHECK-NEXT:    // in Loop: Header=BB1_2 Depth=1
; CHECK-NEXT:    cmp w19, #39
; CHECK-NEXT:    b.eq .LBB1_1
; CHECK-NEXT:    b .LBB1_2
bb:
  br label %bb7

bb7:                                              ; preds = %bb13, %bb
  %phi = phi i32 [ 0, %bb ], [ %spec.select, %bb13 ]
  br label %bb8

bb8:                                              ; preds = %bb10, %bb9, %bb8, %bb7
  switch i32 %arg1, label %bb8 [
    i32 10, label %bb9
    i32 1, label %bb16
    i32 0, label %bb13
    i32 39, label %bb10
    i32 34, label %bb10
  ]

bb9:                                              ; preds = %bb8
  store i32 0, ptr %arg2, align 4
  br label %bb8

bb10:                                             ; preds = %bb8, %bb8
  store i32 0, ptr %arg4, align 4
  tail call void @foo(i32 %arg5, ptr %arg3)
  br label %bb8

bb13:                                             ; preds = %bb8
  %not.arg6 = xor i1 %arg6, true
  %spec.select = zext i1 %not.arg6 to i32
  br label %bb7

bb16:                                             ; preds = %bb8
  unreachable
}
