InstCombine: Match min/max hidden by sext/zext
[oota-llvm.git] / test / Transforms / InstCombine / vec_shuffle.ll
1 ; RUN: opt < %s -instcombine -S | FileCheck %s
2
3 %T = type <4 x float>
4
5
6 define %T @test1(%T %v1) {
7 ; CHECK: @test1
8 ; CHECK: ret %T %v1
9   %v2 = shufflevector %T %v1, %T undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
10   ret %T %v2
11 }
12
13 define %T @test2(%T %v1) {
14 ; CHECK: @test2
15 ; CHECK: ret %T %v1
16   %v2 = shufflevector %T %v1, %T %v1, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
17   ret %T %v2
18 }
19
20 define float @test3(%T %A, %T %B, float %f) {
21 ; CHECK: @test3
22 ; CHECK: ret float %f
23         %C = insertelement %T %A, float %f, i32 0
24         %D = shufflevector %T %C, %T %B, <4 x i32> <i32 5, i32 0, i32 2, i32 7>
25         %E = extractelement %T %D, i32 1
26         ret float %E
27 }
28
29 define i32 @test4(<4 x i32> %X) {
30 ; CHECK: @test4
31 ; CHECK-NEXT: extractelement
32 ; CHECK-NEXT: ret 
33         %tmp152.i53899.i = shufflevector <4 x i32> %X, <4 x i32> undef, <4 x i32> zeroinitializer
34         %tmp34 = extractelement <4 x i32> %tmp152.i53899.i, i32 0
35         ret i32 %tmp34
36 }
37
38 define i32 @test5(<4 x i32> %X) {
39 ; CHECK: @test5
40 ; CHECK-NEXT: extractelement
41 ; CHECK-NEXT: ret 
42         %tmp152.i53899.i = shufflevector <4 x i32> %X, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 undef, i32 undef>
43         %tmp34 = extractelement <4 x i32> %tmp152.i53899.i, i32 0
44         ret i32 %tmp34
45 }
46
47 define float @test6(<4 x float> %X) {
48 ; CHECK: @test6
49 ; CHECK-NEXT: extractelement
50 ; CHECK-NEXT: ret 
51         %X1 = bitcast <4 x float> %X to <4 x i32>
52         %tmp152.i53899.i = shufflevector <4 x i32> %X1, <4 x i32> undef, <4 x i32> zeroinitializer
53         %tmp152.i53900.i = bitcast <4 x i32> %tmp152.i53899.i to <4 x float>
54         %tmp34 = extractelement <4 x float> %tmp152.i53900.i, i32 0
55         ret float %tmp34
56 }
57
58 define <4 x float> @test7(<4 x float> %tmp45.i) {
59 ; CHECK: @test7
60 ; CHECK-NEXT: ret %T %tmp45.i
61         %tmp1642.i = shufflevector <4 x float> %tmp45.i, <4 x float> undef, <4 x i32> < i32 0, i32 1, i32 6, i32 7 >
62         ret <4 x float> %tmp1642.i
63 }
64
65 ; This should turn into a single shuffle.
66 define <4 x float> @test8(<4 x float> %tmp, <4 x float> %tmp1) {
67 ; CHECK: @test8
68 ; CHECK-NEXT: shufflevector
69 ; CHECK-NEXT: ret
70         %tmp4 = extractelement <4 x float> %tmp, i32 1
71         %tmp2 = extractelement <4 x float> %tmp, i32 3
72         %tmp1.upgrd.1 = extractelement <4 x float> %tmp1, i32 0
73         %tmp128 = insertelement <4 x float> undef, float %tmp4, i32 0
74         %tmp130 = insertelement <4 x float> %tmp128, float undef, i32 1
75         %tmp132 = insertelement <4 x float> %tmp130, float %tmp2, i32 2 
76         %tmp134 = insertelement <4 x float> %tmp132, float %tmp1.upgrd.1, i32 3
77         ret <4 x float> %tmp134
78 }
79
80 ; Test fold of two shuffles where the first shuffle vectors inputs are a
81 ; different length then the second.
82 define <4 x i8> @test9(<16 x i8> %tmp6) nounwind {
83 ; CHECK: @test9
84 ; CHECK-NEXT: shufflevector
85 ; CHECK-NEXT: ret
86         %tmp7 = shufflevector <16 x i8> %tmp6, <16 x i8> undef, <4 x i32> < i32 13, i32 9, i32 4, i32 13 >              ; <<4 x i8>> [#uses=1]
87         %tmp9 = shufflevector <4 x i8> %tmp7, <4 x i8> undef, <4 x i32> < i32 3, i32 1, i32 2, i32 0 >          ; <<4 x i8>> [#uses=1]
88         ret <4 x i8> %tmp9
89 }
90
91 ; Same as test9, but make sure that "undef" mask values are not confused with
92 ; mask values of 2*N, where N is the mask length.  These shuffles should not
93 ; be folded (because [8,9,4,8] may not be a mask supported by the target).
94 define <4 x i8> @test9a(<16 x i8> %tmp6) nounwind {
95 ; CHECK: @test9a
96 ; CHECK-NEXT: shufflevector
97 ; CHECK-NEXT: shufflevector
98 ; CHECK-NEXT: ret
99         %tmp7 = shufflevector <16 x i8> %tmp6, <16 x i8> undef, <4 x i32> < i32 undef, i32 9, i32 4, i32 8 >            ; <<4 x i8>> [#uses=1]
100         %tmp9 = shufflevector <4 x i8> %tmp7, <4 x i8> undef, <4 x i32> < i32 3, i32 1, i32 2, i32 0 >          ; <<4 x i8>> [#uses=1]
101         ret <4 x i8> %tmp9
102 }
103
104 ; Redundant vector splats should be removed.  Radar 8597790.
105 define <4 x i32> @test10(<4 x i32> %tmp5) nounwind {
106 ; CHECK: @test10
107 ; CHECK-NEXT: shufflevector
108 ; CHECK-NEXT: ret
109   %tmp6 = shufflevector <4 x i32> %tmp5, <4 x i32> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
110   %tmp7 = shufflevector <4 x i32> %tmp6, <4 x i32> undef, <4 x i32> zeroinitializer
111   ret <4 x i32> %tmp7
112 }