blob: 9c0cacdcd8788997fb807c0d8dfb8e3f945ca388 [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
Dylan McKaydb370bd2017-02-08 10:24:18 +00004; Bug: PR31898
5; XFAIL: avr
6
Tanya Lattner3f047732008-02-19 01:41:04 +00007%d8 = type <8 x double>
Chris Lattnerda2b6ee2006-03-17 20:04:40 +00008%f1 = type <1 x float>
9%f2 = type <2 x float>
10%f4 = type <4 x float>
11%f8 = type <8 x float>
Tanya Lattner3f047732008-02-19 01:41:04 +000012%i4 = type <4 x i32>
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000013
Chris Lattnera982c7e2006-03-19 00:20:03 +000014;;; TEST HANDLING OF VARIOUS VECTOR SIZES
15
Tanya Lattner3f047732008-02-19 01:41:04 +000016define void @test_f1(%f1* %P, %f1* %Q, %f1* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000017 %p = load %f1, %f1* %P ; <%f1> [#uses=1]
18 %q = load %f1, %f1* %Q ; <%f1> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000019 %R = fadd %f1 %p, %q ; <%f1> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000020 store %f1 %R, %f1* %S
21 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000022}
23
Tanya Lattner3f047732008-02-19 01:41:04 +000024define void @test_f2(%f2* %P, %f2* %Q, %f2* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000025 %p = load %f2, %f2* %P ; <%f2> [#uses=1]
26 %q = load %f2, %f2* %Q ; <%f2> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000027 %R = fadd %f2 %p, %q ; <%f2> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000028 store %f2 %R, %f2* %S
29 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000030}
31
Tanya Lattner3f047732008-02-19 01:41:04 +000032define void @test_f4(%f4* %P, %f4* %Q, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000033 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
34 %q = load %f4, %f4* %Q ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000035 %R = fadd %f4 %p, %q ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000036 store %f4 %R, %f4* %S
37 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000038}
39
Tanya Lattner3f047732008-02-19 01:41:04 +000040define void @test_f8(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000041 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
42 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000043 %R = fadd %f8 %p, %q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000044 store %f8 %R, %f8* %S
45 ret void
Chris Lattnerda2b6ee2006-03-17 20:04:40 +000046}
Chris Lattnera982c7e2006-03-19 00:20:03 +000047
Tanya Lattner3f047732008-02-19 01:41:04 +000048define void @test_fmul(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000049 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
50 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000051 %R = fmul %f8 %p, %q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000052 store %f8 %R, %f8* %S
53 ret void
Chris Lattnera7afeff2006-03-21 18:27:27 +000054}
Chris Lattnerde690972006-05-24 00:12:50 +000055
Tanya Lattner3f047732008-02-19 01:41:04 +000056define void @test_div(%f8* %P, %f8* %Q, %f8* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000057 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
58 %q = load %f8, %f8* %Q ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000059 %R = fdiv %f8 %p, %q ; <%f8> [#uses=1]
60 store %f8 %R, %f8* %S
61 ret void
Chris Lattnerde690972006-05-24 00:12:50 +000062}
63
Chris Lattnera982c7e2006-03-19 00:20:03 +000064;;; TEST VECTOR CONSTRUCTS
65
Tanya Lattner3f047732008-02-19 01:41:04 +000066
67define void @test_cst(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000068 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000069 %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 +000070 store %f4 %R, %f4* %S
71 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000072}
73
Tanya Lattner3f047732008-02-19 01:41:04 +000074define void @test_zero(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000075 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000076 %R = fadd %f4 %p, zeroinitializer ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000077 store %f4 %R, %f4* %S
78 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000079}
80
Tanya Lattner3f047732008-02-19 01:41:04 +000081define void @test_undef(%f4* %P, %f4* %S) {
David Blaikiea79ac142015-02-27 21:17:42 +000082 %p = load %f4, %f4* %P ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +000083 %R = fadd %f4 %p, undef ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +000084 store %f4 %R, %f4* %S
85 ret void
Chris Lattnera982c7e2006-03-19 00:20:03 +000086}
Chris Lattner891af0b2006-03-19 01:27:04 +000087
Tanya Lattner3f047732008-02-19 01:41:04 +000088define void @test_constant_insert(%f4* %S) {
89 %R = insertelement %f4 zeroinitializer, float 1.000000e+01, i32 0 ; <%f4> [#uses=1]
90 store %f4 %R, %f4* %S
91 ret void
Chris Lattner891af0b2006-03-19 01:27:04 +000092}
93
Tanya Lattner3f047732008-02-19 01:41:04 +000094define void @test_variable_buildvector(float %F, %f4* %S) {
95 %R = insertelement %f4 zeroinitializer, float %F, i32 0 ; <%f4> [#uses=1]
96 store %f4 %R, %f4* %S
97 ret void
Chris Lattner891af0b2006-03-19 01:27:04 +000098}
Chris Lattner1d096812006-03-19 04:45:11 +000099
Tanya Lattner3f047732008-02-19 01:41:04 +0000100define void @test_scalar_to_vector(float %F, %f4* %S) {
101 %R = insertelement %f4 undef, float %F, i32 0 ; <%f4> [#uses=1]
102 store %f4 %R, %f4* %S
103 ret void
Chris Lattner131cfed2006-03-19 05:46:51 +0000104}
105
Tanya Lattner3f047732008-02-19 01:41:04 +0000106define float @test_extract_elt(%f8* %P) {
David Blaikiea79ac142015-02-27 21:17:42 +0000107 %p = load %f8, %f8* %P ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000108 %R = extractelement %f8 %p, i32 3 ; <float> [#uses=1]
109 ret float %R
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000110}
111
Tanya Lattner3f047732008-02-19 01:41:04 +0000112define double @test_extract_elt2(%d8* %P) {
David Blaikiea79ac142015-02-27 21:17:42 +0000113 %p = load %d8, %d8* %P ; <%d8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000114 %R = extractelement %d8 %p, i32 3 ; <double> [#uses=1]
115 ret double %R
Chris Lattnera2834fa2006-03-31 17:59:16 +0000116}
117
Tanya Lattner3f047732008-02-19 01:41:04 +0000118define void @test_cast_1(%f4* %b, %i4* %a) {
David Blaikiea79ac142015-02-27 21:17:42 +0000119 %tmp = load %f4, %f4* %b ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +0000120 %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 +0000121 %tmp3 = bitcast %f4 %tmp2 to %i4 ; <%i4> [#uses=1]
122 %tmp4 = add %i4 %tmp3, < i32 1, i32 2, i32 3, i32 4 > ; <%i4> [#uses=1]
123 store %i4 %tmp4, %i4* %a
124 ret void
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000125}
126
Tanya Lattner3f047732008-02-19 01:41:04 +0000127define void @test_cast_2(%f8* %a, <8 x i32>* %b) {
David Blaikiea79ac142015-02-27 21:17:42 +0000128 %T = load %f8, %f8* %a ; <%f8> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000129 %T2 = bitcast %f8 %T to <8 x i32> ; <<8 x i32>> [#uses=1]
130 store <8 x i32> %T2, <8 x i32>* %b
131 ret void
Chris Lattner64b7e9a2006-03-23 21:15:57 +0000132}
133
Chris Lattner1d096812006-03-19 04:45:11 +0000134;;; TEST IMPORTANT IDIOMS
135
Tanya Lattner3f047732008-02-19 01:41:04 +0000136define void @splat(%f4* %P, %f4* %Q, float %X) {
137 %tmp = insertelement %f4 undef, float %X, i32 0 ; <%f4> [#uses=1]
138 %tmp2 = insertelement %f4 %tmp, float %X, i32 1 ; <%f4> [#uses=1]
139 %tmp4 = insertelement %f4 %tmp2, float %X, i32 2 ; <%f4> [#uses=1]
140 %tmp6 = insertelement %f4 %tmp4, float %X, i32 3 ; <%f4> [#uses=1]
David Blaikiea79ac142015-02-27 21:17:42 +0000141 %q = load %f4, %f4* %Q ; <%f4> [#uses=1]
Dan Gohmana5b96452009-06-04 22:49:04 +0000142 %R = fadd %f4 %q, %tmp6 ; <%f4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000143 store %f4 %R, %f4* %P
144 ret void
Chris Lattner1d096812006-03-19 04:45:11 +0000145}
146
Tanya Lattner3f047732008-02-19 01:41:04 +0000147define void @splat_i4(%i4* %P, %i4* %Q, i32 %X) {
148 %tmp = insertelement %i4 undef, i32 %X, i32 0 ; <%i4> [#uses=1]
149 %tmp2 = insertelement %i4 %tmp, i32 %X, i32 1 ; <%i4> [#uses=1]
150 %tmp4 = insertelement %i4 %tmp2, i32 %X, i32 2 ; <%i4> [#uses=1]
151 %tmp6 = insertelement %i4 %tmp4, i32 %X, i32 3 ; <%i4> [#uses=1]
David Blaikiea79ac142015-02-27 21:17:42 +0000152 %q = load %i4, %i4* %Q ; <%i4> [#uses=1]
Tanya Lattner3f047732008-02-19 01:41:04 +0000153 %R = add %i4 %q, %tmp6 ; <%i4> [#uses=1]
154 store %i4 %R, %i4* %P
155 ret void
Chris Lattnera7afeff2006-03-21 18:27:27 +0000156}
Duncan Sandsb8d3caf2012-11-13 13:01:58 +0000157
158define <2 x i32*> @vector_gep(<2 x [3 x {i32, i32}]*> %a) {
David Blaikie79e6c742015-02-27 19:29:02 +0000159 %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 +0000160 ret <2 x i32*> %w
161}
James Y Knight5b8217b2015-10-09 20:10:14 +0000162
163define i32 @extractelt_constant_bitcast() {
164 %1 = bitcast i64 4 to <2 x i32>
165 %2 = extractelement <2 x i32> %1, i32 0
166 ret i32 %2
167}