blob: 0336301c354a7eb3cdccca5a659722eb38b9fe0c [file] [log] [blame]
Michael Ilseman6cdacff2012-11-27 01:00:22 +00001; RUN: opt < %s -instsimplify -S | FileCheck %s
2
3;; x * 0 ==> 0 when no-nans and no-signed-zero
4; CHECK: mul_zero_1
5define float @mul_zero_1(float %a) {
6 %b = fmul nsz nnan float %a, 0.0
7; CHECK: ret float 0.0
8 ret float %b
9}
10; CHECK: mul_zero_2
11define float @mul_zero_2(float %a) {
12 %b = fmul fast float 0.0, %a
13; CHECK: ret float 0.0
14 ret float %b
15}
16
17;; x * 0 =/=> 0 when there could be nans or -0
18; CHECK: no_mul_zero_1
19define float @no_mul_zero_1(float %a) {
20 %b = fmul nsz float %a, 0.0
21; CHECK: ret float %b
22 ret float %b
23}
24; CHECK: no_mul_zero_2
25define float @no_mul_zero_2(float %a) {
26 %b = fmul nnan float %a, 0.0
27; CHECK: ret float %b
28 ret float %b
29}
30; CHECK: no_mul_zero_3
31define float @no_mul_zero_3(float %a) {
32 %b = fmul float %a, 0.0
33; CHECK: ret float %b
34 ret float %b
35}
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000036
37; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
38; where nnan and ninf have to occur at least once somewhere in this
39; expression
40; CHECK: fadd_fsub_0
41define float @fadd_fsub_0(float %a) {
42; X + -X ==> 0
43 %t1 = fsub nnan ninf float 0.0, %a
44 %zero1 = fadd nnan ninf float %t1, %a
45
46 %t2 = fsub nnan float 0.0, %a
47 %zero2 = fadd ninf float %t2, %a
48
49 %t3 = fsub nnan ninf float 0.0, %a
50 %zero3 = fadd float %t3, %a
51
52 %t4 = fsub float 0.0, %a
53 %zero4 = fadd nnan ninf float %t4, %a
54
55; Dont fold this
56; CHECK: %nofold = fsub float 0.0
57 %nofold = fsub float 0.0, %a
58; CHECK: %no_zero = fadd nnan float %nofold, %a
59 %no_zero = fadd nnan float %nofold, %a
60
61; Coalesce the folded zeros
62 %zero5 = fadd float %zero1, %zero2
63 %zero6 = fadd float %zero3, %zero4
64 %zero7 = fadd float %zero5, %zero6
65
66; Should get folded
67 %ret = fadd nsz float %no_zero, %zero7
68
69; CHECK: ret float %no_zero
70 ret float %ret
71}
72
73; fsub nnan ninf x, x ==> 0.0
Stephen Linc1c7a132013-07-14 01:42:54 +000074; CHECK-LABEL: @fsub_x_x(
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000075define float @fsub_x_x(float %a) {
76; X - X ==> 0
77 %zero1 = fsub nnan ninf float %a, %a
78
79; Dont fold
80; CHECK: %no_zero1 = fsub
81 %no_zero1 = fsub ninf float %a, %a
82; CHECK: %no_zero2 = fsub
83 %no_zero2 = fsub nnan float %a, %a
84; CHECK: %no_zero = fadd
85 %no_zero = fadd float %no_zero1, %no_zero2
86
87; Should get folded
88 %ret = fadd nsz float %no_zero, %zero1
89
90; CHECK: ret float %no_zero
91 ret float %ret
92}
93
94; fadd nsz X, 0 ==> X
Stephen Linc1c7a132013-07-14 01:42:54 +000095; CHECK-LABEL: @nofold_fadd_x_0(
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000096define float @nofold_fadd_x_0(float %a) {
97; Dont fold
98; CHECK: %no_zero1 = fadd
99 %no_zero1 = fadd ninf float %a, 0.0
100; CHECK: %no_zero2 = fadd
101 %no_zero2 = fadd nnan float %a, 0.0
102; CHECK: %no_zero = fadd
103 %no_zero = fadd float %no_zero1, %no_zero2
104
105; CHECK: ret float %no_zero
106 ret float %no_zero
107}
Mehdi Aminicd3ca6f2015-02-23 18:30:25 +0000108
109; fdiv nsz nnan 0, X ==> 0
110define double @fdiv_zero_by_x(double %X) {
111; CHECK-LABEL: @fdiv_zero_by_x(
112; 0 / X -> 0
113 %r = fdiv nnan nsz double 0.0, %X
114 ret double %r
115; CHECK: ret double 0
116}
Benjamin Kramer4f052462015-06-14 18:53:58 +0000117
118define float @fdiv_self(float %f) {
119 %div = fdiv nnan ninf float %f, %f
120 ret float %div
121; CHECK-LABEL: fdiv_self
122; CHECK: ret float 1.000000e+00
123}
124
125define float @fdiv_self_invalid1(float %f) {
126 %div = fdiv ninf float %f, %f
127 ret float %div
128; CHECK-LABEL: fdiv_self_invalid1
129; CHECK: %div = fdiv ninf float %f, %f
130; CHECK-NEXT: ret float %div
131}
132
133define float @fdiv_self_invalid2(float %f) {
134 %div = fdiv nnan float %f, %f
135 ret float %div
136; CHECK-LABEL: fdiv_self_invalid2
137; CHECK: %div = fdiv nnan float %f, %f
138; CHECK-NEXT: ret float %div
139}
140
141define float @fdiv_self_invalid3(float %f) {
142 %div = fdiv float %f, %f
143 ret float %div
144; CHECK-LABEL: fdiv_self_invalid3
145; CHECK: %div = fdiv float %f, %f
146; CHECK-NEXT: ret float %div
147}
148
149define float @fdiv_neg(float %f) {
150 %neg = fsub fast float -0.000000e+00, %f
151 %div = fdiv nnan ninf float %neg, %f
152 ret float %div
153; CHECK-LABEL: fdiv_neg
154; CHECK: ret float -1.000000e+00
155}
156
157define float @fdiv_neg_invalid1(float %f) {
158 %neg = fsub fast float -0.000000e+00, %f
159 %div = fdiv ninf float %neg, %f
160 ret float %div
161; CHECK-LABEL: fdiv_neg_invalid1
162; CHECK: %neg = fsub fast float -0.000000e+00, %f
163; CHECK-NEXT: %div = fdiv ninf float %neg, %f
164; CHECK-NEXT: ret float %div
165}
166
167define float @fdiv_neg_invalid2(float %f) {
168 %neg = fsub fast float -0.000000e+00, %f
169 %div = fdiv nnan float %neg, %f
170 ret float %div
171; CHECK-LABEL: fdiv_neg_invalid2
172; CHECK: %neg = fsub fast float -0.000000e+00, %f
173; CHECK-NEXT: %div = fdiv nnan float %neg, %f
174; CHECK-NEXT: ret float %div
175}
176
177define float @fdiv_neg_invalid3(float %f) {
178 %neg = fsub fast float -0.000000e+00, %f
179 %div = fdiv float %neg, %f
180 ret float %div
181; CHECK-LABEL: fdiv_neg_invalid3
182; CHECK: %neg = fsub fast float -0.000000e+00, %f
183; CHECK-NEXT: %div = fdiv float %neg, %f
184; CHECK-NEXT: ret float %div
185}
186
187define float @fdiv_neg_swapped(float %f) {
188 %neg = fsub float 0.000000e+00, %f
189 %div = fdiv nnan ninf float %f, %neg
190 ret float %div
191; CHECK-LABEL: fdiv_neg_swapped
192; CHECK: ret float -1.000000e+00
193}