Add test for recent instcombine vector shuffle enhancement
[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 ; Test fold of hi/lo vector halves
92 ; Test fold of unpack operation
93 define void @test10(<16 x i8>* %out, <16 x i8> %r, <16 x i8> %g, <16 x i8> %b, <16 x i8> %a) nounwind ssp {
94 ; CHECK: @test10
95 ; CHECK-NEXT: shufflevector
96 ; CHECK-NEXT: shufflevector
97 ; CHECK-NEXT: store
98 ; CHECK-NEXT: getelementptr
99 ; CHECK-NEXT: store
100 ; CHECK-NEXT: ret
101   %tmp1 = shufflevector <16 x i8> %r, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> ; <<8 x i8>> [#uses=1]
102   %tmp3 = shufflevector <8 x i8> %tmp1, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ; <<16 x i8>> [#uses=1]
103   %tmp4 = shufflevector <16 x i8> undef, <16 x i8> %tmp3, <16 x i32> <i32 16, i32 1, i32 17, i32 3, i32 18, i32 5, i32 19, i32 7, i32 20, i32 9, i32 21, i32 11, i32 22, i32 13, i32 23, i32 15> ; <<16 x i8>> [#uses=1]
104   %tmp6 = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7> ; <<8 x i8>> [#uses=1]
105   %tmp8 = shufflevector <8 x i8> %tmp6, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ; <<16 x i8>> [#uses=1]
106   %tmp9 = shufflevector <16 x i8> %tmp4, <16 x i8> %tmp8, <16 x i32> <i32 0, i32 16, i32 2, i32 17, i32 4, i32 18, i32 6, i32 19, i32 8, i32 20, i32 10, i32 21, i32 12, i32 22, i32 14, i32 23> ; <<16 x i8>> [#uses=1]
107   %tmp11 = shufflevector <16 x i8> %r, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> ; <<8 x i8>> [#uses=1]
108   %tmp13 = shufflevector <8 x i8> %tmp11, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ; <<16 x i8>> [#uses=1]
109   %tmp14 = shufflevector <16 x i8> undef, <16 x i8> %tmp13, <16 x i32> <i32 16, i32 1, i32 17, i32 3, i32 18, i32 5, i32 19, i32 7, i32 20, i32 9, i32 21, i32 11, i32 22, i32 13, i32 23, i32 15> ; <<16 x i8>> [#uses=1]
110   %tmp16 = shufflevector <16 x i8> %b, <16 x i8> undef, <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> ; <<8 x i8>> [#uses=1]
111   %tmp18 = shufflevector <8 x i8> %tmp16, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef> ; <<16 x i8>> [#uses=1]
112   %tmp19 = shufflevector <16 x i8> %tmp14, <16 x i8> %tmp18, <16 x i32> <i32 0, i32 16, i32 2, i32 17, i32 4, i32 18, i32 6, i32 19, i32 8, i32 20, i32 10, i32 21, i32 12, i32 22, i32 14, i32 23> ; <<16 x i8>> [#uses=1]
113   %arrayidx = getelementptr inbounds <16 x i8>* %out, i64 0 ; <<16 x i8>*> [#uses=1]
114   store <16 x i8> %tmp9, <16 x i8>* %arrayidx
115   %arrayidx24 = getelementptr inbounds <16 x i8>* %out, i64 1 ; <<16 x i8>*> [#uses=1]
116   store <16 x i8> %tmp19, <16 x i8>* %arrayidx24
117   ret void
118 }