| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py |
| # RUN: llc -mtriple aarch64 -run-pass=aarch64-prelegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s |
| --- |
| name: trunc_i16_to_i8 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i16_to_i8 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s16), [[COPY1]](p0) :: (store (s16), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %2:_(s32) = COPY $w0 |
| %0:_(s16) = G_TRUNC %2(s32) |
| %1:_(p0) = COPY $x1 |
| %4:_(s16) = G_CONSTANT i16 8 |
| %3:_(s8) = G_TRUNC %0(s16) |
| %5:_(s16) = G_LSHR %0, %4(s16) |
| %6:_(s8) = G_TRUNC %5(s16) |
| G_STORE %3(s8), %1(p0) :: (store (s8)) |
| %7:_(s64) = G_CONSTANT i64 1 |
| %8:_(p0) = G_PTR_ADD %1, %7(s64) |
| G_STORE %6(s8), %8(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: trunc_i32_to_i8 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i32_to_i8 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[COPY]](s32), [[COPY1]](p0) :: (store (s32), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s32) = G_CONSTANT i32 8 |
| %6:_(s32) = G_CONSTANT i32 16 |
| %9:_(s32) = G_CONSTANT i32 24 |
| %2:_(s8) = G_TRUNC %0(s32) |
| %4:_(s32) = G_LSHR %0, %3(s32) |
| %5:_(s8) = G_TRUNC %4(s32) |
| %7:_(s32) = G_LSHR %0, %6(s32) |
| %8:_(s8) = G_TRUNC %7(s32) |
| %10:_(s32) = G_LSHR %0, %9(s32) |
| %11:_(s8) = G_TRUNC %10(s32) |
| G_STORE %2(s8), %1(p0) :: (store (s8)) |
| %12:_(s64) = G_CONSTANT i64 1 |
| %13:_(p0) = G_PTR_ADD %1, %12(s64) |
| G_STORE %5(s8), %13(p0) :: (store (s8)) |
| %14:_(s64) = G_CONSTANT i64 2 |
| %15:_(p0) = G_PTR_ADD %1, %14(s64) |
| G_STORE %8(s8), %15(p0) :: (store (s8)) |
| %16:_(s64) = G_CONSTANT i64 3 |
| %17:_(p0) = G_PTR_ADD %1, %16(s64) |
| G_STORE %11(s8), %17(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: trunc_i32_to_i16 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i32_to_i16 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[COPY]](s32), [[COPY1]](p0) :: (store (s32), align 2) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s32) = G_CONSTANT i32 16 |
| %2:_(s16) = G_TRUNC %0(s32) |
| %4:_(s32) = G_LSHR %0, %3(s32) |
| %5:_(s16) = G_TRUNC %4(s32) |
| G_STORE %2(s16), %1(p0) :: (store (s16)) |
| %6:_(s64) = G_CONSTANT i64 2 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %5(s16), %7(p0) :: (store (s16)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: be_i32_to_i16 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: be_i32_to_i16 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[ROTR:%[0-9]+]]:_(s32) = G_ROTR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: G_STORE [[ROTR]](s32), [[COPY1]](p0) :: (store (s32), align 2) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %2:_(s32) = G_CONSTANT i32 16 |
| %3:_(s32) = G_LSHR %0, %2(s32) |
| %4:_(s16) = G_TRUNC %0(s32) |
| %5:_(s16) = G_TRUNC %3(s32) |
| %6:_(s64) = G_CONSTANT i64 2 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %4(s16), %7(p0) :: (store (s16)) |
| G_STORE %5(s16), %1(p0) :: (store (s16)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: be_i32_to_i16_order |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: be_i32_to_i16_order |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[ROTR:%[0-9]+]]:_(s32) = G_ROTR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: G_STORE [[ROTR]](s32), [[COPY1]](p0) :: (store (s32), align 2) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %2:_(s32) = G_CONSTANT i32 16 |
| %3:_(s32) = G_LSHR %0, %2(s32) |
| %4:_(s16) = G_TRUNC %0(s32) |
| %5:_(s16) = G_TRUNC %3(s32) |
| %6:_(s64) = G_CONSTANT i64 2 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %5(s16), %1(p0) :: (store (s16)) |
| G_STORE %4(s16), %7(p0) :: (store (s16)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: trunc_i64_to_i8 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$x0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i64_to_i8 |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s64) = COPY $x0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s64) = G_CONSTANT i64 8 |
| %6:_(s64) = G_CONSTANT i64 16 |
| %9:_(s64) = G_CONSTANT i64 24 |
| %12:_(s64) = G_CONSTANT i64 32 |
| %15:_(s64) = G_CONSTANT i64 40 |
| %18:_(s64) = G_CONSTANT i64 48 |
| %21:_(s64) = G_CONSTANT i64 56 |
| %2:_(s8) = G_TRUNC %0(s64) |
| %4:_(s64) = G_LSHR %0, %3(s64) |
| %5:_(s8) = G_TRUNC %4(s64) |
| %7:_(s64) = G_LSHR %0, %6(s64) |
| %8:_(s8) = G_TRUNC %7(s64) |
| %10:_(s64) = G_LSHR %0, %9(s64) |
| %11:_(s8) = G_TRUNC %10(s64) |
| %13:_(s64) = G_LSHR %0, %12(s64) |
| %14:_(s8) = G_TRUNC %13(s64) |
| %16:_(s64) = G_LSHR %0, %15(s64) |
| %17:_(s8) = G_TRUNC %16(s64) |
| %19:_(s64) = G_LSHR %0, %18(s64) |
| %20:_(s8) = G_TRUNC %19(s64) |
| %22:_(s64) = G_LSHR %0, %21(s64) |
| %23:_(s8) = G_TRUNC %22(s64) |
| G_STORE %2(s8), %1(p0) :: (store (s8)) |
| %24:_(s64) = G_CONSTANT i64 1 |
| %25:_(p0) = G_PTR_ADD %1, %24(s64) |
| G_STORE %5(s8), %25(p0) :: (store (s8)) |
| %26:_(s64) = G_CONSTANT i64 2 |
| %27:_(p0) = G_PTR_ADD %1, %26(s64) |
| G_STORE %8(s8), %27(p0) :: (store (s8)) |
| %28:_(s64) = G_CONSTANT i64 3 |
| %29:_(p0) = G_PTR_ADD %1, %28(s64) |
| G_STORE %11(s8), %29(p0) :: (store (s8)) |
| %30:_(s64) = G_CONSTANT i64 4 |
| %31:_(p0) = G_PTR_ADD %1, %30(s64) |
| G_STORE %14(s8), %31(p0) :: (store (s8)) |
| %32:_(s64) = G_CONSTANT i64 5 |
| %33:_(p0) = G_PTR_ADD %1, %32(s64) |
| G_STORE %17(s8), %33(p0) :: (store (s8)) |
| %34:_(s64) = G_CONSTANT i64 6 |
| %35:_(p0) = G_PTR_ADD %1, %34(s64) |
| G_STORE %20(s8), %35(p0) :: (store (s8)) |
| %36:_(s64) = G_CONSTANT i64 7 |
| %37:_(p0) = G_PTR_ADD %1, %36(s64) |
| G_STORE %23(s8), %37(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: trunc_i64_to_i16 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$x0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i64_to_i16 |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 2) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s64) = COPY $x0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s64) = G_CONSTANT i64 16 |
| %6:_(s64) = G_CONSTANT i64 32 |
| %9:_(s64) = G_CONSTANT i64 48 |
| %2:_(s16) = G_TRUNC %0(s64) |
| %4:_(s64) = G_LSHR %0, %3(s64) |
| %5:_(s16) = G_TRUNC %4(s64) |
| %7:_(s64) = G_LSHR %0, %6(s64) |
| %8:_(s16) = G_TRUNC %7(s64) |
| %10:_(s64) = G_LSHR %0, %9(s64) |
| %11:_(s16) = G_TRUNC %10(s64) |
| G_STORE %2(s16), %1(p0) :: (store (s16)) |
| %12:_(s64) = G_CONSTANT i64 2 |
| %13:_(p0) = G_PTR_ADD %1, %12(s64) |
| G_STORE %5(s16), %13(p0) :: (store (s16)) |
| %14:_(s64) = G_CONSTANT i64 4 |
| %15:_(p0) = G_PTR_ADD %1, %14(s64) |
| G_STORE %8(s16), %15(p0) :: (store (s16)) |
| %16:_(s64) = G_CONSTANT i64 6 |
| %17:_(p0) = G_PTR_ADD %1, %16(s64) |
| G_STORE %11(s16), %17(p0) :: (store (s16)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: trunc_i64_to_i32 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$x0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: trunc_i64_to_i32 |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 4) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s64) = COPY $x0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s64) = G_CONSTANT i64 32 |
| %2:_(s32) = G_TRUNC %0(s64) |
| %4:_(s64) = G_LSHR %0, %3(s64) |
| %5:_(s32) = G_TRUNC %4(s64) |
| G_STORE %2(s32), %1(p0) :: (store (s32)) |
| %6:_(s64) = G_CONSTANT i64 4 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %5(s32), %7(p0) :: (store (s32)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: be_i64_to_i32 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$x0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: be_i64_to_i32 |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 |
| ; CHECK-NEXT: [[ROTR:%[0-9]+]]:_(s64) = G_ROTR [[COPY]], [[C]](s64) |
| ; CHECK-NEXT: G_STORE [[ROTR]](s64), [[COPY1]](p0) :: (store (s64), align 4) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s64) = COPY $x0 |
| %1:_(p0) = COPY $x1 |
| %2:_(s64) = G_CONSTANT i64 32 |
| %3:_(s64) = G_LSHR %0, %2(s64) |
| %4:_(s32) = G_TRUNC %0(s64) |
| %5:_(s32) = G_TRUNC %3(s64) |
| %6:_(s64) = G_CONSTANT i64 4 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %4(s32), %7(p0) :: (store (s32)) |
| G_STORE %5(s32), %1(p0) :: (store (s32)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: be_i64_to_i32_order |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$x0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: be_i64_to_i32_order |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 |
| ; CHECK-NEXT: [[ROTR:%[0-9]+]]:_(s64) = G_ROTR [[COPY]], [[C]](s64) |
| ; CHECK-NEXT: G_STORE [[ROTR]](s64), [[COPY1]](p0) :: (store (s64), align 4) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s64) = COPY $x0 |
| %1:_(p0) = COPY $x1 |
| %2:_(s64) = G_CONSTANT i64 32 |
| %3:_(s64) = G_LSHR %0, %2(s64) |
| %4:_(s32) = G_TRUNC %0(s64) |
| %5:_(s32) = G_TRUNC %3(s64) |
| %6:_(s64) = G_CONSTANT i64 4 |
| %7:_(p0) = G_PTR_ADD %1, %6(s64) |
| G_STORE %5(s32), %1(p0) :: (store (s32)) |
| G_STORE %4(s32), %7(p0) :: (store (s32)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: merge_hole |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: merge_hole |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s8), [[COPY1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s16), [[PTR_ADD]](p0) :: (store (s16), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %5:_(s32) = G_CONSTANT i32 16 |
| %2:_(s64) = G_CONSTANT i64 2 |
| %3:_(p0) = G_PTR_ADD %1, %2(s64) |
| %4:_(s8) = G_TRUNC %0(s32) |
| G_STORE %4(s8), %1(p0) :: (store (s8)) |
| %6:_(s32) = G_LSHR %0, %5(s32) |
| %7:_(s16) = G_TRUNC %6(s32) |
| G_STORE %7(s16), %3(p0) :: (store (s16), align 1) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: merge_hole2 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: merge_hole2 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s16), [[PTR_ADD]](p0) :: (store (s16), align 1) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %4:_(s32) = G_CONSTANT i32 16 |
| %2:_(s64) = G_CONSTANT i64 2 |
| %3:_(p0) = G_PTR_ADD %1, %2(s64) |
| %5:_(s32) = G_LSHR %0, %4(s32) |
| %6:_(s16) = G_TRUNC %5(s32) |
| G_STORE %6(s16), %3(p0) :: (store (s16), align 1) |
| %7:_(s8) = G_TRUNC %0(s32) |
| G_STORE %7(s8), %1(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: merge_hole3 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: merge_hole3 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C2]](s64) |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s16), [[PTR_ADD1]](p0) :: (store (s16), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %7:_(s32) = G_CONSTANT i32 16 |
| %2:_(s64) = G_CONSTANT i64 1 |
| %3:_(p0) = G_PTR_ADD %1, %2(s64) |
| %4:_(s64) = G_CONSTANT i64 2 |
| %5:_(p0) = G_PTR_ADD %1, %4(s64) |
| %6:_(s8) = G_TRUNC %0(s32) |
| G_STORE %6(s8), %3(p0) :: (store (s8)) |
| %8:_(s32) = G_LSHR %0, %7(s32) |
| %9:_(s16) = G_TRUNC %8(s32) |
| G_STORE %9(s16), %5(p0) :: (store (s16), align 1) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: merge_hole4 |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: merge_hole4 |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s16), [[COPY1]](p0) :: (store (s16), align 1) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %5:_(s32) = G_CONSTANT i32 16 |
| %2:_(s64) = G_CONSTANT i64 2 |
| %3:_(p0) = G_PTR_ADD %1, %2(s64) |
| %4:_(s8) = G_TRUNC %0(s32) |
| G_STORE %4(s8), %3(p0) :: (store (s8)) |
| %6:_(s32) = G_LSHR %0, %5(s32) |
| %7:_(s16) = G_TRUNC %6(s32) |
| G_STORE %7(s16), %1(p0) :: (store (s16), align 1) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: load_between_stores |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| - { reg: '$x2' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1, $x2 |
| |
| ; CHECK-LABEL: name: load_between_stores |
| ; CHECK: liveins: $w0, $x1, $x2 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s16), [[COPY1]](p0) :: (store (s16)) |
| ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY2]](p0) :: (load (s32)) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s16), [[PTR_ADD]](p0) :: (store (s16)) |
| ; CHECK-NEXT: $w0 = COPY [[LOAD]](s32) |
| ; CHECK-NEXT: RET_ReallyLR implicit $w0 |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %2:_(p0) = COPY $x2 |
| %4:_(s32) = G_CONSTANT i32 16 |
| %3:_(s16) = G_TRUNC %0(s32) |
| %5:_(s32) = G_LSHR %0, %4(s32) |
| %6:_(s16) = G_TRUNC %5(s32) |
| G_STORE %3(s16), %1(p0) :: (store (s16)) |
| %7:_(s32) = G_LOAD %2(p0) :: (load (s32)) |
| %8:_(s64) = G_CONSTANT i64 2 |
| %9:_(p0) = G_PTR_ADD %1, %8(s64) |
| G_STORE %6(s16), %9(p0) :: (store (s16)) |
| $w0 = COPY %7(s32) |
| RET_ReallyLR implicit $w0 |
| |
| ... |
| --- |
| name: invalid_shift |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: invalid_shift |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 4 |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) |
| ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %2:_(s32) = COPY $w0 |
| %0:_(s16) = G_TRUNC %2(s32) |
| %1:_(p0) = COPY $x1 |
| %4:_(s16) = G_CONSTANT i16 4 |
| %3:_(s8) = G_TRUNC %0(s16) |
| %5:_(s16) = G_LSHR %0, %4(s16) |
| %6:_(s8) = G_TRUNC %5(s16) |
| G_STORE %3(s8), %1(p0) :: (store (s8)) |
| %7:_(s64) = G_CONSTANT i64 1 |
| %8:_(p0) = G_PTR_ADD %1, %7(s64) |
| G_STORE %6(s8), %8(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: missing_store |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: missing_store |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s32) |
| ; CHECK-NEXT: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C1]](s32) |
| ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR1]](s32) |
| ; CHECK-NEXT: G_STORE [[TRUNC]](s8), [[COPY1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C2]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 3 |
| ; CHECK-NEXT: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C3]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC2]](s8), [[PTR_ADD1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %0:_(s32) = COPY $w0 |
| %1:_(p0) = COPY $x1 |
| %3:_(s32) = G_CONSTANT i32 8 |
| %6:_(s32) = G_CONSTANT i32 24 |
| %2:_(s8) = G_TRUNC %0(s32) |
| %4:_(s32) = G_LSHR %0, %3(s32) |
| %5:_(s8) = G_TRUNC %4(s32) |
| %7:_(s32) = G_LSHR %0, %6(s32) |
| %8:_(s8) = G_TRUNC %7(s32) |
| G_STORE %2(s8), %1(p0) :: (store (s8)) |
| %9:_(s64) = G_CONSTANT i64 1 |
| %10:_(p0) = G_PTR_ADD %1, %9(s64) |
| G_STORE %5(s8), %10(p0) :: (store (s8)) |
| %11:_(s64) = G_CONSTANT i64 3 |
| %12:_(p0) = G_PTR_ADD %1, %11(s64) |
| G_STORE %8(s8), %12(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: different_base_reg |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| - { reg: '$x2' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1, $x2 |
| |
| ; CHECK-LABEL: name: different_base_reg |
| ; CHECK: liveins: $w0, $x1, $x2 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8 |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) |
| ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY2]], [[C1]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %3:_(s32) = COPY $w0 |
| %0:_(s16) = G_TRUNC %3(s32) |
| %1:_(p0) = COPY $x1 |
| %2:_(p0) = COPY $x2 |
| %5:_(s16) = G_CONSTANT i16 8 |
| %4:_(s8) = G_TRUNC %0(s16) |
| %6:_(s16) = G_LSHR %0, %5(s16) |
| %7:_(s8) = G_TRUNC %6(s16) |
| G_STORE %4(s8), %1(p0) :: (store (s8)) |
| %8:_(s64) = G_CONSTANT i64 1 |
| %9:_(p0) = G_PTR_ADD %2, %8(s64) |
| G_STORE %7(s8), %9(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: second_store_is_volatile |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $w0, $x1 |
| |
| ; CHECK-LABEL: name: second_store_is_volatile |
| ; CHECK: liveins: $w0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8 |
| ; CHECK-NEXT: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) |
| ; CHECK-NEXT: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) |
| ; CHECK-NEXT: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (volatile store (s8)) |
| ; CHECK-NEXT: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 |
| ; CHECK-NEXT: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) |
| ; CHECK-NEXT: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %2:_(s32) = COPY $w0 |
| %0:_(s16) = G_TRUNC %2(s32) |
| %1:_(p0) = COPY $x1 |
| %4:_(s16) = G_CONSTANT i16 8 |
| %3:_(s8) = G_TRUNC %0(s16) |
| %5:_(s16) = G_LSHR %0, %4(s16) |
| %6:_(s8) = G_TRUNC %5(s16) |
| G_STORE %3(s8), %1(p0) :: (volatile store (s8)) |
| %7:_(s64) = G_CONSTANT i64 1 |
| %8:_(p0) = G_PTR_ADD %1, %7(s64) |
| G_STORE %6(s8), %8(p0) :: (store (s8)) |
| RET_ReallyLR |
| |
| ... |
| --- |
| name: wide_not_multiple_of_mem_ty |
| alignment: 4 |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$w0' } |
| - { reg: '$x1' } |
| body: | |
| bb.1: |
| liveins: $x0, $x1 |
| |
| ; CHECK-LABEL: name: wide_not_multiple_of_mem_ty |
| ; CHECK: liveins: $x0, $x1 |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 |
| ; CHECK-NEXT: [[TRUNC:%[0-9]+]]:_(s48) = G_TRUNC [[COPY]](s64) |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 |
| ; CHECK-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 |
| ; CHECK-NEXT: [[LSHR:%[0-9]+]]:_(s48) = G_LSHR [[TRUNC]], [[C]](s64) |
| ; CHECK-NEXT: %trunc:_(s32) = G_TRUNC [[LSHR]](s48) |
| ; CHECK-NEXT: G_STORE %trunc(s32), [[COPY1]](p0) :: (store (s32)) |
| ; CHECK-NEXT: RET_ReallyLR |
| %2:_(s64) = COPY $x0 |
| %0:_(s48) = G_TRUNC %2(s64) |
| %1:_(p0) = COPY $x1 |
| %4:_(s64) = G_CONSTANT i64 32 |
| %5:_(s48) = G_LSHR %0, %4(s64) |
| %trunc:_(s32) = G_TRUNC %5(s48) |
| G_STORE %trunc(s32), %1(p0) :: (store (s32)) |
| RET_ReallyLR |
| |
| ... |