; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s -mtriple=m68k-linux  -mcpu=M68020 --verify-machineinstrs | FileCheck %s

define internal void @select_i32(i32 %self, ptr nonnull %value) {
; CHECK-LABEL: select_i32:
; CHECK:         .cfi_startproc
; CHECK-NEXT:  ; %bb.0: ; %start
; CHECK-NEXT:    suba.l #4, %sp
; CHECK-NEXT:    .cfi_def_cfa_offset -8
; CHECK-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
; CHECK-NEXT:    cmpi.l #0, (8,%sp)
; CHECK-NEXT:    move.w %ccr, %d2
; CHECK-NEXT:    sne %d1
; CHECK-NEXT:    move.l (12,%sp), %d0
; CHECK-NEXT:    move.w %d2, %ccr
; CHECK-NEXT:    bne .LBB0_2
; CHECK-NEXT:  ; %bb.1: ; %start
; CHECK-NEXT:    and.l #255, %d1
; CHECK-NEXT:    and.l #1, %d1
; CHECK-NEXT:    cmpi.l #0, %d1
; CHECK-NEXT:    bne .LBB0_3
; CHECK-NEXT:  .LBB0_2: ; %null
; CHECK-NEXT:    suba.l %a0, %a0
; CHECK-NEXT:    move.l %d0, (%a0)
; CHECK-NEXT:  .LBB0_3: ; %exit
; CHECK-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
; CHECK-NEXT:    adda.l #4, %sp
; CHECK-NEXT:    rts
start:
  %2 = icmp eq i32 %self, 0
  %3 = select i1 %2, i32 0, i32 1
  switch i32 %3, label %exit [
    i32 0, label %nonnull
    i32 1, label %null
  ]

nonnull:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

null:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

exit:                                              ; preds = %nonnull, %null
  ret void
}

define internal void @select_i16(i16 %self, ptr nonnull %value) {
; CHECK-LABEL: select_i16:
; CHECK:         .cfi_startproc
; CHECK-NEXT:  ; %bb.0: ; %start
; CHECK-NEXT:    suba.l #4, %sp
; CHECK-NEXT:    .cfi_def_cfa_offset -8
; CHECK-NEXT:    movem.l %d2, (0,%sp) ; 8-byte Folded Spill
; CHECK-NEXT:    cmpi.w #0, (10,%sp)
; CHECK-NEXT:    move.w %ccr, %d2
; CHECK-NEXT:    sne %d1
; CHECK-NEXT:    move.l (12,%sp), %d0
; CHECK-NEXT:    move.w %d2, %ccr
; CHECK-NEXT:    bne .LBB1_2
; CHECK-NEXT:  ; %bb.1: ; %start
; CHECK-NEXT:    and.l #255, %d1
; CHECK-NEXT:    and.w #1, %d1
; CHECK-NEXT:    cmpi.w #0, %d1
; CHECK-NEXT:    bne .LBB1_3
; CHECK-NEXT:  .LBB1_2: ; %null
; CHECK-NEXT:    suba.l %a0, %a0
; CHECK-NEXT:    move.l %d0, (%a0)
; CHECK-NEXT:  .LBB1_3: ; %exit
; CHECK-NEXT:    movem.l (0,%sp), %d2 ; 8-byte Folded Reload
; CHECK-NEXT:    adda.l #4, %sp
; CHECK-NEXT:    rts
start:
  %2 = icmp eq i16 %self, 0
  %3 = select i1 %2, i16 0, i16 1
  switch i16 %3, label %exit [
    i16 0, label %nonnull
    i16 1, label %null
  ]

nonnull:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

null:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

exit:                                              ; preds = %nonnull, %null
  ret void
}

define internal void @select_i8(i8 %self, ptr nonnull %value) {
; CHECK-LABEL: select_i8:
; CHECK:         .cfi_startproc
; CHECK-NEXT:  ; %bb.0: ; %start
; CHECK-NEXT:     suba.l #4, %sp
; CHECK-NEXT:   .cfi_def_cfa_offset -8
; CHECK-NEXT:   movem.l %d2, (0,%sp)                    ; 8-byte Folded Spill
; CHECK-NEXT:   cmpi.b #0, (11,%sp)
; CHECK-NEXT:   move.w %ccr, %d2
; CHECK-NEXT:   sne %d1
; CHECK-NEXT:   move.l (12,%sp), %d0
; CHECK-NEXT:   move.w %d2, %ccr
; CHECK-NEXT:   bne .LBB2_2
; CHECK-NEXT:   ; %bb.1:                                ; %start
; CHECK-NEXT:   and.b #1, %d1
; CHECK-NEXT:   cmpi.b #0, %d1
; CHECK-NEXT:   bne .LBB2_3
; CHECK-NEXT:   .LBB2_2:                                ; %null
; CHECK-NEXT:   suba.l %a0, %a0
; CHECK-NEXT:   move.l %d0, (%a0)
; CHECK-NEXT:   .LBB2_3:                                ; %exit
; CHECK-NEXT:   movem.l (0,%sp), %d2                    ; 8-byte Folded Reload
; CHECK-NEXT:   adda.l #4, %sp
; CHECK-NEXT:   rts
start:
  %2 = icmp eq i8 %self, 0
  %3 = select i1 %2, i8 0, i8 1
  switch i8 %3, label %exit [
    i8 0, label %nonnull
    i8 1, label %null
  ]

nonnull:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

null:                                              ; preds = %start
  store ptr %value, ptr null, align 2
  br label %exit

exit:                                              ; preds = %nonnull, %null
  ret void
}
