# 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 ...