# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py # RUN: llc -mtriple=aarch64-unknown-unknown -verify-machineinstrs -run-pass=instruction-select -global-isel-abort=1 %s -o - | FileCheck %s --- name: fold_ror_eor alignment: 4 legalized: true regBankSelected: true tracksRegLiveness: true liveins: - { reg: '$w0' } body: | bb.1.entry: liveins: $w0 ; Our codegen differs from SDAG here, we decide to fold in LHS ; operand instead of RHS since they're both rotates and XOR is commutative. ; Either is valid. ; CHECK-LABEL: name: fold_ror_eor ; CHECK: liveins: $w0 ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 ; CHECK: [[EXTRWrri:%[0-9]+]]:gpr32 = EXTRWrri [[COPY]], [[COPY]], 11 ; CHECK: [[EORWrs:%[0-9]+]]:gpr32 = EORWrs [[EXTRWrri]], [[COPY]], 198 ; CHECK: $w0 = COPY [[EORWrs]] ; CHECK: RET_ReallyLR implicit $w0 %0:gpr(s32) = COPY $w0 %13:gpr(s64) = G_CONSTANT i64 6 %2:gpr(s32) = G_ROTR %0, %13(s64) %14:gpr(s64) = G_CONSTANT i64 11 %4:gpr(s32) = G_ROTR %0, %14(s64) %5:gpr(s32) = G_XOR %2, %4 $w0 = COPY %5(s32) RET_ReallyLR implicit $w0 ... --- name: fold_ror_eor_rhs_only alignment: 4 legalized: true regBankSelected: true tracksRegLiveness: true liveins: - { reg: '$w0' } - { reg: '$w1' } frameInfo: maxAlignment: 1 machineFunctionInfo: {} body: | bb.1.entry: liveins: $w0, $w1 ; CHECK-LABEL: name: fold_ror_eor_rhs_only ; CHECK: liveins: $w0, $w1 ; CHECK: [[COPY:%[0-9]+]]:gpr32 = COPY $w0 ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1 ; CHECK: [[EORWrs:%[0-9]+]]:gpr32 = EORWrs [[COPY1]], [[COPY]], 198 ; CHECK: $w0 = COPY [[EORWrs]] ; CHECK: RET_ReallyLR implicit $w0 %0:gpr(s32) = COPY $w0 %1:gpr(s32) = COPY $w1 %9:gpr(s64) = G_CONSTANT i64 6 %3:gpr(s32) = G_ROTR %0, %9(s64) %4:gpr(s32) = G_XOR %1, %3 $w0 = COPY %4(s32) RET_ReallyLR implicit $w0 ...