1 ; RUN: opt -S -instcombine < %s | FileCheck %s
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
8 @external = external global i32
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
202 attributes #0 = { nounwind }
203 attributes #1 = { nounwind readnone }