[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / InstCombine / bswap-inseltpoison.ll
blob7d5bcbed1447de8d2eec87bc57a35ebd4ebb4df0
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
6 ; A copy of bswap.ll, with undef at insertelement/shufflevector replaced with
7 ; poison
9 define i32 @shuf_4bytes(<4 x i8> %x) {
10 ; CHECK-LABEL: @shuf_4bytes(
11 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i8> [[X:%.*]] to i32
12 ; CHECK-NEXT:    [[CAST:%.*]] = call i32 @llvm.bswap.i32(i32 [[TMP1]])
13 ; CHECK-NEXT:    ret i32 [[CAST]]
15   %bswap = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
16   %cast = bitcast <4 x i8> %bswap to i32
17   ret i32 %cast
20 define i32 @shuf_load_4bytes(<4 x i8>* %p) {
21 ; CHECK-LABEL: @shuf_load_4bytes(
22 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i8>* [[P:%.*]] to i32*
23 ; CHECK-NEXT:    [[X1:%.*]] = load i32, i32* [[TMP1]], align 4
24 ; CHECK-NEXT:    [[CAST:%.*]] = call i32 @llvm.bswap.i32(i32 [[X1]])
25 ; CHECK-NEXT:    ret i32 [[CAST]]
27   %x = load <4 x i8>, <4 x i8>* %p
28   %bswap = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 undef, i32 0>
29   %cast = bitcast <4 x i8> %bswap to i32
30   ret i32 %cast
33 define i32 @shuf_bitcast_twice_4bytes(i32 %x) {
34 ; CHECK-LABEL: @shuf_bitcast_twice_4bytes(
35 ; CHECK-NEXT:    [[CAST2:%.*]] = call i32 @llvm.bswap.i32(i32 [[X:%.*]])
36 ; CHECK-NEXT:    ret i32 [[CAST2]]
38   %cast1 = bitcast i32 %x to <4 x i8>
39   %bswap = shufflevector <4 x i8> %cast1, <4 x i8> poison, <4 x i32> <i32 undef, i32 2, i32 1, i32 0>
40   %cast2 = bitcast <4 x i8> %bswap to i32
41   ret i32 %cast2
44 ; Negative test - extra use
45 declare void @use(<4 x i8>)
47 define i32 @shuf_4bytes_extra_use(<4 x i8> %x) {
48 ; CHECK-LABEL: @shuf_4bytes_extra_use(
49 ; CHECK-NEXT:    [[BSWAP:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
50 ; CHECK-NEXT:    call void @use(<4 x i8> [[BSWAP]])
51 ; CHECK-NEXT:    [[CAST:%.*]] = bitcast <4 x i8> [[BSWAP]] to i32
52 ; CHECK-NEXT:    ret i32 [[CAST]]
54   %bswap = shufflevector <4 x i8> %x, <4 x i8> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>
55   call void @use(<4 x i8> %bswap)
56   %cast = bitcast <4 x i8> %bswap to i32
57   ret i32 %cast
60 ; Negative test - scalar type is not in the data layout
62 define i128 @shuf_16bytes(<16 x i8> %x) {
63 ; CHECK-LABEL: @shuf_16bytes(
64 ; CHECK-NEXT:    [[BSWAP:%.*]] = shufflevector <16 x i8> [[X:%.*]], <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
65 ; CHECK-NEXT:    [[CAST:%.*]] = bitcast <16 x i8> [[BSWAP]] to i128
66 ; CHECK-NEXT:    ret i128 [[CAST]]
68   %bswap = shufflevector <16 x i8> %x, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
69   %cast = bitcast <16 x i8> %bswap to i128
70   ret i128 %cast
73 ; Negative test - don't touch widening shuffles (for now)
75 define i32 @shuf_2bytes_widening(<2 x i8> %x) {
76 ; CHECK-LABEL: @shuf_2bytes_widening(
77 ; CHECK-NEXT:    [[BSWAP:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> poison, <4 x i32> <i32 1, i32 0, i32 undef, i32 undef>
78 ; CHECK-NEXT:    [[CAST:%.*]] = bitcast <4 x i8> [[BSWAP]] to i32
79 ; CHECK-NEXT:    ret i32 [[CAST]]
81   %bswap = shufflevector <2 x i8> %x, <2 x i8> poison, <4 x i32> <i32 1, i32 0, i32 undef, i32 undef>
82   %cast = bitcast <4 x i8> %bswap to i32
83   ret i32 %cast
86 declare i32 @llvm.fshl.i32(i32, i32, i32)
87 declare i32 @llvm.fshr.i32(i32, i32, i32)