]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Transforms/InstCombine/fma.ll
Vendor import of llvm trunk r291012:
[FreeBSD/FreeBSD.git] / test / Transforms / InstCombine / fma.ll
1 ; RUN: opt -S -instcombine < %s | FileCheck %s
2
3 declare float @llvm.fma.f32(float, float, float) #1
4 declare <2 x float> @llvm.fma.v2f32(<2 x float>, <2 x float>, <2 x float>) #1
5 declare float @llvm.fmuladd.f32(float, float, float) #1
6 declare float @llvm.fabs.f32(float) #1
7
8 @external = external global i32
9
10 ; CHECK-LABEL: @fma_fneg_x_fneg_y(
11 ; CHECK: %fma = call float @llvm.fma.f32(float %x, float %y, float %z)
12 define float @fma_fneg_x_fneg_y(float %x, float %y, float %z) {
13   %x.fneg = fsub float -0.0, %x
14   %y.fneg = fsub float -0.0, %y
15   %fma = call float @llvm.fma.f32(float %x.fneg, float %y.fneg, float %z)
16   ret float %fma
17 }
18
19 ; CHECK-LABEL: @fma_fneg_x_fneg_y_fast(
20 ; CHECK: %fma = call fast float @llvm.fma.f32(float %x, float %y, float %z)
21 define float @fma_fneg_x_fneg_y_fast(float %x, float %y, float %z) {
22   %x.fneg = fsub float -0.0, %x
23   %y.fneg = fsub float -0.0, %y
24   %fma = call fast float @llvm.fma.f32(float %x.fneg, float %y.fneg, float %z)
25   ret float %fma
26 }
27
28 ; CHECK-LABEL: @fma_fneg_const_fneg_y(
29 ; CHECK: %fma = call float @llvm.fma.f32(float %y, float bitcast (i32 ptrtoint (i32* @external to i32) to float), float %z)
30 define float @fma_fneg_const_fneg_y(float %y, float %z) {
31   %y.fneg = fsub float -0.0, %y
32   %fma = call float @llvm.fma.f32(float fsub (float -0.0, float bitcast (i32 ptrtoint (i32* @external to i32) to float)), float %y.fneg, float %z)
33   ret float %fma
34 }
35
36 ; CHECK-LABEL: @fma_fneg_x_fneg_const(
37 ; CHECK: %fma = call float @llvm.fma.f32(float %x, float bitcast (i32 ptrtoint (i32* @external to i32) to float), float %z)
38 define float @fma_fneg_x_fneg_const(float %x, float %z) {
39   %x.fneg = fsub float -0.0, %x
40   %fma = call float @llvm.fma.f32(float %x.fneg, float fsub (float -0.0, float bitcast (i32 ptrtoint (i32* @external to i32) to float)), float %z)
41   ret float %fma
42 }
43
44 ; CHECK-LABEL: @fma_fabs_x_fabs_y(
45 ; CHECK: %x.fabs = call float @llvm.fabs.f32(float %x)
46 ; CHECK: %y.fabs = call float @llvm.fabs.f32(float %y)
47 ; CHECK: %fma = call float @llvm.fma.f32(float %x.fabs, float %y.fabs, float %z)
48 define float @fma_fabs_x_fabs_y(float %x, float %y, float %z) {
49   %x.fabs = call float @llvm.fabs.f32(float %x)
50   %y.fabs = call float @llvm.fabs.f32(float %y)
51   %fma = call float @llvm.fma.f32(float %x.fabs, float %y.fabs, float %z)
52   ret float %fma
53 }
54
55 ; CHECK-LABEL: @fma_fabs_x_fabs_x(
56 ; CHECK: %fma = call float @llvm.fma.f32(float %x, float %x, float %z)
57 define float @fma_fabs_x_fabs_x(float %x, float %z) {
58   %x.fabs = call float @llvm.fabs.f32(float %x)
59   %fma = call float @llvm.fma.f32(float %x.fabs, float %x.fabs, float %z)
60   ret float %fma
61 }
62
63 ; CHECK-LABEL: @fma_fabs_x_fabs_x_fast(
64 ; CHECK: %fma = call fast float @llvm.fma.f32(float %x, float %x, float %z)
65 define float @fma_fabs_x_fabs_x_fast(float %x, float %z) {
66   %x.fabs = call float @llvm.fabs.f32(float %x)
67   %fma = call fast float @llvm.fma.f32(float %x.fabs, float %x.fabs, float %z)
68   ret float %fma
69 }
70
71 ; CHECK-LABEL: @fmuladd_fneg_x_fneg_y(
72 ; CHECK: %fmuladd = call float @llvm.fmuladd.f32(float %x, float %y, float %z)
73 define float @fmuladd_fneg_x_fneg_y(float %x, float %y, float %z) {
74   %x.fneg = fsub float -0.0, %x
75   %y.fneg = fsub float -0.0, %y
76   %fmuladd = call float @llvm.fmuladd.f32(float %x.fneg, float %y.fneg, float %z)
77   ret float %fmuladd
78 }
79
80 ; CHECK-LABEL: @fmuladd_fneg_x_fneg_y_fast(
81 ; CHECK: %fmuladd = call fast float @llvm.fmuladd.f32(float %x, float %y, float %z)
82 define float @fmuladd_fneg_x_fneg_y_fast(float %x, float %y, float %z) {
83   %x.fneg = fsub float -0.0, %x
84   %y.fneg = fsub float -0.0, %y
85   %fmuladd = call fast float @llvm.fmuladd.f32(float %x.fneg, float %y.fneg, float %z)
86   ret float %fmuladd
87 }
88
89 ; CHECK-LABEL: @fmuladd_fneg_const_fneg_y(
90 ; CHECK: %fmuladd = call float @llvm.fmuladd.f32(float %y, float bitcast (i32 ptrtoint (i32* @external to i32) to float), float %z)
91 define float @fmuladd_fneg_const_fneg_y(float %y, float %z) {
92   %y.fneg = fsub float -0.0, %y
93   %fmuladd = call float @llvm.fmuladd.f32(float fsub (float -0.0, float bitcast (i32 ptrtoint (i32* @external to i32) to float)), float %y.fneg, float %z)
94   ret float %fmuladd
95 }
96
97 ; CHECK-LABEL: @fmuladd_fneg_x_fneg_const(
98 ; CHECK: %fmuladd = call float @llvm.fmuladd.f32(float %x, float bitcast (i32 ptrtoint (i32* @external to i32) to float), float %z)
99 define float @fmuladd_fneg_x_fneg_const(float %x, float %z) {
100   %x.fneg = fsub float -0.0, %x
101   %fmuladd = call float @llvm.fmuladd.f32(float %x.fneg, float fsub (float -0.0, float bitcast (i32 ptrtoint (i32* @external to i32) to float)), float %z)
102   ret float %fmuladd
103 }
104
105 ; CHECK-LABEL: @fmuladd_fabs_x_fabs_y(
106 ; CHECK: %x.fabs = call float @llvm.fabs.f32(float %x)
107 ; CHECK: %y.fabs = call float @llvm.fabs.f32(float %y)
108 ; CHECK: %fmuladd = call float @llvm.fmuladd.f32(float %x.fabs, float %y.fabs, float %z)
109 define float @fmuladd_fabs_x_fabs_y(float %x, float %y, float %z) {
110   %x.fabs = call float @llvm.fabs.f32(float %x)
111   %y.fabs = call float @llvm.fabs.f32(float %y)
112   %fmuladd = call float @llvm.fmuladd.f32(float %x.fabs, float %y.fabs, float %z)
113   ret float %fmuladd
114 }
115
116 ; CHECK-LABEL: @fmuladd_fabs_x_fabs_x(
117 ; CHECK: %fmuladd = call float @llvm.fmuladd.f32(float %x, float %x, float %z)
118 define float @fmuladd_fabs_x_fabs_x(float %x, float %z) {
119   %x.fabs = call float @llvm.fabs.f32(float %x)
120   %fmuladd = call float @llvm.fmuladd.f32(float %x.fabs, float %x.fabs, float %z)
121   ret float %fmuladd
122 }
123
124 ; CHECK-LABEL: @fmuladd_fabs_x_fabs_x_fast(
125 ; CHECK: %fmuladd = call fast float @llvm.fmuladd.f32(float %x, float %x, float %z)
126 define float @fmuladd_fabs_x_fabs_x_fast(float %x, float %z) {
127   %x.fabs = call float @llvm.fabs.f32(float %x)
128   %fmuladd = call fast float @llvm.fmuladd.f32(float %x.fabs, float %x.fabs, float %z)
129   ret float %fmuladd
130 }
131
132 ; CHECK-LABEL: @fma_k_y_z(
133 ; CHECK: %fma = call float @llvm.fma.f32(float %y, float 4.000000e+00, float %z)
134 define float @fma_k_y_z(float %y, float %z) {
135   %fma = call float @llvm.fma.f32(float 4.0, float %y, float %z)
136   ret float %fma
137 }
138
139 ; CHECK-LABEL: @fma_k_y_z_fast(
140 ; CHECK: %fma = call fast float @llvm.fma.f32(float %y, float 4.000000e+00, float %z)
141 define float @fma_k_y_z_fast(float %y, float %z) {
142   %fma = call fast float @llvm.fma.f32(float 4.0, float %y, float %z)
143   ret float %fma
144 }
145
146 ; CHECK-LABEL: @fmuladd_k_y_z_fast(
147 ; CHECK: %fmuladd = call fast float @llvm.fmuladd.f32(float %y, float 4.000000e+00, float %z)
148 define float @fmuladd_k_y_z_fast(float %y, float %z) {
149   %fmuladd = call fast float @llvm.fmuladd.f32(float 4.0, float %y, float %z)
150   ret float %fmuladd
151 }
152
153 ; CHECK-LABEL: @fma_1_y_z(
154 ; CHECK: %fma = fadd float %y, %z
155 define float @fma_1_y_z(float %y, float %z) {
156   %fma = call float @llvm.fma.f32(float 1.0, float %y, float %z)
157   ret float %fma
158 }
159
160 ; CHECK-LABEL: @fma_x_1_z(
161 ; CHECK: %fma = fadd float %x, %z
162 define float @fma_x_1_z(float %x, float %z) {
163   %fma = call float @llvm.fma.f32(float %x, float 1.0, float %z)
164   ret float %fma
165 }
166
167 ; CHECK-LABEL: @fma_x_1_z_v2f32(
168 ; CHECK: %fma = fadd <2 x float> %x, %z
169 define <2 x float> @fma_x_1_z_v2f32(<2 x float> %x, <2 x float> %z) {
170   %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> <float 1.0, float 1.0>, <2 x float> %z)
171   ret <2 x float> %fma
172 }
173
174 ; CHECK-LABEL: @fma_x_1_2_z_v2f32(
175 ; CHECK: %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> <float 1.000000e+00, float 2.000000e+00>, <2 x float> %z)
176 define <2 x float> @fma_x_1_2_z_v2f32(<2 x float> %x, <2 x float> %z) {
177   %fma = call <2 x float> @llvm.fma.v2f32(<2 x float> %x, <2 x float> <float 1.0, float 2.0>, <2 x float> %z)
178   ret <2 x float> %fma
179 }
180
181 ; CHECK-LABEL: @fma_x_1_z_fast(
182 ; CHECK: %fma = fadd fast float %x, %z
183 define float @fma_x_1_z_fast(float %x, float %z) {
184   %fma = call fast float @llvm.fma.f32(float %x, float 1.0, float %z)
185   ret float %fma
186 }
187
188 ; CHECK-LABEL: @fma_1_1_z(
189 ; CHECK: %fma = fadd float %z, 1.0
190 define float @fma_1_1_z(float %z) {
191   %fma = call float @llvm.fma.f32(float 1.0, float 1.0, float %z)
192   ret float %fma
193 }
194
195 ; CHECK-LABEL: @fmuladd_x_1_z_fast(
196 ; CHECK: %fmuladd = fadd fast float %x, %z
197 define float @fmuladd_x_1_z_fast(float %x, float %z) {
198   %fmuladd = call fast float @llvm.fmuladd.f32(float %x, float 1.0, float %z)
199   ret float %fmuladd
200 }
201
202 attributes #0 = { nounwind }
203 attributes #1 = { nounwind readnone }