From 0ef6a25e195bafa285d3b957f247bfb23b2cf704 Mon Sep 17 00:00:00 2001 From: Simon Pilgrim Date: Mon, 26 Oct 2020 16:11:03 +0000 Subject: [PATCH] [InstCombine] Add bswap test pattern using truncates --- llvm/test/Transforms/InstCombine/bswap.ll | 33 +++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/bswap.ll b/llvm/test/Transforms/InstCombine/bswap.ll index 936ed12..65e2a36 100644 --- a/llvm/test/Transforms/InstCombine/bswap.ll +++ b/llvm/test/Transforms/InstCombine/bswap.ll @@ -594,6 +594,39 @@ define i64 @bswap_and_mask_2(i64 %0) { ret i64 %7 } +define i64 @bswap_trunc(i64 %x01234567) { +; CHECK-LABEL: @bswap_trunc( +; CHECK-NEXT: [[X7ZZZZZZZ:%.*]] = shl i64 [[X01234567:%.*]], 56 +; CHECK-NEXT: [[XZ0123456:%.*]] = lshr i64 [[X01234567]], 8 +; CHECK-NEXT: [[XZZZZZ012:%.*]] = lshr i64 [[X01234567]], 40 +; CHECK-NEXT: [[X3456:%.*]] = trunc i64 [[XZ0123456]] to i32 +; CHECK-NEXT: [[XZ012:%.*]] = trunc i64 [[XZZZZZ012]] to i32 +; CHECK-NEXT: [[X6543:%.*]] = call i32 @llvm.bswap.i32(i32 [[X3456]]) +; CHECK-NEXT: [[X210Z:%.*]] = call i32 @llvm.bswap.i32(i32 [[XZ012]]) +; CHECK-NEXT: [[XZ210:%.*]] = lshr exact i32 [[X210Z]], 8 +; CHECK-NEXT: [[XZZZZ6543:%.*]] = zext i32 [[X6543]] to i64 +; CHECK-NEXT: [[XZZZZZ210:%.*]] = zext i32 [[XZ210]] to i64 +; CHECK-NEXT: [[XZ6543ZZZ:%.*]] = shl nuw nsw i64 [[XZZZZ6543]], 24 +; CHECK-NEXT: [[XZ6543210:%.*]] = or i64 [[XZ6543ZZZ]], [[XZZZZZ210]] +; CHECK-NEXT: [[X76543210:%.*]] = or i64 [[XZ6543210]], [[X7ZZZZZZZ]] +; CHECK-NEXT: ret i64 [[X76543210]] +; + %x7zzzzzzz = shl i64 %x01234567, 56 + %xz0123456 = lshr i64 %x01234567, 8 + %xzzzzz012 = lshr i64 %x01234567, 40 + %x3456 = trunc i64 %xz0123456 to i32 + %xz012 = trunc i64 %xzzzzz012 to i32 + %x6543 = call i32 @llvm.bswap.i32(i32 %x3456) + %x210z = call i32 @llvm.bswap.i32(i32 %xz012) + %xz210 = lshr i32 %x210z, 8 + %xzzzz6543 = zext i32 %x6543 to i64 + %xzzzzz210 = zext i32 %xz210 to i64 + %xz6543zzz = shl i64 %xzzzz6543, 24 + %xz6543210 = or i64 %xzzzzz210, %xz6543zzz + %x76543210 = or i64 %xz6543210, %x7zzzzzzz + ret i64 %x76543210 +} + define i32 @shuf_4bytes(<4 x i8> %x) { ; CHECK-LABEL: @shuf_4bytes( ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i8> [[X:%.*]] to i32 -- 2.7.4