blob: 2d4dc501a53abe51a77426b70a0c81c220277239 [file] [log] [blame]
Chris Lattnerda2b6ee2006-03-17 20:04:40 +00001; Test that vectors are scalarized/lowered correctly.
Dan Gohmanc8054d92009-09-09 00:09:15 +00002; RUN: llc < %s
Tanya Lattner3f047732008-02-19 01:41:04 +00003
4%d8 = type <8 x double>
Chris Lattnerda2b6ee2006-03-17 20:04:40 +00005%f1 = type <1 x float>
6%f2 = type <2 x float>
7%f4 = type <4 x float>
8%f8 = type <8 x float>
Tanya Lattner3f047732008-02-19 01:41:04 +00009%i4 = type <4 x i32>
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000010
Chris Lattnera982c7e2006-03-19 00:20:03 +000011;;; TEST HANDLING OF VARIOUS VECTOR SIZES
12
Tanya Lattner3f047732008-02-19 01:41:04 +000013define void @test_f1(%f1* %P, %f1* %Q, %f1* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000014 %p = load %f1, %f1* %P ; <%f1> [#uses=1]
15 %q = load %f1, %f1* %Q ; <%f1> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000016 %R = fadd %f1 %p, %q ; <%f1> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000017 store %f1 %R, %f1* %S
18 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000019}
20
Tanya Lattner3f047732008-02-19 01:41:04 +000021define void @test_f2(%f2* %P, %f2* %Q, %f2* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000022 %p = load %f2, %f2* %P ; <%f2> [#uses=1]
23 %q = load %f2, %f2* %Q ; <%f2> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000024 %R = fadd %f2 %p, %q ; <%f2> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000025 store %f2 %R, %f2* %S
26 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000027}
28
Tanya Lattner3f047732008-02-19 01:41:04 +000029define void @test_f4(%f4* %P, %f4* %Q, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000030 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
31 %q = load %f4, %f4* %Q ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000032 %R = fadd %f4 %p, %q ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000033 store %f4 %R, %f4* %S
34 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000035}
36
Tanya Lattner3f047732008-02-19 01:41:04 +000037define void @test_f8(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000038 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
39 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000040 %R = fadd %f8 %p, %q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000041 store %f8 %R, %f8* %S
42 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000043}
Chris Lattnera982c7e2006-03-19 00:20:03 +000044
Tanya Lattner3f047732008-02-19 01:41:04 +000045define void @test_fmul(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000046 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
47 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000048 %R = fmul %f8 %p, %q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000049 store %f8 %R, %f8* %S
50 ret void
Chris Lattnera7afeff2006-03-21 18:27:27 +000051}
Chris Lattnerde690972006-05-24 00:12:50 +000052
Tanya Lattner3f047732008-02-19 01:41:04 +000053define void @test_div(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000054 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
55 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000056 %R = fdiv %f8 %p, %q ; <%f8> [#uses=1]
57 store %f8 %R, %f8* %S
58 ret void
Chris Lattnerde690972006-05-24 00:12:50 +000059}
60
Chris Lattnera982c7e2006-03-19 00:20:03 +000061;;; TEST VECTOR CONSTRUCTS
62
Tanya Lattner3f047732008-02-19 01:41:04 +000063
64define void @test_cst(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000065 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000066 %R = fadd %f4 %p, < float 0x3FB99999A0000000, float 1.000000e+00, float 2.000000e+00, float 4.500000e+00 > ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000067 store %f4 %R, %f4* %S
68 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000069}
70
Tanya Lattner3f047732008-02-19 01:41:04 +000071define void @test_zero(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000072 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000073 %R = fadd %f4 %p, zeroinitializer ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000074 store %f4 %R, %f4* %S
75 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000076}
77
Tanya Lattner3f047732008-02-19 01:41:04 +000078define void @test_undef(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000079 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000080 %R = fadd %f4 %p, undef ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000081 store %f4 %R, %f4* %S
82 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000083}
Chris Lattner891af0b2006-03-19 01:27:04 +000084
Tanya Lattner3f047732008-02-19 01:41:04 +000085define void @test_constant_insert(%f4* %S) {
86 %R = insertelement %f4 zeroinitializer, float 1.000000e+01, i32 0 ; <%f4> [#uses=1]
87 store %f4 %R, %f4* %S
88 ret void
Chris Lattner891af0b2006-03-19 01:27:04 +000089}
90
Tanya Lattner3f047732008-02-19 01:41:04 +000091define void @test_variable_buildvector(float %F, %f4* %S) {
92 %R = insertelement %f4 zeroinitializer, float %F, i32 0 ; <%f4> [#uses=1]
93 store %f4 %R, %f4* %S
94 ret void
Chris Lattner891af0b2006-03-19 01:27:04 +000095}
Chris Lattner1d096812006-03-19 04:45:11 +000096
Tanya Lattner3f047732008-02-19 01:41:04 +000097define void @test_scalar_to_vector(float %F, %f4* %S) {
98 %R = insertelement %f4 undef, float %F, i32 0 ; <%f4> [#uses=1]
99 store %f4 %R, %f4* %S
100 ret void
Chris Lattner131cfed2006-03-19 05:46:51 +0000101}
102
Tanya Lattner3f047732008-02-19 01:41:04 +0000103define float @test_extract_elt(%f8* %P) {
David Blaikiea79ac142015-02-27 21:17:42 +0000104 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000105 %R = extractelement %f8 %p, i32 3 ; <float> [#uses=1]
106 ret float %R
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000107}
108
Tanya Lattner3f047732008-02-19 01:41:04 +0000109define double @test_extract_elt2(%d8* %P) {
David Blaikiea79ac142015-02-27 21:17:42 +0000110 %p = load %d8, %d8* %P ; <%d8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000111 %R = extractelement %d8 %p, i32 3 ; <double> [#uses=1]
112 ret double %R
Chris Lattnera2834fa2006-03-31 17:59:16 +0000113}
114
Tanya Lattner3f047732008-02-19 01:41:04 +0000115define void @test_cast_1(%f4* %b, %i4* %a) {
David Blaikiea79ac142015-02-27 21:17:42 +0000116 %tmp = load %f4, %f4* %b ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +0000117 %tmp2 = fadd %f4 %tmp, < float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00 > ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000118 %tmp3 = bitcast %f4 %tmp2 to %i4 ; <%i4> [#uses=1]
119 %tmp4 = add %i4 %tmp3, < i32 1, i32 2, i32 3, i32 4 > ; <%i4> [#uses=1]
120 store %i4 %tmp4, %i4* %a
121 ret void
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000122}
123
Tanya Lattner3f047732008-02-19 01:41:04 +0000124define void @test_cast_2(%f8* %a, <8 x i32>* %b) {
David Blaikiea79ac142015-02-27 21:17:42 +0000125 %T = load %f8, %f8* %a ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000126 %T2 = bitcast %f8 %T to <8 x i32> ; <<8 x i32>> [#uses=1]
127 store <8 x i32> %T2, <8 x i32>* %b
128 ret void
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000129}
130
Chris Lattner1d096812006-03-19 04:45:11 +0000131;;; TEST IMPORTANT IDIOMS
132
Tanya Lattner3f047732008-02-19 01:41:04 +0000133define void @splat(%f4* %P, %f4* %Q, float %X) {
134 %tmp = insertelement %f4 undef, float %X, i32 0 ; <%f4> [#uses=1]
135 %tmp2 = insertelement %f4 %tmp, float %X, i32 1 ; <%f4> [#uses=1]
136 %tmp4 = insertelement %f4 %tmp2, float %X, i32 2 ; <%f4> [#uses=1]
137 %tmp6 = insertelement %f4 %tmp4, float %X, i32 3 ; <%f4> [#uses=1]
David Blaikiea79ac142015-02-27 21:17:42 +0000138 %q = load %f4, %f4* %Q ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +0000139 %R = fadd %f4 %q, %tmp6 ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000140 store %f4 %R, %f4* %P
141 ret void
Chris Lattner1d096812006-03-19 04:45:11 +0000142}
143
Tanya Lattner3f047732008-02-19 01:41:04 +0000144define void @splat_i4(%i4* %P, %i4* %Q, i32 %X) {
145 %tmp = insertelement %i4 undef, i32 %X, i32 0 ; <%i4> [#uses=1]
146 %tmp2 = insertelement %i4 %tmp, i32 %X, i32 1 ; <%i4> [#uses=1]
147 %tmp4 = insertelement %i4 %tmp2, i32 %X, i32 2 ; <%i4> [#uses=1]
148 %tmp6 = insertelement %i4 %tmp4, i32 %X, i32 3 ; <%i4> [#uses=1]
David Blaikiea79ac142015-02-27 21:17:42 +0000149 %q = load %i4, %i4* %Q ; <%i4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000150 %R = add %i4 %q, %tmp6 ; <%i4> [#uses=1]
151 store %i4 %R, %i4* %P
152 ret void
Chris Lattnera7afeff2006-03-21 18:27:27 +0000153}
Duncan Sandsb8d3caf2012-11-13 13:01:58 +0000154
155define <2 x i32*> @vector_gep(<2 x [3 x {i32, i32}]*> %a) {
David Blaikie79e6c742015-02-27 19:29:02 +0000156 %w = getelementptr [3 x {i32, i32}], <2 x [3 x {i32, i32}]*> %a, <2 x i32> <i32 1, i32 2>, <2 x i32> <i32 2, i32 3>, <2 x i32> <i32 1, i32 1>
Duncan Sandsb8d3caf2012-11-13 13:01:58 +0000157 ret <2 x i32*> %w
158}
James Y Knight5b8217b2015-10-09 20:10:14 +0000159
160define i32 @extractelt_constant_bitcast() {
161 %1 = bitcast i64 4 to <2 x i32>
162 %2 = extractelement <2 x i32> %1, i32 0
163 ret i32 %2
164}