xref: /llvm-project/llvm/test/CodeGen/ARM/combine-bswap.ll (revision d069ac035add3095c771f49540223f98e5ba10b9)
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