249 lines
7 KiB
YAML
249 lines
7 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
|
|
# RUN: llc -o - -mtriple=aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s | FileCheck %s
|
|
---
|
|
name: extract_from_build_vector
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_build_vector
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg1:_(s64) = COPY $x0
|
|
; CHECK-NEXT: $x0 = COPY %arg1(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%zero:_(s32) = G_CONSTANT i32 0
|
|
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %bv(<2 x s64>), %zero(s32)
|
|
$x0 = COPY %extract(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_trunc_build_vector
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_trunc_build_vector
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg1:_(s64) = COPY $x0
|
|
; CHECK-NEXT: %extract:_(s32) = G_TRUNC %arg1(s64)
|
|
; CHECK-NEXT: %zext:_(s64) = G_ZEXT %extract(s32)
|
|
; CHECK-NEXT: $x0 = COPY %zext(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%zero:_(s32) = G_CONSTANT i32 0
|
|
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
%truncbv:_(<2 x s32>) = G_TRUNC %bv
|
|
%extract:_(s32) = G_EXTRACT_VECTOR_ELT %truncbv(<2 x s32>), %zero(s32)
|
|
%zext:_(s64) = G_ZEXT %extract
|
|
$x0 = COPY %zext(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_build_vector_idx1
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_build_vector_idx1
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg2:_(s64) = COPY $x1
|
|
; CHECK-NEXT: $x0 = COPY %arg2(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%one:_(s32) = G_CONSTANT i32 1
|
|
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %bv(<2 x s64>), %one(s32)
|
|
$x0 = COPY %extract(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_build_vector_idx_invalid
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_build_vector_idx_invalid
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %extract:_(s64) = G_IMPLICIT_DEF
|
|
; CHECK-NEXT: $x0 = COPY %extract(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%idx:_(s32) = G_CONSTANT i32 4
|
|
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %bv(<2 x s64>), %idx(s32)
|
|
$x0 = COPY %extract(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_build_vector_trunc
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_build_vector_trunc
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg1:_(s64) = COPY $x0
|
|
; CHECK-NEXT: %extract:_(s32) = G_TRUNC %arg1(s64)
|
|
; CHECK-NEXT: $w0 = COPY %extract(s32)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $w0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%zero:_(s32) = G_CONSTANT i32 0
|
|
%bv:_(<2 x s32>) = G_BUILD_VECTOR_TRUNC %arg1(s64), %arg2(s64)
|
|
%extract:_(s32) = G_EXTRACT_VECTOR_ELT %bv(<2 x s32>), %zero(s32)
|
|
$w0 = COPY %extract(s32)
|
|
RET_ReallyLR implicit $w0
|
|
|
|
...
|
|
---
|
|
name: extract_from_build_vector_multiple_uses
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
maxCallFrameSize: 0
|
|
machineFunctionInfo: {}
|
|
body: |
|
|
bb.0:
|
|
liveins: $x0, $x1
|
|
|
|
; CHECK-LABEL: name: extract_from_build_vector_multiple_uses
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg1:_(s64) = COPY $x0
|
|
; CHECK-NEXT: %arg2:_(s64) = COPY $x1
|
|
; CHECK-NEXT: %zero:_(s32) = G_CONSTANT i32 0
|
|
; CHECK-NEXT: %bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
; CHECK-NEXT: %extract:_(s64) = G_EXTRACT_VECTOR_ELT %bv(<2 x s64>), %zero(s32)
|
|
; CHECK-NEXT: $x0 = COPY %extract(s64)
|
|
; CHECK-NEXT: $q0 = COPY %bv(<2 x s64>)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%zero:_(s32) = G_CONSTANT i32 0
|
|
%bv:_(<2 x s64>) = G_BUILD_VECTOR %arg1(s64), %arg2(s64)
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %bv(<2 x s64>), %zero(s32)
|
|
$x0 = COPY %extract(s64)
|
|
$q0 = COPY %bv(<2 x s64>)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_insert
|
|
alignment: 4
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; This test checks that this combine runs after the insertvec->build_vector
|
|
; combine.
|
|
; CHECK-LABEL: name: extract_from_insert
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %arg1:_(s64) = COPY $x0
|
|
; CHECK-NEXT: $x0 = COPY %arg1(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%arg1:_(s64) = COPY $x0
|
|
%arg2:_(s64) = COPY $x1
|
|
%undef:_(<2 x s64>) = G_IMPLICIT_DEF
|
|
%zero:_(s32) = G_CONSTANT i32 0
|
|
%one:_(s32) = G_CONSTANT i32 1
|
|
%ins1:_(<2 x s64>) = G_INSERT_VECTOR_ELT %undef, %arg1(s64), %zero(s32)
|
|
%ins2:_(<2 x s64>) = G_INSERT_VECTOR_ELT %ins1, %arg2(s64), %one(s32)
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %ins2(<2 x s64>), %zero(s32)
|
|
$x0 = COPY %extract(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|
|
---
|
|
name: extract_from_idx_negative
|
|
alignment: 4
|
|
liveins:
|
|
- { reg: '$x0' }
|
|
- { reg: '$x1' }
|
|
frameInfo:
|
|
maxAlignment: 1
|
|
body: |
|
|
bb.1:
|
|
liveins: $x0, $x1
|
|
; CHECK-LABEL: name: extract_from_idx_negative
|
|
; CHECK: liveins: $x0, $x1
|
|
; CHECK-NEXT: {{ $}}
|
|
; CHECK-NEXT: %extract:_(s64) = G_IMPLICIT_DEF
|
|
; CHECK-NEXT: $x0 = COPY %extract(s64)
|
|
; CHECK-NEXT: RET_ReallyLR implicit $x0
|
|
%vec:_(<2 x s64>) = COPY $q0
|
|
%idx:_(s32) = G_CONSTANT i32 -2
|
|
%extract:_(s64) = G_EXTRACT_VECTOR_ELT %vec(<2 x s64>), %idx(s32)
|
|
$x0 = COPY %extract(s64)
|
|
RET_ReallyLR implicit $x0
|
|
|
|
...
|