From: Craig Topper Date: Tue, 4 Jul 2017 20:15:24 +0000 (+0000) Subject: Recommit r307064, "[InstCombine] Add test cases demonstrating creation of extra bswap... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=62eb0faea576c8e30a9dc57d5e1d249eeaa50142;p=llvm Recommit r307064, "[InstCombine] Add test cases demonstrating creation of extra bswap instrinsic calls when when optimizing bswap and bitwise ops when the bswaps have additional uses. NFC" The test check lines have now been fixed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307106 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Transforms/InstCombine/bswap-fold.ll b/test/Transforms/InstCombine/bswap-fold.ll index 845e0eab3fa..9a2cf5590ad 100644 --- a/test/Transforms/InstCombine/bswap-fold.ll +++ b/test/Transforms/InstCombine/bswap-fold.ll @@ -1,3 +1,4 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -instcombine -S | FileCheck %s ; rdar://5992453 @@ -280,6 +281,68 @@ define <2 x i32> @bs_xor32ivec(<2 x i32> %a, <2 x i32> %b) #0 { ret <2 x i32> %tmp2 } +define i64 @bs_and64_multiuse1(i64 %a, i64 %b) #0 { +; CHECK-LABEL: @bs_and64_multiuse1( +; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.bswap.i64(i64 [[A:%.*]]) +; CHECK-NEXT: [[TMP2:%.*]] = tail call i64 @llvm.bswap.i64(i64 [[B:%.*]]) +; CHECK-NEXT: [[TMP3:%.*]] = and i64 [[A]], [[B]] +; CHECK-NEXT: [[TMP6:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP3]]) +; CHECK-NEXT: [[TMP4:%.*]] = mul i64 [[TMP6]], [[TMP1]] +; CHECK-NEXT: [[TMP5:%.*]] = mul i64 [[TMP4]], [[TMP2]] +; CHECK-NEXT: ret i64 [[TMP5]] +; + %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a) + %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b) + %tmp3 = and i64 %tmp1, %tmp2 + %tmp4 = mul i64 %tmp3, %tmp1 ; to increase use count of the bswaps + %tmp5 = mul i64 %tmp4, %tmp2 ; to increase use count of the bswaps + ret i64 %tmp5 +} + +define i64 @bs_and64_multiuse2(i64 %a, i64 %b) #0 { +; CHECK-LABEL: @bs_and64_multiuse2( +; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.bswap.i64(i64 [[A:%.*]]) +; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[A]], [[B:%.*]] +; CHECK-NEXT: [[TMP3:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP2]]) +; CHECK-NEXT: [[TMP4:%.*]] = mul i64 [[TMP3]], [[TMP1]] +; CHECK-NEXT: ret i64 [[TMP4]] +; + %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a) + %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b) + %tmp3 = and i64 %tmp1, %tmp2 + %tmp4 = mul i64 %tmp3, %tmp1 ; to increase use count of the bswaps + ret i64 %tmp4 +} + +define i64 @bs_and64_multiuse3(i64 %a, i64 %b) #0 { +; CHECK-LABEL: @bs_and64_multiuse3( +; CHECK-NEXT: [[TMP2:%.*]] = tail call i64 @llvm.bswap.i64(i64 [[B:%.*]]) +; CHECK-NEXT: [[TMP1:%.*]] = and i64 [[A:%.*]], [[B]] +; CHECK-NEXT: [[TMP3:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP1]]) +; CHECK-NEXT: [[TMP4:%.*]] = mul i64 [[TMP3]], [[TMP2]] +; CHECK-NEXT: ret i64 [[TMP4]] +; + %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a) + %tmp2 = tail call i64 @llvm.bswap.i64(i64 %b) + %tmp3 = and i64 %tmp1, %tmp2 + %tmp4 = mul i64 %tmp3, %tmp2 ; to increase use count of the bswaps + ret i64 %tmp4 +} + +define i64 @bs_and64i_multiuse(i64 %a, i64 %b) #0 { +; CHECK-LABEL: @bs_and64i_multiuse( +; CHECK-NEXT: [[TMP1:%.*]] = tail call i64 @llvm.bswap.i64(i64 [[A:%.*]]) +; CHECK-NEXT: [[TMP2:%.*]] = and i64 [[A]], 129085117527228416 +; CHECK-NEXT: [[TMP4:%.*]] = call i64 @llvm.bswap.i64(i64 [[TMP2]]) +; CHECK-NEXT: [[TMP3:%.*]] = mul i64 [[TMP4]], [[TMP1]] +; CHECK-NEXT: ret i64 [[TMP3]] +; + %tmp1 = tail call i64 @llvm.bswap.i64(i64 %a) + %tmp2 = and i64 %tmp1, 1000000001 + %tmp3 = mul i64 %tmp2, %tmp1 ; to increase use count of the bswap + ret i64 %tmp3 +} + declare i16 @llvm.bswap.i16(i16) declare i32 @llvm.bswap.i32(i32) declare i64 @llvm.bswap.i64(i64)