# 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: right_ident_sub tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x - 0) -> x ; ; CHECK-LABEL: name: right_ident_sub ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: $w0 = COPY %x(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_SUB %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_add tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x + 0) -> x ; ; CHECK-LABEL: name: right_ident_add ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_ADD %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: mul_0 tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x * 0) -> 0 ; ; CHECK-LABEL: name: mul_0 ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: $w0 = COPY %cst(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_MUL %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... # FIXME: Probably should be able to replace this. --- name: mul_0_cant_replace tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x * 0) -> 0 ; ; CHECK-LABEL: name: mul_0_cant_replace ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: %op:gpr(s32) = G_MUL %x, %cst ; CHECK-NEXT: $w0 = COPY %op(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:gpr(s32) = G_MUL %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: sdiv_0 tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (0 / x) -> 0 ; ; CHECK-LABEL: name: sdiv_0 ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: $w0 = COPY %cst(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_SDIV %cst, %x $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: udiv_0 tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (0 / x) -> 0 ; ; CHECK-LABEL: name: udiv_0 ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: $w0 = COPY %cst(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_UDIV %cst, %x $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: srem_0 tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (0 % x) -> 0 ; ; CHECK-LABEL: name: srem_0 ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: $w0 = COPY %cst(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_SREM %cst, %x $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: urem_0 tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (0 % x) -> 0 ; ; CHECK-LABEL: name: urem_0 ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 0 ; CHECK-NEXT: $w0 = COPY %cst(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_UREM %cst, %x $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_or tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x || 0) -> x ; ; CHECK-LABEL: name: right_ident_or ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_OR %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_xor tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x | 0) -> x ; ; CHECK-LABEL: name: right_ident_xor ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_XOR %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_shl tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x << 0) -> x ; ; CHECK-LABEL: name: right_ident_shl ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_SHL %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_ashr tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x ashr 0) -> x ; ; CHECK-LABEL: name: right_ident_ashr ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_ASHR %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: right_ident_lshr tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Fold (x lshr 0) -> x ; ; CHECK-LABEL: name: right_ident_lshr ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %x(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 0 %op:_(s32) = G_LSHR %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: dont_fold_sub tracksRegLiveness: true body: | bb.1.entry: liveins: $w0 ; Not an identity, no folding. ; ; CHECK-LABEL: name: dont_fold_sub ; CHECK: liveins: $w0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(s32) = COPY $w0 ; CHECK-NEXT: %cst:_(s32) = G_CONSTANT i32 1 ; CHECK-NEXT: %op:_(s32) = G_SUB %x, %cst ; CHECK-NEXT: $w0 = COPY %op(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %cst:_(s32) = G_CONSTANT i32 1 %op:_(s32) = G_SUB %x(s32), %cst $w0 = COPY %op(s32) RET_ReallyLR implicit $w0 ... --- name: look_through_zext tracksRegLiveness: true body: | bb.0: liveins: $x0 ; CHECK-LABEL: name: look_through_zext ; CHECK: liveins: $x0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %zero:_(s8) = G_CONSTANT i8 0 ; CHECK-NEXT: %zext_zero:_(s64) = G_ZEXT %zero(s8) ; CHECK-NEXT: $x0 = COPY %zext_zero(s64) ; CHECK-NEXT: RET_ReallyLR implicit $x0 %zero:_(s8) = G_CONSTANT i8 0 %zext_zero:_(s64) = G_ZEXT %zero(s8) %c:_(s64) = G_CONSTANT i64 72340172838076673 %mul:_(s64) = G_MUL %c, %zext_zero $x0 = COPY %mul(s64) RET_ReallyLR implicit $x0 ... --- name: right_ident_ptr_add tracksRegLiveness: true body: | bb.1.entry: liveins: $x0 ; Fold (x + 0) -> x ; ; CHECK-LABEL: name: right_ident_ptr_add ; CHECK: liveins: $x0 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %x:_(p0) = COPY $x0 ; CHECK-NEXT: $x0 = COPY %x(p0) ; CHECK-NEXT: RET_ReallyLR implicit $x0 %x:_(p0) = COPY $x0 %cst:_(s64) = G_CONSTANT i64 0 %op:_(p0) = G_PTR_ADD %x(p0), %cst $x0 = COPY %op(p0) RET_ReallyLR implicit $x0 ... --- name: right_identity_rotl tracksRegLiveness: true body: | bb.0: liveins: $w0, $w1 ; CHECK-LABEL: name: right_identity_rotl ; CHECK: liveins: $w0, $w1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %copy:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %copy(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %copy:_(s32) = COPY $w0 %zero:_(s32) = G_CONSTANT i32 0 %rot:_(s32) = G_ROTL %copy(s32), %zero(s32) $w0 = COPY %rot(s32) RET_ReallyLR implicit $w0 ... ... --- name: right_identity_rotr tracksRegLiveness: true body: | bb.0: liveins: $w0, $w1 ; CHECK-LABEL: name: right_identity_rotr ; CHECK: liveins: $w0, $w1 ; CHECK-NEXT: {{ $}} ; CHECK-NEXT: %copy:_(s32) = COPY $w0 ; CHECK-NEXT: $w0 = COPY %copy(s32) ; CHECK-NEXT: RET_ReallyLR implicit $w0 %copy:_(s32) = COPY $w0 %zero:_(s32) = G_CONSTANT i32 0 %rot:_(s32) = G_ROTR %copy(s32), %zero(s32) $w0 = COPY %rot(s32) RET_ReallyLR implicit $w0 ... --- name: lshr_of_vec_zero body: | bb.1: liveins: $q0 ; CHECK-LABEL: name: lshr_of_vec_zero ; CHECK: [[COPY:%[0-9]+]]:_(<8 x s16>) = COPY $q0 ; CHECK-NEXT: $q0 = COPY [[COPY]](<8 x s16>) ; CHECK-NEXT: RET_ReallyLR implicit $q0 %0:_(<8 x s16>) = COPY $q0 %5:_(s16) = G_CONSTANT i16 0 %zero_vec:_(<8 x s16>) = G_BUILD_VECTOR %5(s16), %5(s16), %5(s16), %5(s16), %5(s16), %5(s16), %5(s16), %5(s16) %shift:_(<8 x s16>) = G_LSHR %0, %zero_vec(<8 x s16>) $q0 = COPY %shift(<8 x s16>) RET_ReallyLR implicit $q0 ... --- name: ptradd_of_vec_zero body: | bb.1: liveins: $q0 ; CHECK-LABEL: name: ptradd_of_vec_zero ; CHECK: [[COPY:%[0-9]+]]:_(<2 x p0>) = COPY $q0 ; CHECK-NEXT: $q0 = COPY [[COPY]](<2 x p0>) ; CHECK-NEXT: RET_ReallyLR implicit $q0 %0:_(<2 x p0>) = COPY $q0 %5:_(s64) = G_CONSTANT i64 0 %zero_vec:_(<2 x s64>) = G_BUILD_VECTOR %5(s64), %5(s64) %ptr:_(<2 x p0>) = G_PTR_ADD %0, %zero_vec(<2 x s64>) $q0 = COPY %ptr(<2 x p0>) RET_ReallyLR implicit $q0 ... --- name: i128_or_cst liveins: - { reg: '$x0' } body: | bb.1: liveins: $x0 ; CHECK-LABEL: name: i128_or_cst ; CHECK: [[COPY:%[0-9]+]]:_(p0) = COPY $x0 ; CHECK-NEXT: [[LOAD:%[0-9]+]]:_(s128) = G_LOAD [[COPY]](p0) :: (load (s128)) ; CHECK-NEXT: [[C:%[0-9]+]]:_(s128) = G_CONSTANT i128 9223372036854775808 ; CHECK-NEXT: [[OR:%[0-9]+]]:_(s128) = G_OR [[LOAD]], [[C]] ; CHECK-NEXT: G_STORE [[OR]](s128), [[COPY]](p0) :: (store (s128), align 4) ; CHECK-NEXT: RET_ReallyLR %0:_(p0) = COPY $x0 %2:_(s128) = G_LOAD %0(p0) :: (load (s128)) %4:_(s128) = G_CONSTANT i128 9223372036854775808 %5:_(s128) = G_OR %2, %4 G_STORE %5(s128), %0(p0) :: (store (s128), align 4) RET_ReallyLR ...