Please use GitHub pull requests for new patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/AArch64/GlobalISel/merge-stores-truncating.mir
- This file was added.
# 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[TRUNC]](s16), [[COPY1]](p0) :: (store (s16), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[COPY]](s32), [[COPY1]](p0) :: (store (s32), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[COPY]](s32), [[COPY1]](p0) :: (store (s32), align 2) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[ROTR:%[0-9]+]]:_(s32) = G_ROTR [[COPY]], [[C]](s32) | |||||
; CHECK: G_STORE [[ROTR]](s32), [[COPY1]](p0) :: (store (s32), align 2) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[ROTR:%[0-9]+]]:_(s32) = G_ROTR [[COPY]], [[C]](s32) | |||||
; CHECK: G_STORE [[ROTR]](s32), [[COPY1]](p0) :: (store (s32), align 2) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 2) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: G_STORE [[COPY]](s64), [[COPY1]](p0) :: (store (s64), align 4) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 | |||||
; CHECK: [[ROTR:%[0-9]+]]:_(s64) = G_ROTR [[COPY]], [[C]](s64) | |||||
; CHECK: G_STORE [[ROTR]](s64), [[COPY1]](p0) :: (store (s64), align 4) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s64) = COPY $x0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 32 | |||||
; CHECK: [[ROTR:%[0-9]+]]:_(s64) = G_ROTR [[COPY]], [[C]](s64) | |||||
; CHECK: G_STORE [[ROTR]](s64), [[COPY1]](p0) :: (store (s64), align 4) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s8), [[COPY1]](p0) :: (store (s8)) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: G_STORE [[TRUNC1]](s16), [[PTR_ADD]](p0) :: (store (s16), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s16), [[PTR_ADD]](p0) :: (store (s16), align 1) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 | |||||
; CHECK: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C2]](s64) | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: G_STORE [[TRUNC1]](s16), [[PTR_ADD1]](p0) :: (store (s16), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: G_STORE [[TRUNC1]](s16), [[COPY1]](p0) :: (store (s16), align 1) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 16 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s16) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s16), [[COPY1]](p0) :: (store (s16)) | |||||
; CHECK: [[LOAD:%[0-9]+]]:_(s32) = G_LOAD [[COPY2]](p0) :: (load (s32)) | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 2 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: G_STORE [[TRUNC1]](s16), [[PTR_ADD]](p0) :: (store (s16)) | |||||
; CHECK: $w0 = COPY [[LOAD]](s32) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 4 | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) | |||||
; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) | |||||
; CHECK: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 8 | |||||
; CHECK: [[C1:%[0-9]+]]:_(s32) = G_CONSTANT i32 24 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s8) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C]](s32) | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s32) | |||||
; CHECK: [[LSHR1:%[0-9]+]]:_(s32) = G_LSHR [[COPY]], [[C1]](s32) | |||||
; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR1]](s32) | |||||
; CHECK: G_STORE [[TRUNC]](s8), [[COPY1]](p0) :: (store (s8)) | |||||
; CHECK: [[C2:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C2]](s64) | |||||
; CHECK: G_STORE [[TRUNC1]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: [[C3:%[0-9]+]]:_(s64) = G_CONSTANT i64 3 | |||||
; CHECK: [[PTR_ADD1:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C3]](s64) | |||||
; CHECK: G_STORE [[TRUNC2]](s8), [[PTR_ADD1]](p0) :: (store (s8)) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[COPY2:%[0-9]+]]:_(p0) = COPY $x2 | |||||
; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8 | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) | |||||
; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) | |||||
; CHECK: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (store (s8)) | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY2]], [[C1]](s64) | |||||
; CHECK: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: 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: [[COPY:%[0-9]+]]:_(s32) = COPY $w0 | |||||
; CHECK: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32) | |||||
; CHECK: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1 | |||||
; CHECK: [[C:%[0-9]+]]:_(s16) = G_CONSTANT i16 8 | |||||
; CHECK: [[TRUNC1:%[0-9]+]]:_(s8) = G_TRUNC [[TRUNC]](s16) | |||||
; CHECK: [[LSHR:%[0-9]+]]:_(s16) = G_LSHR [[TRUNC]], [[C]](s16) | |||||
; CHECK: [[TRUNC2:%[0-9]+]]:_(s8) = G_TRUNC [[LSHR]](s16) | |||||
; CHECK: G_STORE [[TRUNC1]](s8), [[COPY1]](p0) :: (volatile store (s8)) | |||||
; CHECK: [[C1:%[0-9]+]]:_(s64) = G_CONSTANT i64 1 | |||||
; CHECK: [[PTR_ADD:%[0-9]+]]:_(p0) = G_PTR_ADD [[COPY1]], [[C1]](s64) | |||||
; CHECK: G_STORE [[TRUNC2]](s8), [[PTR_ADD]](p0) :: (store (s8)) | |||||
; CHECK: 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 | |||||
... |