Compiler projects using llvm
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
# RUN: llc -mtriple=amdgcn-mesa-mesa3d -mcpu=tahiti -run-pass=amdgpu-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s

---
name: sext_inreg_s32_7_sextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_7_sextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[SEXTLOAD]], 7
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_SEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 7
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_8_sextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_8_sextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: $vgpr0 = COPY [[SEXTLOAD]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_SEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 8
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_9_sextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_9_sextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: $vgpr0 = COPY [[SEXTLOAD]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_SEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 9
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_7_sext_from_s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_7_sext_from_s8
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[SEXTLOAD]], 7
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s8) = G_LOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT %1
    %3:_(s32) = G_SEXT_INREG %2, 7
    $vgpr0 = COPY %3

...

---
name: sext_inreg_s32_8_sext_from_s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_8_sext_from_s8
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: $vgpr0 = COPY [[SEXTLOAD]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s8) = G_LOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT %1
    %3:_(s32) = G_SEXT_INREG %2, 8
    $vgpr0 = COPY %3

...

---
name: sext_inreg_s32_8_sext_from_s9
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_8_sext_from_s9
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: $vgpr0 = COPY [[SEXTLOAD]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s8) = G_LOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT %1
    %3:_(s32) = G_SEXT_INREG %2, 9
    $vgpr0 = COPY %3

...

---
name: sext_inreg_v2s32_7_sext_from_v2s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_v2s32_7_sext_from_v2s8
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[LOAD:%[0-9]+]]:_(<2 x s8>) = G_LOAD [[COPY]](p1) :: (load (<2 x s8>), addrspace 1)
    ; GCN-NEXT: [[SEXT:%[0-9]+]]:_(<2 x s32>) = G_SEXT [[LOAD]](<2 x s8>)
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(<2 x s32>) = G_SEXT_INREG [[SEXT]], 7
    ; GCN-NEXT: $vgpr0_vgpr1 = COPY [[SEXT_INREG]](<2 x s32>)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(<2 x s8>) = G_LOAD %0 :: (load (<2 x s8>), addrspace 1)
    %2:_(<2 x s32>) = G_SEXT %1
    %3:_(<2 x s32>) = G_SEXT_INREG %2, 7
    $vgpr0_vgpr1 = COPY %3

...

---
name: sext_inreg_v2s32_8_sext_from_v2s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_v2s32_8_sext_from_v2s8
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[LOAD:%[0-9]+]]:_(<2 x s8>) = G_LOAD [[COPY]](p1) :: (load (<2 x s8>), addrspace 1)
    ; GCN-NEXT: [[SEXT:%[0-9]+]]:_(<2 x s32>) = G_SEXT [[LOAD]](<2 x s8>)
    ; GCN-NEXT: $vgpr0_vgpr1 = COPY [[SEXT]](<2 x s32>)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(<2 x s8>) = G_LOAD %0 :: (load (<2 x s8>), addrspace 1)
    %2:_(<2 x s32>) = G_SEXT %1
    %3:_(<2 x s32>) = G_SEXT_INREG %2, 8
    $vgpr0_vgpr1 = COPY %3

...

---
name: sext_inreg_v2s32_9_sext_from_v2s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_v2s32_9_sext_from_v2s8
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[LOAD:%[0-9]+]]:_(<2 x s8>) = G_LOAD [[COPY]](p1) :: (load (<2 x s8>), addrspace 1)
    ; GCN-NEXT: [[SEXT:%[0-9]+]]:_(<2 x s32>) = G_SEXT [[LOAD]](<2 x s8>)
    ; GCN-NEXT: $vgpr0_vgpr1 = COPY [[SEXT]](<2 x s32>)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(<2 x s8>) = G_LOAD %0 :: (load (<2 x s8>), addrspace 1)
    %2:_(<2 x s32>) = G_SEXT %1
    %3:_(<2 x s32>) = G_SEXT_INREG %2, 9
    $vgpr0_vgpr1 = COPY %3

...

