[llvm] a6ad077 - [InstCombine] Add i8 bitreverse by multiplication test patterns
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 23 07:50:42 PDT 2020
Author: Simon Pilgrim
Date: 2020-10-23T15:39:57+01:00
New Revision: a6ad077f5d3979c0c9decb1d41660a91fe44fe0a
URL: https://github.com/llvm/llvm-project/commit/a6ad077f5d3979c0c9decb1d41660a91fe44fe0a
DIFF: https://github.com/llvm/llvm-project/commit/a6ad077f5d3979c0c9decb1d41660a91fe44fe0a.diff
LOG: [InstCombine] Add i8 bitreverse by multiplication test patterns
Pulled from bit twiddling hacks webpage
Added:
Modified:
llvm/test/Transforms/InstCombine/bitreverse.ll
Removed:
################################################################################
diff --git a/llvm/test/Transforms/InstCombine/bitreverse.ll b/llvm/test/Transforms/InstCombine/bitreverse.ll
index 72b95aa894e4..2d33904819c7 100644
--- a/llvm/test/Transforms/InstCombine/bitreverse.ll
+++ b/llvm/test/Transforms/InstCombine/bitreverse.ll
@@ -271,3 +271,67 @@ define <2 x i8> @rev8_xor_vector(<2 x i8> %0) {
%16 = or <2 x i8> %14, %15
ret <2 x i8> %16
}
+
+; bitreverse8(x) = ((x * 0x0202020202ULL) & 0x010884422010ULL) % 1023
+define i8 @rev8_mul_and_urem(i8 %0) {
+; CHECK-LABEL: @rev8_mul_and_urem(
+; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP0:%.*]] to i64
+; CHECK-NEXT: [[TMP3:%.*]] = mul nuw nsw i64 [[TMP2]], 8623620610
+; CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 1136090292240
+; CHECK-NEXT: [[TMP5:%.*]] = urem i64 [[TMP4]], 1023
+; CHECK-NEXT: [[TMP6:%.*]] = trunc i64 [[TMP5]] to i8
+; CHECK-NEXT: ret i8 [[TMP6]]
+;
+ %2 = zext i8 %0 to i64
+ %3 = mul nuw nsw i64 %2, 8623620610
+ %4 = and i64 %3, 1136090292240
+ %5 = urem i64 %4, 1023
+ %6 = trunc i64 %5 to i8
+ ret i8 %6
+}
+
+; bitreverse8(x) = ((x * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL >> 32
+define i8 @rev8_mul_and_mul(i8 %0) {
+; CHECK-LABEL: @rev8_mul_and_mul(
+; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP0:%.*]] to i64
+; CHECK-NEXT: [[TMP3:%.*]] = mul nuw nsw i64 [[TMP2]], 2149582850
+; CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 36578664720
+; CHECK-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], 4311810305
+; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP5]], 32
+; CHECK-NEXT: [[TMP7:%.*]] = trunc i64 [[TMP6]] to i8
+; CHECK-NEXT: ret i8 [[TMP7]]
+;
+ %2 = zext i8 %0 to i64
+ %3 = mul nuw nsw i64 %2, 2149582850
+ %4 = and i64 %3, 36578664720
+ %5 = mul i64 %4, 4311810305
+ %6 = lshr i64 %5, 32
+ %7 = trunc i64 %6 to i8
+ ret i8 %7
+}
+
+; bitreverse8(x) = (((x * 0x0802LU) & 0x22110LU) | ((x * 0x8020LU) & 0x88440LU)) * 0x10101LU >> 16
+define i8 @rev8_mul_and_lshr(i8 %0) {
+; CHECK-LABEL: @rev8_mul_and_lshr(
+; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP0:%.*]] to i64
+; CHECK-NEXT: [[TMP3:%.*]] = mul nuw nsw i64 [[TMP2]], 2050
+; CHECK-NEXT: [[TMP4:%.*]] = and i64 [[TMP3]], 139536
+; CHECK-NEXT: [[TMP5:%.*]] = mul nuw nsw i64 [[TMP2]], 32800
+; CHECK-NEXT: [[TMP6:%.*]] = and i64 [[TMP5]], 558144
+; CHECK-NEXT: [[TMP7:%.*]] = or i64 [[TMP4]], [[TMP6]]
+; CHECK-NEXT: [[TMP8:%.*]] = mul nuw nsw i64 [[TMP7]], 65793
+; CHECK-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP8]], 16
+; CHECK-NEXT: [[TMP10:%.*]] = trunc i64 [[TMP9]] to i8
+; CHECK-NEXT: ret i8 [[TMP10]]
+;
+ %2 = zext i8 %0 to i64
+ %3 = mul nuw nsw i64 %2, 2050
+ %4 = and i64 %3, 139536
+ %5 = mul nuw nsw i64 %2, 32800
+ %6 = and i64 %5, 558144
+ %7 = or i64 %4, %6
+ %8 = mul nuw nsw i64 %7, 65793
+ %9 = lshr i64 %8, 16
+ %10 = trunc i64 %9 to i8
+ ret i8 %10
+}
More information about the llvm-commits
mailing list