-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[DAGCombiner] Add bswap(logic_op(bswap(x), y)) regression test case; NFC
Fold the following case on SelectionDAG combiner This patch includes the regression test cases ``` bswap(logic_op(x, bswap(y))) -> logic_op(bswap(x), y) bswap(logic_op(bswap(x), y)) -> logic_op(x, bswap(y)) bswap(logic_op(bswap(x), bswap(y))) -> logic_op(x, y) (with multiuse) ``` Reviewed By: goldstein.w.n Differential Revision: https://reviews.llvm.org/D149782
- Loading branch information
1 parent
1fb99de
commit 58c9ad9
Showing
4 changed files
with
362 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: llc < %s -mtriple=thumbv7m-none-eabi -mattr=v7 | FileCheck %s --check-prefixes=CHECK | ||
|
||
declare i16 @llvm.bswap.i16(i16) readnone | ||
declare i32 @llvm.bswap.i32(i32) readnone | ||
declare i32 @llvm.bitreverse.i32(i32) readnone | ||
|
||
define i32 @brev_and_lhs_brev32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_and_lhs_brev32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: ands r0, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %a) | ||
%2 = and i32 %1, %b | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
||
define i32 @brev_or_lhs_brev32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_or_lhs_brev32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: orrs r0, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %a) | ||
%2 = or i32 %1, %b | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
||
define i32 @brev_xor_rhs_brev32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_xor_rhs_brev32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r1, r1 | ||
; CHECK-NEXT: eors r0, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %b) | ||
%2 = xor i32 %a, %1 | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
||
define i32 @brev_and_all_operand_multiuse(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_and_all_operand_multiuse: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r1, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: and.w r2, r0, r1 | ||
; CHECK-NEXT: rbit r2, r2 | ||
; CHECK-NEXT: muls r0, r2, r0 | ||
; CHECK-NEXT: muls r0, r1, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %a) | ||
%2 = tail call i32 @llvm.bitreverse.i32(i32 %b) | ||
%3 = and i32 %1, %2 | ||
%4 = tail call i32 @llvm.bitreverse.i32(i32 %3) | ||
%5 = mul i32 %1, %4 ;increase use of left bitreverse | ||
%6 = mul i32 %2, %5 ;increase use of right bitreverse | ||
|
||
ret i32 %6 | ||
} | ||
|
||
; negative test | ||
define i32 @brev_and_rhs_brev32_multiuse1(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_and_rhs_brev32_multiuse1: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r1, r1 | ||
; CHECK-NEXT: ands r0, r1 | ||
; CHECK-NEXT: rbit r1, r0 | ||
; CHECK-NEXT: muls r0, r1, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %b) | ||
%2 = and i32 %1, %a | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
%4 = mul i32 %2, %3 ;increase use of logical op | ||
ret i32 %4 | ||
} | ||
|
||
; negative test | ||
define i32 @brev_and_rhs_brev32_multiuse2(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_and_rhs_brev32_multiuse2: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r1, r1 | ||
; CHECK-NEXT: ands r0, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: muls r0, r1, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %b) | ||
%2 = and i32 %1, %a | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
%4 = mul i32 %1, %3 ;increase use of inner bitreverse | ||
ret i32 %4 | ||
} | ||
|
||
; negative test | ||
define i32 @brev_xor_rhs_bs32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: brev_xor_rhs_bs32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rev r1, r1 | ||
; CHECK-NEXT: eors r0, r1 | ||
; CHECK-NEXT: rbit r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bswap.i32(i32 %b) | ||
%2 = xor i32 %a, %1 | ||
%3 = tail call i32 @llvm.bitreverse.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | ||
; RUN: llc < %s -mtriple=thumbv7m-none-eabi -mattr=v7 | FileCheck %s --check-prefixes=CHECK | ||
|
||
declare i32 @llvm.bswap.i32(i32) readnone | ||
declare i64 @llvm.bswap.i64(i64) readnone | ||
declare i32 @llvm.bitreverse.i32(i32) readnone | ||
|
||
define i32 @bs_and_lhs_bs32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: bs_and_lhs_bs32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rev r0, r0 | ||
; CHECK-NEXT: ands r0, r1 | ||
; CHECK-NEXT: rev r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bswap.i32(i32 %a) | ||
%2 = and i32 %1, %b | ||
%3 = tail call i32 @llvm.bswap.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
||
define i64 @bs_or_rhs_bs64(i64 %a, i64 %b) #0 { | ||
; CHECK-LABEL: bs_or_rhs_bs64: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rev r2, r2 | ||
; CHECK-NEXT: orrs r1, r2 | ||
; CHECK-NEXT: rev r2, r1 | ||
; CHECK-NEXT: rev r1, r3 | ||
; CHECK-NEXT: orrs r0, r1 | ||
; CHECK-NEXT: rev r1, r0 | ||
; CHECK-NEXT: mov r0, r2 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i64 @llvm.bswap.i64(i64 %b) | ||
%2 = or i64 %a, %1 | ||
%3 = tail call i64 @llvm.bswap.i64(i64 %2) | ||
ret i64 %3 | ||
} | ||
|
||
define i32 @bs_and_all_operand_multiuse(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: bs_and_all_operand_multiuse: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rev r1, r1 | ||
; CHECK-NEXT: rev r0, r0 | ||
; CHECK-NEXT: and.w r2, r0, r1 | ||
; CHECK-NEXT: rev r2, r2 | ||
; CHECK-NEXT: muls r0, r2, r0 | ||
; CHECK-NEXT: muls r0, r1, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bswap.i32(i32 %a) | ||
%2 = tail call i32 @llvm.bswap.i32(i32 %b) | ||
%3 = and i32 %1, %2 | ||
%4 = tail call i32 @llvm.bswap.i32(i32 %3) | ||
%5 = mul i32 %1, %4 ;increase use of left bswap | ||
%6 = mul i32 %2, %5 ;increase use of right bswap | ||
|
||
ret i32 %6 | ||
} | ||
|
||
; negative test | ||
define i32 @bs_and_rhs_bs32_multiuse1(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: bs_and_rhs_bs32_multiuse1: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rev r1, r1 | ||
; CHECK-NEXT: ands r0, r1 | ||
; CHECK-NEXT: rev r1, r0 | ||
; CHECK-NEXT: muls r0, r1, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bswap.i32(i32 %b) | ||
%2 = and i32 %1, %a | ||
%3 = tail call i32 @llvm.bswap.i32(i32 %2) | ||
%4 = mul i32 %2, %3 ;increase use of logical op | ||
ret i32 %4 | ||
} | ||
|
||
; negative test | ||
define i32 @bs_xor_rhs_brev32(i32 %a, i32 %b) #0 { | ||
; CHECK-LABEL: bs_xor_rhs_brev32: | ||
; CHECK: @ %bb.0: | ||
; CHECK-NEXT: rbit r1, r1 | ||
; CHECK-NEXT: eors r0, r1 | ||
; CHECK-NEXT: rev r0, r0 | ||
; CHECK-NEXT: bx lr | ||
%1 = tail call i32 @llvm.bitreverse.i32(i32 %b) | ||
%2 = xor i32 %a, %1 | ||
%3 = tail call i32 @llvm.bswap.i32(i32 %2) | ||
ret i32 %3 | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters