# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple aarch64 -run-pass=aarch64-postlegalizer-combiner -verify-machineinstrs %s -o - | FileCheck %s # Check that we can fold a G_SEXT_INREG fed by a G_ASHR/G_LSHR into a G_SBFX. ... --- name: sextinreg_ashr_to_sbfx tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; CHECK-LABEL: name: sextinreg_ashr_to_sbfx ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 10 ; CHECK: %sext_inreg:_(s32) = G_SBFX %x, %lsb(s32), [[C]] ; CHECK: $w0 = COPY %sext_inreg(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %lsb:_(s32) = G_CONSTANT i32 5 %shift:_(s32) = G_ASHR %x, %lsb %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10 $w0 = COPY %sext_inreg RET_ReallyLR implicit $w0 ... --- name: sextinreg_lshr_to_sbfx tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; CHECK-LABEL: name: sextinreg_lshr_to_sbfx ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 5 ; CHECK: [[C:%[0-9]+]]:_(s32) = G_CONSTANT i32 10 ; CHECK: %sext_inreg:_(s32) = G_SBFX %x, %lsb(s32), [[C]] ; CHECK: $w0 = COPY %sext_inreg(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %lsb:_(s32) = G_CONSTANT i32 5 %shift:_(s32) = G_LSHR %x, %lsb %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10 $w0 = COPY %sext_inreg RET_ReallyLR implicit $w0 ... --- name: dont_apply_no_constant tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; AArch64 needs a constant on the shift for this combine. ; CHECK-LABEL: name: dont_apply_no_constant ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %y:_(s32) = COPY $w0 ; CHECK: %shift:_(s32) = G_LSHR %x, %y(s32) ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10 ; CHECK: $w0 = COPY %sext_inreg(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %y:_(s32) = COPY $w0 %shift:_(s32) = G_LSHR %x, %y %sext_inreg:_(s32) = G_SEXT_INREG %shift, 10 $w0 = COPY %sext_inreg RET_ReallyLR implicit $w0 ... --- name: dont_apply_shift_imm_too_large tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; LSB must be in 0-31. ; CHECK-LABEL: name: dont_apply_shift_imm_too_large ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 32 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32) ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 ; CHECK: $w0 = COPY %sext_inreg(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %lsb:_(s32) = G_CONSTANT i32 32 %shift:_(s32) = G_ASHR %x, %lsb %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 $w0 = COPY %sext_inreg RET_ReallyLR implicit $w0 ... --- name: dont_apply_negative_shift_imm tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; LSB must be in 0-31. ; CHECK-LABEL: name: dont_apply_negative_shift_imm ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 -1 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32) ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 ; CHECK: $w0 = COPY %sext_inreg(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %lsb:_(s32) = G_CONSTANT i32 -1 %shift:_(s32) = G_ASHR %x, %lsb %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 $w0 = COPY %sext_inreg RET_ReallyLR implicit $w0 ... --- name: dont_apply_more_than_one_use tracksRegLiveness: true legalized: true body: | bb.0: liveins: $w0 ; CHECK-LABEL: name: dont_apply_more_than_one_use ; CHECK: liveins: $w0 ; CHECK: %x:_(s32) = COPY $w0 ; CHECK: %lsb:_(s32) = G_CONSTANT i32 1 ; CHECK: %shift:_(s32) = G_ASHR %x, %lsb(s32) ; CHECK: %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 ; CHECK: %mul:_(s32) = G_MUL %shift, %sext_inreg ; CHECK: $w0 = COPY %mul(s32) ; CHECK: RET_ReallyLR implicit $w0 %x:_(s32) = COPY $w0 %lsb:_(s32) = G_CONSTANT i32 1 %shift:_(s32) = G_ASHR %x, %lsb %sext_inreg:_(s32) = G_SEXT_INREG %shift, 1 %mul:_(s32) = G_MUL %shift, %sext_inreg $w0 = COPY %mul RET_ReallyLR implicit $w0