llvm/llvm/test/CodeGen/AMDGPU/optimize-exec-mask-pre-ra-non-empty-but-used-interval.mir

# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=si-optimize-exec-masking-pre-ra,greedy -verify-machineinstrs -o - %s

# This sample can trigger a "Non-empty but used interval" assert in regalloc if
# SIOptimizeExecMaskingPreRA does not update live intervals correctly.

---
name:            foo
tracksRegLiveness: true
body:             |
  bb.0:
    %0:sreg_32 = IMPLICIT_DEF
    %1:sreg_32_xm0_xexec = IMPLICIT_DEF
    %2:sreg_64_xexec = IMPLICIT_DEF
    %3:sgpr_32 = IMPLICIT_DEF
    %4:sreg_32_xexec_hi = IMPLICIT_DEF
    %5:sreg_32 = IMPLICIT_DEF
    %6:sreg_32 = IMPLICIT_DEF
    %7:sreg_32 = IMPLICIT_DEF
    %8:sreg_32 = IMPLICIT_DEF
    %9:sreg_32 = IMPLICIT_DEF
    %10:sreg_32 = IMPLICIT_DEF
    %11:sreg_32 = IMPLICIT_DEF
    %12:sreg_64_xexec = IMPLICIT_DEF
    %13:sreg_64_xexec = IMPLICIT_DEF
    %14:sreg_32 = IMPLICIT_DEF
    %15:sreg_32 = IMPLICIT_DEF
    %16:sreg_32 = IMPLICIT_DEF
    %17:sreg_32 = IMPLICIT_DEF
    %18:sgpr_32 = IMPLICIT_DEF
    $exec_lo = S_MOV_B32_term undef %9
    S_BRANCH %bb.2

  bb.1:
    $exec_lo = S_XOR_B32_term $exec_lo, undef %10, implicit-def $scc
    S_CBRANCH_EXECZ %bb.39, implicit $exec
    S_BRANCH %bb.32

  bb.2:
    S_CMP_EQ_U32 %15, undef %15, implicit-def $scc
    %19:sreg_32_xm0_xexec = S_CSELECT_B32 -1, 0, implicit killed undef $scc
    %20:sreg_32 = IMPLICIT_DEF
    $vcc_lo = COPY undef %20
    S_CBRANCH_VCCNZ %bb.3, implicit $vcc
    S_BRANCH %bb.3

  bb.3:
    $vcc_lo = S_AND_B32 $exec_lo, undef %19, implicit-def dead $scc
    S_CBRANCH_VCCNZ %bb.6, implicit $vcc
    S_BRANCH %bb.4

  bb.4:
    %21:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %19, implicit $exec
    %22:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 1, undef %21, implicit $exec
    $vcc_lo = S_AND_B32 $exec_lo, undef %22, implicit-def dead $scc
    S_CBRANCH_VCCNZ %bb.7, implicit $vcc
    S_BRANCH %bb.5

  bb.5:
    S_BRANCH %bb.7

  bb.6:
    $vcc_lo = COPY %20
    %18:sgpr_32 = COPY %18
    S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
    S_BRANCH %bb.2

  bb.7:
    %23:sreg_32 = S_AND_B32 undef %20, %9, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %23
    S_CBRANCH_EXECZ %bb.10, implicit $exec
    S_BRANCH %bb.9

  bb.8:
    %24:vgpr_32 = GLOBAL_LOAD_DWORD_SADDR %13, undef %21, 0, 0, implicit $exec
    S_BRANCH %bb.28

  bb.9:
    S_BRANCH %bb.11

  bb.10:
    $exec_lo = S_XOR_B32_term $exec_lo, %23, implicit-def $scc
    S_CBRANCH_EXECZ %bb.31, implicit $exec
    S_BRANCH %bb.8

  bb.11:
    %25:vgpr_32 = GLOBAL_LOAD_DWORD_SADDR %2, undef %21, 0, 0, implicit $exec
    $exec_lo = S_MOV_B32_term undef %23
    S_CBRANCH_EXECZ %bb.12, implicit $exec
    S_BRANCH %bb.14

  bb.12:
    $exec_lo = S_XOR_B32_term $exec_lo, undef %23, implicit-def $scc
    S_CBRANCH_EXECZ %bb.15, implicit $exec
    S_BRANCH %bb.13

  bb.13:
    $exec_lo = S_MOV_B32_term undef %23
    S_CBRANCH_EXECZ %bb.15, implicit $exec
    S_BRANCH %bb.15

  bb.14:
    %26:vgpr_32 = V_BFI_B32_e64 2147483647, %3, undef %25, implicit $exec
    %27:vgpr_32 = V_CNDMASK_B32_e64 0, undef %26, 0, 2143289344, %1, implicit $exec
    dead %28:vgpr_32, %29:sreg_32_xm0_xexec = V_ADD_CO_U32_e64 %12.sub0, undef %27, 0, implicit $exec
    %30:vgpr_32, dead %31:sreg_32_xm0_xexec = V_ADDC_U32_e64 %12.sub1, undef %27, undef %22, 0, implicit $exec
    SCRATCH_STORE_DWORD_SADDR undef %27, %4, 0, 0, implicit $exec, implicit $flat_scr
    S_BRANCH %bb.12

  bb.15:
    %32:sreg_32 = IMPLICIT_DEF
    $exec_lo = S_MOV_B32_term undef %32
    S_CBRANCH_EXECZ %bb.17, implicit $exec
    S_BRANCH %bb.16

  bb.16:
    %33:sreg_32 = S_AND_B32 undef %32, %16, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %33
    S_CBRANCH_EXECZ %bb.17, implicit $exec
    S_BRANCH %bb.17

  bb.17:
    $exec_lo = S_XOR_B32_term $exec_lo, undef %32, implicit-def $scc
    S_CBRANCH_EXECZ %bb.30, implicit $exec
    S_BRANCH %bb.18

  bb.18:
    %34:sreg_32 = IMPLICIT_DEF
    %35:sreg_32 = S_AND_B32 undef %34, %17, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %35
    S_CBRANCH_EXECZ %bb.20, implicit $exec
    S_BRANCH %bb.19

  bb.19:
    dead %36:vgpr_32, $sgpr_null = V_ADD_CO_U32_e64 %14, undef %25, 0, implicit $exec
    %37:sreg_32 = IMPLICIT_DEF
    S_BRANCH %bb.21

  bb.20:
    $exec_lo = S_OR_B32 $exec_lo, %34, implicit-def $scc
    S_BRANCH %bb.30

  bb.21:
    %38:sreg_32 = IMPLICIT_DEF
    $exec_lo = S_MOV_B32_term undef %38
    S_CBRANCH_EXECZ %bb.23, implicit $exec
    S_BRANCH %bb.22

  bb.22:
    S_BRANCH %bb.24

  bb.23:
    S_BRANCH %bb.26

  bb.24:
    %39:sreg_32 = S_AND_B32 undef %38, %11, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %39
    S_CBRANCH_EXECZ %bb.38, implicit $exec
    S_BRANCH %bb.25

  bb.25:
    %40:sreg_32 = S_AND_B32 %5, $exec_lo, implicit-def dead $scc
    S_BRANCH %bb.38

  bb.26:
    %37:sreg_32 = S_OR_B32 %38, %37, implicit-def $scc
    $exec_lo = S_ANDN2_B32_term $exec_lo, undef %37, implicit-def $scc
    S_CBRANCH_EXECNZ %bb.21, implicit $exec
    S_BRANCH %bb.27

  bb.27:
    %41:sreg_32 = S_OR_B32 undef %37, %35, implicit-def $scc
    $exec_lo = S_ANDN2_B32_term $exec_lo, undef %35, implicit-def $scc
    S_CBRANCH_EXECNZ %bb.21, implicit $exec
    S_BRANCH %bb.20

  bb.28:
    $vcc_lo = S_AND_B32 $exec_lo, %22, implicit-def dead $scc
    S_CBRANCH_VCCNZ %bb.29, implicit $vcc
    S_BRANCH %bb.29

  bb.29:
    $exec_lo = S_ANDN2_B32_term $exec_lo, undef %23, implicit-def $scc
    S_CBRANCH_EXECNZ %bb.28, implicit $exec
    S_BRANCH %bb.31

  bb.30:
    $exec_lo = S_OR_B32 $exec_lo, %32, implicit-def $scc
    S_BRANCH %bb.10

  bb.31:
    %42:sreg_32_xm0_xexec = V_CMP_NE_U32_e64 undef %23, %21, implicit $exec
    $vcc_lo = S_AND_B32 $exec_lo, undef %42, implicit-def dead $scc
    S_CBRANCH_VCCZ %bb.6, implicit killed $vcc

  bb.32:
    %43:sreg_32 = S_AND_B32 %10, %8, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %43
    S_CBRANCH_EXECZ %bb.37, implicit $exec
    S_BRANCH %bb.33

  bb.33:
    %44:sreg_32 = S_AND_B32 undef %43, %0, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %44
    S_CBRANCH_EXECZ %bb.37, implicit $exec
    S_BRANCH %bb.34

  bb.34:
    %45:sreg_32 = S_AND_B32 undef %44, %6, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %45
    S_CBRANCH_EXECZ %bb.37, implicit $exec
    S_BRANCH %bb.35

  bb.35:
    %46:sreg_32 = S_AND_B32 undef %45, %7, implicit-def dead $scc
    $exec_lo = S_MOV_B32_term undef %46
    S_CBRANCH_EXECZ %bb.36, implicit $exec
    S_BRANCH %bb.37

  bb.36:
    S_BRANCH %bb.37

  bb.37:
    dead $vcc_lo = COPY undef %47:sreg_32
    S_BRANCH %bb.39

  bb.38:
    S_BRANCH %bb.26

  bb.39:
    SI_RETURN

...