1; RUN: opt -slp-vectorizer < %s -S -mtriple="x86_64-grtev3-linux-gnu" -mcpu=corei7-avx | FileCheck %s
2
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-grtev3-linux-gnu"
5
6; We used to crash on this example because we were building a constant
7; expression during vectorization and the vectorizer expects instructions
8; as elements of the vectorized tree.
9; CHECK-LABEL: @test
10; PR19621
11
12define void @test() {
13bb279:
14  br label %bb283
15
16bb283:
17  %Av.sroa.8.0 = phi float [ undef, %bb279 ], [ %tmp315, %exit ]
18  %Av.sroa.5.0 = phi float [ undef, %bb279 ], [ %tmp319, %exit ]
19  %Av.sroa.3.0 = phi float [ undef, %bb279 ], [ %tmp307, %exit ]
20  %Av.sroa.0.0 = phi float [ undef, %bb279 ], [ %tmp317, %exit ]
21  br label %bb284
22
23bb284:
24  %tmp7.i = fpext float %Av.sroa.3.0 to double
25  %tmp8.i = fsub double %tmp7.i, undef
26  %tmp9.i = fsub double %tmp8.i, undef
27  %tmp17.i = fpext float %Av.sroa.8.0 to double
28  %tmp19.i = fsub double %tmp17.i, undef
29  %tmp20.i = fsub double %tmp19.i, undef
30  br label %bb21.i
31
32bb21.i:
33  br i1 undef, label %bb22.i, label %exit
34
35bb22.i:
36  %tmp24.i = fadd double undef, %tmp9.i
37  %tmp26.i = fadd double undef, %tmp20.i
38  br label %bb32.i
39
40bb32.i:
41  %xs.0.i = phi double [ %tmp24.i, %bb22.i ], [ 0.000000e+00, %bb32.i ]
42  %ys.0.i = phi double [ %tmp26.i, %bb22.i ], [ 0.000000e+00, %bb32.i ]
43  br i1 undef, label %bb32.i, label %bb21.i
44
45exit:
46  %tmp303 = fpext float %Av.sroa.0.0 to double
47  %tmp304 = fmul double %tmp303, undef
48  %tmp305 = fadd double undef, %tmp304
49  %tmp306 = fadd double %tmp305, undef
50  %tmp307 = fptrunc double %tmp306 to float
51  %tmp311 = fpext float %Av.sroa.5.0 to double
52  %tmp312 = fmul double %tmp311, 0.000000e+00
53  %tmp313 = fadd double undef, %tmp312
54  %tmp314 = fadd double %tmp313, undef
55  %tmp315 = fptrunc double %tmp314 to float
56  %tmp317 = fptrunc double undef to float
57  %tmp319 = fptrunc double undef to float
58  br label %bb283
59}
60
61; Make sure that we probably handle constant folded vectorized trees. The
62; vectorizer starts at the type (%t2, %t3) and wil constant fold the tree.
63; The code that handles insertelement instructions must handle this.
64define <4 x double> @constant_folding() {
65entry:
66  %t0 = fadd double 1.000000e+00 , 0.000000e+00
67  %t1 = fadd double 1.000000e+00 , 1.000000e+00
68  %t2 = fmul double %t0, 1.000000e+00
69  %i1 = insertelement <4 x double> undef, double %t2, i32 1
70  %t3 = fmul double %t1, 1.000000e+00
71  %i2 = insertelement <4 x double> %i1, double %t3, i32 0
72  ret <4 x double> %i2
73}
74
75; CHECK-LABEL: @constant_folding
76; CHECK: %[[V0:.+]] = extractelement <2 x double> <double 1.000000e+00, double 2.000000e+00>, i32 0
77; CHECK: %[[V1:.+]] = insertelement <4 x double> undef, double %[[V0]], i32 1
78; CHECK: %[[V2:.+]] = extractelement <2 x double> <double 1.000000e+00, double 2.000000e+00>, i32 1
79; CHECK: %[[V3:.+]] = insertelement <4 x double> %[[V1]], double %[[V2]], i32 0
80; CHECK: ret <4 x double> %[[V3]]
81