[yaml2obj/obj2yaml] - Add support for .stack_sizes sections.
[llvm-complete.git] / test / Transforms / SLPVectorizer / X86 / reverse_extract_elements.ll
blob7e7ea7fde254ace48cc122cb609fbe7eca400e98
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -slp-vectorizer -instcombine -S -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s
4 define float @dotf(<4 x float> %x, <4 x float> %y) {
5 ; CHECK-LABEL: @dotf(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[TMP0:%.*]] = fmul fast <4 x float> [[X:%.*]], [[Y:%.*]]
8 ; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x float> [[TMP0]], <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
9 ; CHECK-NEXT:    [[BIN_RDX:%.*]] = fadd fast <4 x float> [[TMP0]], [[RDX_SHUF]]
10 ; CHECK-NEXT:    [[RDX_SHUF1:%.*]] = shufflevector <4 x float> [[BIN_RDX]], <4 x float> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
11 ; CHECK-NEXT:    [[BIN_RDX2:%.*]] = fadd fast <4 x float> [[BIN_RDX]], [[RDX_SHUF1]]
12 ; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <4 x float> [[BIN_RDX2]], i32 0
13 ; CHECK-NEXT:    ret float [[TMP1]]
15 entry:
16   %vecext = extractelement <4 x float> %x, i32 0
17   %vecext1 = extractelement <4 x float> %y, i32 0
18   %mul = fmul fast float %vecext, %vecext1
19   %vecext.1 = extractelement <4 x float> %x, i32 1
20   %vecext1.1 = extractelement <4 x float> %y, i32 1
21   %mul.1 = fmul fast float %vecext.1, %vecext1.1
22   %add.1 = fadd fast float %mul.1, %mul
23   %vecext.2 = extractelement <4 x float> %x, i32 2
24   %vecext1.2 = extractelement <4 x float> %y, i32 2
25   %mul.2 = fmul fast float %vecext.2, %vecext1.2
26   %add.2 = fadd fast float %mul.2, %add.1
27   %vecext.3 = extractelement <4 x float> %x, i32 3
28   %vecext1.3 = extractelement <4 x float> %y, i32 3
29   %mul.3 = fmul fast float %vecext.3, %vecext1.3
30   %add.3 = fadd fast float %mul.3, %add.2
31   ret float %add.3
34 define double @dotd(<4 x double>* byval nocapture readonly align 32, <4 x double>* byval nocapture readonly align 32) {
35 ; CHECK-LABEL: @dotd(
36 ; CHECK-NEXT:  entry:
37 ; CHECK-NEXT:    [[X:%.*]] = load <4 x double>, <4 x double>* [[TMP0:%.*]], align 32
38 ; CHECK-NEXT:    [[Y:%.*]] = load <4 x double>, <4 x double>* [[TMP1:%.*]], align 32
39 ; CHECK-NEXT:    [[TMP2:%.*]] = fmul fast <4 x double> [[X]], [[Y]]
40 ; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x double> [[TMP2]], <4 x double> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
41 ; CHECK-NEXT:    [[BIN_RDX:%.*]] = fadd fast <4 x double> [[TMP2]], [[RDX_SHUF]]
42 ; CHECK-NEXT:    [[RDX_SHUF1:%.*]] = shufflevector <4 x double> [[BIN_RDX]], <4 x double> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
43 ; CHECK-NEXT:    [[BIN_RDX2:%.*]] = fadd fast <4 x double> [[BIN_RDX]], [[RDX_SHUF1]]
44 ; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[BIN_RDX2]], i32 0
45 ; CHECK-NEXT:    ret double [[TMP3]]
47 entry:
48   %x = load <4 x double>, <4 x double>* %0, align 32
49   %y = load <4 x double>, <4 x double>* %1, align 32
50   %vecext = extractelement <4 x double> %x, i32 0
51   %vecext1 = extractelement <4 x double> %y, i32 0
52   %mul = fmul fast double %vecext, %vecext1
53   %vecext.1 = extractelement <4 x double> %x, i32 1
54   %vecext1.1 = extractelement <4 x double> %y, i32 1
55   %mul.1 = fmul fast double %vecext.1, %vecext1.1
56   %add.1 = fadd fast double %mul.1, %mul
57   %vecext.2 = extractelement <4 x double> %x, i32 2
58   %vecext1.2 = extractelement <4 x double> %y, i32 2
59   %mul.2 = fmul fast double %vecext.2, %vecext1.2
60   %add.2 = fadd fast double %mul.2, %add.1
61   %vecext.3 = extractelement <4 x double> %x, i32 3
62   %vecext1.3 = extractelement <4 x double> %y, i32 3
63   %mul.3 = fmul fast double %vecext.3, %vecext1.3
64   %add.3 = fadd fast double %mul.3, %add.2
65   ret double %add.3
68 define float @dotfq(<4 x float>* nocapture readonly %x, <4 x float>* nocapture readonly %y) {
69 ; CHECK-LABEL: @dotfq(
70 ; CHECK-NEXT:  entry:
71 ; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, <4 x float>* [[X:%.*]], align 16
72 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, <4 x float>* [[Y:%.*]], align 16
73 ; CHECK-NEXT:    [[TMP2:%.*]] = fmul fast <4 x float> [[TMP1]], [[TMP0]]
74 ; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x float> [[TMP2]], <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
75 ; CHECK-NEXT:    [[BIN_RDX:%.*]] = fadd fast <4 x float> [[TMP2]], [[RDX_SHUF]]
76 ; CHECK-NEXT:    [[RDX_SHUF1:%.*]] = shufflevector <4 x float> [[BIN_RDX]], <4 x float> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
77 ; CHECK-NEXT:    [[BIN_RDX2:%.*]] = fadd fast <4 x float> [[BIN_RDX]], [[RDX_SHUF1]]
78 ; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x float> [[BIN_RDX2]], i32 0
79 ; CHECK-NEXT:    ret float [[TMP3]]
81 entry:
82   %0 = load <4 x float>, <4 x float>* %x, align 16
83   %1 = load <4 x float>, <4 x float>* %y, align 16
84   %vecext = extractelement <4 x float> %0, i32 0
85   %vecext1 = extractelement <4 x float> %1, i32 0
86   %mul = fmul fast float %vecext1, %vecext
87   %vecext.1 = extractelement <4 x float> %0, i32 1
88   %vecext1.1 = extractelement <4 x float> %1, i32 1
89   %mul.1 = fmul fast float %vecext1.1, %vecext.1
90   %add.1 = fadd fast float %mul.1, %mul
91   %vecext.2 = extractelement <4 x float> %0, i32 2
92   %vecext1.2 = extractelement <4 x float> %1, i32 2
93   %mul.2 = fmul fast float %vecext1.2, %vecext.2
94   %add.2 = fadd fast float %mul.2, %add.1
95   %vecext.3 = extractelement <4 x float> %0, i32 3
96   %vecext1.3 = extractelement <4 x float> %1, i32 3
97   %mul.3 = fmul fast float %vecext1.3, %vecext.3
98   %add.3 = fadd fast float %mul.3, %add.2
99   ret float %add.3
102 define double @dotdq(<4 x double>* nocapture readonly %x, <4 x double>* nocapture readonly %y) {
103 ; CHECK-LABEL: @dotdq(
104 ; CHECK-NEXT:  entry:
105 ; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x double>, <4 x double>* [[X:%.*]], align 32
106 ; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, <4 x double>* [[Y:%.*]], align 32
107 ; CHECK-NEXT:    [[TMP2:%.*]] = fmul fast <4 x double> [[TMP1]], [[TMP0]]
108 ; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x double> [[TMP2]], <4 x double> undef, <4 x i32> <i32 2, i32 3, i32 undef, i32 undef>
109 ; CHECK-NEXT:    [[BIN_RDX:%.*]] = fadd fast <4 x double> [[TMP2]], [[RDX_SHUF]]
110 ; CHECK-NEXT:    [[RDX_SHUF1:%.*]] = shufflevector <4 x double> [[BIN_RDX]], <4 x double> undef, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
111 ; CHECK-NEXT:    [[BIN_RDX2:%.*]] = fadd fast <4 x double> [[BIN_RDX]], [[RDX_SHUF1]]
112 ; CHECK-NEXT:    [[TMP3:%.*]] = extractelement <4 x double> [[BIN_RDX2]], i32 0
113 ; CHECK-NEXT:    ret double [[TMP3]]
115 entry:
116   %0 = load <4 x double>, <4 x double>* %x, align 32
117   %1 = load <4 x double>, <4 x double>* %y, align 32
118   %vecext = extractelement <4 x double> %0, i32 0
119   %vecext1 = extractelement <4 x double> %1, i32 0
120   %mul = fmul fast double %vecext1, %vecext
121   %vecext.1 = extractelement <4 x double> %0, i32 1
122   %vecext1.1 = extractelement <4 x double> %1, i32 1
123   %mul.1 = fmul fast double %vecext1.1, %vecext.1
124   %add.1 = fadd fast double %mul.1, %mul
125   %vecext.2 = extractelement <4 x double> %0, i32 2
126   %vecext1.2 = extractelement <4 x double> %1, i32 2
127   %mul.2 = fmul fast double %vecext1.2, %vecext.2
128   %add.2 = fadd fast double %mul.2, %add.1
129   %vecext.3 = extractelement <4 x double> %0, i32 3
130   %vecext1.3 = extractelement <4 x double> %1, i32 3
131   %mul.3 = fmul fast double %vecext1.3, %vecext.3
132   %add.3 = fadd fast double %mul.3, %add.2
133   ret double %add.3