---
name: sext_inreg_s32_7_zextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_7_zextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[ZEXTLOAD]], 7
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_ZEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 7
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_8_zextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_8_zextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[ZEXTLOAD]], 8
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_ZEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 8
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_9_zextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3

    ; GCN-LABEL: name: sext_inreg_s32_9_zextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[ZEXTLOAD:%[0-9]+]]:_(s32) = G_ZEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: $vgpr0 = COPY [[ZEXTLOAD]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(s32) = G_ZEXTLOAD %0 :: (load (s8), addrspace 1)
    %2:_(s32) = G_SEXT_INREG %1, 9
    $vgpr0 = COPY %2

...

---
name: sext_inreg_s32_select_sextload_from_1
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5

    ; GCN-LABEL: name: sext_inreg_s32_select_sextload_from_1
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[COPY1:%[0-9]+]]:_(p1) = COPY $vgpr2_vgpr3
    ; GCN-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr4
    ; GCN-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr5
    ; GCN-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[COPY3]]
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SEXTLOAD1:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY1]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[SEXTLOAD]], [[SEXTLOAD1]]
    ; GCN-NEXT: $vgpr0 = COPY [[SELECT]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(p1) = COPY $vgpr2_vgpr3
    %2:_(s32) = COPY $vgpr4
    %3:_(s32) = COPY $vgpr5
    %4:_(s1) = G_ICMP intpred(eq), %2, %3
    %5:_(s32) = G_SEXTLOAD %0 :: (load (s8), addrspace 1)
    %6:_(s32) = G_SEXTLOAD %1 :: (load (s8), addrspace 1)
    %7:_(s32) = G_SELECT %4, %5, %6
    %8:_(s32) = G_SEXT_INREG %7, 8
    $vgpr0 = COPY %8

...

---
name: sext_inreg_s32_select_sextload_from_1_fail_lhs
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5

    ; GCN-LABEL: name: sext_inreg_s32_select_sextload_from_1_fail_lhs
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[COPY1:%[0-9]+]]:_(p1) = COPY $vgpr2_vgpr3
    ; GCN-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr4
    ; GCN-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr5
    ; GCN-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[COPY3]]
    ; GCN-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY]](p1) :: (load (s32), addrspace 1)
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY1]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[LOAD]], [[SEXTLOAD]]
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[SELECT]], 8
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(p1) = COPY $vgpr2_vgpr3
    %2:_(s32) = COPY $vgpr4
    %3:_(s32) = COPY $vgpr5
    %4:_(s1) = G_ICMP intpred(eq), %2, %3
    %5:_(s32) = G_LOAD %0 :: (load (s32), addrspace 1)
    %6:_(s32) = G_SEXTLOAD %1 :: (load (s8), addrspace 1)
    %7:_(s32) = G_SELECT %4, %5, %6
    %8:_(s32) = G_SEXT_INREG %7, 8
    $vgpr0 = COPY %8

...

---
name: sext_inreg_s32_select_sextload_from_1_fail_rhs
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5

    ; GCN-LABEL: name: sext_inreg_s32_select_sextload_from_1_fail_rhs
    ; GCN: liveins: $vgpr0_vgpr1, $vgpr2_vgpr3, $vgpr4, $vgpr5
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: [[COPY:%[0-9]+]]:_(p1) = COPY $vgpr0_vgpr1
    ; GCN-NEXT: [[COPY1:%[0-9]+]]:_(p1) = COPY $vgpr2_vgpr3
    ; GCN-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr4
    ; GCN-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr5
    ; GCN-NEXT: [[ICMP:%[0-9]+]]:_(s1) = G_ICMP intpred(eq), [[COPY2]](s32), [[COPY3]]
    ; GCN-NEXT: [[SEXTLOAD:%[0-9]+]]:_(s32) = G_SEXTLOAD [[COPY]](p1) :: (load (s8), addrspace 1)
    ; GCN-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY1]](p1) :: (load (s32), addrspace 1)
    ; GCN-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[ICMP]](s1), [[SEXTLOAD]], [[LOAD]]
    ; GCN-NEXT: [[SEXT_INREG:%[0-9]+]]:_(s32) = G_SEXT_INREG [[SELECT]], 8
    ; GCN-NEXT: $vgpr0 = COPY [[SEXT_INREG]](s32)
    %0:_(p1) = COPY $vgpr0_vgpr1
    %1:_(p1) = COPY $vgpr2_vgpr3
    %2:_(s32) = COPY $vgpr4
    %3:_(s32) = COPY $vgpr5
    %4:_(s1) = G_ICMP intpred(eq), %2, %3
    %5:_(s32) = G_SEXTLOAD %0 :: (load (s8), addrspace 1)
    %6:_(s32) = G_LOAD %1 :: (load (s32), addrspace 1)
    %7:_(s32) = G_SELECT %4, %5, %6
    %8:_(s32) = G_SEXT_INREG %7, 8
    $vgpr0 = COPY %8

...
---
name: assert_sext_s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0
    ; GCN-LABEL: name: assert_sext_s8
    ; GCN: liveins: $vgpr0
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: %copy:_(s32) = COPY $vgpr0
    ; GCN-NEXT: %assert_sext:_(s32) = G_ASSERT_SEXT %copy, 8
    ; GCN-NEXT: $vgpr0 = COPY %assert_sext(s32)
    %copy:_(s32) = COPY $vgpr0
    %assert_sext:_(s32) = G_ASSERT_SEXT %copy, 8
    %sext_inreg:_(s32) = G_SEXT_INREG %assert_sext, 8
    $vgpr0 = COPY %sext_inreg

...
---
name: sext_inreg_s7_assert_sext_s8
tracksRegLiveness: true
body:             |
  bb.0:
    liveins: $vgpr0
    ; GCN-LABEL: name: sext_inreg_s7_assert_sext_s8
    ; GCN: liveins: $vgpr0
    ; GCN-NEXT: {{  $}}
    ; GCN-NEXT: %copy:_(s32) = COPY $vgpr0
    ; GCN-NEXT: %assert_sext:_(s32) = G_ASSERT_SEXT %copy, 8
    ; GCN-NEXT: %sext_inreg:_(s32) = G_SEXT_INREG %assert_sext, 7
    ; GCN-NEXT: $vgpr0 = COPY %sext_inreg(s32)
    %copy:_(s32) = COPY $vgpr0
    %assert_sext:_(s32) = G_ASSERT_SEXT %copy, 8
    %sext_inreg:_(s32) = G_SEXT_INREG %assert_sext, 7
    $vgpr0 = COPY %sext_inreg
...