158c9ad9cSAustin Chang; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 258c9ad9cSAustin Chang; RUN: llc < %s -mtriple=thumbv7m-none-eabi -mattr=v7 | FileCheck %s --check-prefixes=CHECK 358c9ad9cSAustin Chang 458c9ad9cSAustin Changdeclare i32 @llvm.bswap.i32(i32) readnone 558c9ad9cSAustin Changdeclare i64 @llvm.bswap.i64(i64) readnone 658c9ad9cSAustin Changdeclare i32 @llvm.bitreverse.i32(i32) readnone 758c9ad9cSAustin Chang 858c9ad9cSAustin Changdefine i32 @bs_and_lhs_bs32(i32 %a, i32 %b) #0 { 958c9ad9cSAustin Chang; CHECK-LABEL: bs_and_lhs_bs32: 1058c9ad9cSAustin Chang; CHECK: @ %bb.0: 11*d069ac03SAustin Chang; CHECK-NEXT: rev r1, r1 1258c9ad9cSAustin Chang; CHECK-NEXT: ands r0, r1 1358c9ad9cSAustin Chang; CHECK-NEXT: bx lr 1458c9ad9cSAustin Chang %1 = tail call i32 @llvm.bswap.i32(i32 %a) 1558c9ad9cSAustin Chang %2 = and i32 %1, %b 1658c9ad9cSAustin Chang %3 = tail call i32 @llvm.bswap.i32(i32 %2) 1758c9ad9cSAustin Chang ret i32 %3 1858c9ad9cSAustin Chang} 1958c9ad9cSAustin Chang 2058c9ad9cSAustin Changdefine i64 @bs_or_rhs_bs64(i64 %a, i64 %b) #0 { 2158c9ad9cSAustin Chang; CHECK-LABEL: bs_or_rhs_bs64: 2258c9ad9cSAustin Chang; CHECK: @ %bb.0: 23*d069ac03SAustin Chang; CHECK-NEXT: rev r1, r1 24*d069ac03SAustin Chang; CHECK-NEXT: rev r0, r0 25*d069ac03SAustin Chang; CHECK-NEXT: orrs r2, r1 26*d069ac03SAustin Chang; CHECK-NEXT: orr.w r1, r0, r3 2758c9ad9cSAustin Chang; CHECK-NEXT: mov r0, r2 2858c9ad9cSAustin Chang; CHECK-NEXT: bx lr 2958c9ad9cSAustin Chang %1 = tail call i64 @llvm.bswap.i64(i64 %b) 3058c9ad9cSAustin Chang %2 = or i64 %a, %1 3158c9ad9cSAustin Chang %3 = tail call i64 @llvm.bswap.i64(i64 %2) 3258c9ad9cSAustin Chang ret i64 %3 3358c9ad9cSAustin Chang} 3458c9ad9cSAustin Chang 3558c9ad9cSAustin Changdefine i32 @bs_and_all_operand_multiuse(i32 %a, i32 %b) #0 { 3658c9ad9cSAustin Chang; CHECK-LABEL: bs_and_all_operand_multiuse: 3758c9ad9cSAustin Chang; CHECK: @ %bb.0: 3858c9ad9cSAustin Chang; CHECK-NEXT: and.w r2, r0, r1 39*d069ac03SAustin Chang; CHECK-NEXT: rev r0, r0 40*d069ac03SAustin Chang; CHECK-NEXT: rev r1, r1 4158c9ad9cSAustin Chang; CHECK-NEXT: muls r0, r2, r0 4258c9ad9cSAustin Chang; CHECK-NEXT: muls r0, r1, r0 4358c9ad9cSAustin Chang; CHECK-NEXT: bx lr 4458c9ad9cSAustin Chang %1 = tail call i32 @llvm.bswap.i32(i32 %a) 4558c9ad9cSAustin Chang %2 = tail call i32 @llvm.bswap.i32(i32 %b) 4658c9ad9cSAustin Chang %3 = and i32 %1, %2 4758c9ad9cSAustin Chang %4 = tail call i32 @llvm.bswap.i32(i32 %3) 4858c9ad9cSAustin Chang %5 = mul i32 %1, %4 ;increase use of left bswap 4958c9ad9cSAustin Chang %6 = mul i32 %2, %5 ;increase use of right bswap 5058c9ad9cSAustin Chang 5158c9ad9cSAustin Chang ret i32 %6 5258c9ad9cSAustin Chang} 5358c9ad9cSAustin Chang 5458c9ad9cSAustin Chang; negative test 5558c9ad9cSAustin Changdefine i32 @bs_and_rhs_bs32_multiuse1(i32 %a, i32 %b) #0 { 5658c9ad9cSAustin Chang; CHECK-LABEL: bs_and_rhs_bs32_multiuse1: 5758c9ad9cSAustin Chang; CHECK: @ %bb.0: 5858c9ad9cSAustin Chang; CHECK-NEXT: rev r1, r1 5958c9ad9cSAustin Chang; CHECK-NEXT: ands r0, r1 6058c9ad9cSAustin Chang; CHECK-NEXT: rev r1, r0 6158c9ad9cSAustin Chang; CHECK-NEXT: muls r0, r1, r0 6258c9ad9cSAustin Chang; CHECK-NEXT: bx lr 6358c9ad9cSAustin Chang %1 = tail call i32 @llvm.bswap.i32(i32 %b) 6458c9ad9cSAustin Chang %2 = and i32 %1, %a 6558c9ad9cSAustin Chang %3 = tail call i32 @llvm.bswap.i32(i32 %2) 6658c9ad9cSAustin Chang %4 = mul i32 %2, %3 ;increase use of logical op 6758c9ad9cSAustin Chang ret i32 %4 6858c9ad9cSAustin Chang} 6958c9ad9cSAustin Chang 7058c9ad9cSAustin Chang; negative test 7158c9ad9cSAustin Changdefine i32 @bs_xor_rhs_brev32(i32 %a, i32 %b) #0 { 7258c9ad9cSAustin Chang; CHECK-LABEL: bs_xor_rhs_brev32: 7358c9ad9cSAustin Chang; CHECK: @ %bb.0: 7458c9ad9cSAustin Chang; CHECK-NEXT: rbit r1, r1 7558c9ad9cSAustin Chang; CHECK-NEXT: eors r0, r1 7658c9ad9cSAustin Chang; CHECK-NEXT: rev r0, r0 7758c9ad9cSAustin Chang; CHECK-NEXT: bx lr 7858c9ad9cSAustin Chang %1 = tail call i32 @llvm.bitreverse.i32(i32 %b) 7958c9ad9cSAustin Chang %2 = xor i32 %a, %1 8058c9ad9cSAustin Chang %3 = tail call i32 @llvm.bswap.i32(i32 %2) 8158c9ad9cSAustin Chang ret i32 %3 8258c9ad9cSAustin Chang} 8358c9ad9cSAustin Chang 84