blob: f4f31236e5cc3e23f0c259ee36e90f92e27c3a30 [file] [log] [blame]
Sanjay Patel69632442016-03-25 20:12:25 +00001; NOTE: Assertions have been autogenerated by update_test_checks.py
Michael Ilseman6cdacff2012-11-27 01:00:22 +00002; RUN: opt < %s -instsimplify -S | FileCheck %s
3
4;; x * 0 ==> 0 when no-nans and no-signed-zero
Michael Ilseman6cdacff2012-11-27 01:00:22 +00005define float @mul_zero_1(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +00006; CHECK-LABEL: @mul_zero_1(
7; CHECK: ret float 0.000000e+00
8;
Michael Ilseman6cdacff2012-11-27 01:00:22 +00009 %b = fmul nsz nnan float %a, 0.0
Michael Ilseman6cdacff2012-11-27 01:00:22 +000010 ret float %b
11}
Sanjay Patel69632442016-03-25 20:12:25 +000012
Michael Ilseman6cdacff2012-11-27 01:00:22 +000013define float @mul_zero_2(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000014; CHECK-LABEL: @mul_zero_2(
15; CHECK: ret float 0.000000e+00
16;
Michael Ilseman6cdacff2012-11-27 01:00:22 +000017 %b = fmul fast float 0.0, %a
Michael Ilseman6cdacff2012-11-27 01:00:22 +000018 ret float %b
19}
20
21;; x * 0 =/=> 0 when there could be nans or -0
Michael Ilseman6cdacff2012-11-27 01:00:22 +000022define float @no_mul_zero_1(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000023; CHECK-LABEL: @no_mul_zero_1(
24; CHECK: [[B:%.*]] = fmul nsz float %a, 0.000000e+00
25; CHECK-NEXT: ret float [[B]]
26;
Michael Ilseman6cdacff2012-11-27 01:00:22 +000027 %b = fmul nsz float %a, 0.0
Michael Ilseman6cdacff2012-11-27 01:00:22 +000028 ret float %b
29}
Sanjay Patel69632442016-03-25 20:12:25 +000030
Michael Ilseman6cdacff2012-11-27 01:00:22 +000031define float @no_mul_zero_2(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000032; CHECK-LABEL: @no_mul_zero_2(
33; CHECK: [[B:%.*]] = fmul nnan float %a, 0.000000e+00
34; CHECK-NEXT: ret float [[B]]
35;
Michael Ilseman6cdacff2012-11-27 01:00:22 +000036 %b = fmul nnan float %a, 0.0
Michael Ilseman6cdacff2012-11-27 01:00:22 +000037 ret float %b
38}
Sanjay Patel69632442016-03-25 20:12:25 +000039
Michael Ilseman6cdacff2012-11-27 01:00:22 +000040define float @no_mul_zero_3(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000041; CHECK-LABEL: @no_mul_zero_3(
42; CHECK: [[B:%.*]] = fmul float %a, 0.000000e+00
43; CHECK-NEXT: ret float [[B]]
44;
Michael Ilseman6cdacff2012-11-27 01:00:22 +000045 %b = fmul float %a, 0.0
Michael Ilseman6cdacff2012-11-27 01:00:22 +000046 ret float %b
47}
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000048
49; fadd [nnan ninf] X, (fsub [nnan ninf] 0, X) ==> 0
50; where nnan and ninf have to occur at least once somewhere in this
51; expression
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000052define float @fadd_fsub_0(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000053; CHECK-LABEL: @fadd_fsub_0(
54; CHECK: [[NOFOLD:%.*]] = fsub float 0.000000e+00, %a
55; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd nnan float [[NOFOLD]], %a
56; CHECK-NEXT: ret float [[NO_ZERO]]
57;
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000058; X + -X ==> 0
59 %t1 = fsub nnan ninf float 0.0, %a
60 %zero1 = fadd nnan ninf float %t1, %a
61
62 %t2 = fsub nnan float 0.0, %a
63 %zero2 = fadd ninf float %t2, %a
64
65 %t3 = fsub nnan ninf float 0.0, %a
66 %zero3 = fadd float %t3, %a
67
68 %t4 = fsub float 0.0, %a
69 %zero4 = fadd nnan ninf float %t4, %a
70
71; Dont fold this
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000072 %nofold = fsub float 0.0, %a
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000073 %no_zero = fadd nnan float %nofold, %a
74
75; Coalesce the folded zeros
76 %zero5 = fadd float %zero1, %zero2
77 %zero6 = fadd float %zero3, %zero4
78 %zero7 = fadd float %zero5, %zero6
79
80; Should get folded
81 %ret = fadd nsz float %no_zero, %zero7
82
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000083 ret float %ret
84}
85
Benjamin Kramer228680d2015-06-14 21:01:20 +000086; fsub nnan x, x ==> 0.0
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000087define float @fsub_x_x(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +000088; CHECK-LABEL: @fsub_x_x(
89; CHECK: [[NO_ZERO1:%.*]] = fsub ninf float %a, %a
90; CHECK-NEXT: [[NO_ZERO2:%.*]] = fsub float %a, %a
91; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]]
92; CHECK-NEXT: ret float [[NO_ZERO]]
93;
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000094; X - X ==> 0
Benjamin Kramer228680d2015-06-14 21:01:20 +000095 %zero1 = fsub nnan float %a, %a
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000096
97; Dont fold
Michael Ilsemanbb6f6912012-12-12 00:27:46 +000098 %no_zero1 = fsub ninf float %a, %a
Benjamin Kramer228680d2015-06-14 21:01:20 +000099 %no_zero2 = fsub float %a, %a
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000100 %no_zero = fadd float %no_zero1, %no_zero2
101
102; Should get folded
103 %ret = fadd nsz float %no_zero, %zero1
104
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000105 ret float %ret
106}
107
Benjamin Kramer6bb15022016-02-29 12:18:25 +0000108; fsub nsz 0.0, (fsub 0.0, X) ==> X
Benjamin Kramer6bb15022016-02-29 12:18:25 +0000109define float @fsub_0_0_x(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +0000110; CHECK-LABEL: @fsub_0_0_x(
111; CHECK: ret float %a
112;
Benjamin Kramer6bb15022016-02-29 12:18:25 +0000113 %t1 = fsub float 0.0, %a
114 %ret = fsub nsz float 0.0, %t1
Benjamin Kramer6bb15022016-02-29 12:18:25 +0000115 ret float %ret
116}
117
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000118; fadd nsz X, 0 ==> X
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000119define float @nofold_fadd_x_0(float %a) {
Sanjay Patel69632442016-03-25 20:12:25 +0000120; CHECK-LABEL: @nofold_fadd_x_0(
121; CHECK: [[NO_ZERO1:%.*]] = fadd ninf float %a, 0.000000e+00
122; CHECK-NEXT: [[NO_ZERO2:%.*]] = fadd nnan float %a, 0.000000e+00
123; CHECK-NEXT: [[NO_ZERO:%.*]] = fadd float [[NO_ZERO1:%.*]], [[NO_ZERO2:%.*]]
124; CHECK-NEXT: ret float [[NO_ZERO]]
125;
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000126; Dont fold
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000127 %no_zero1 = fadd ninf float %a, 0.0
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000128 %no_zero2 = fadd nnan float %a, 0.0
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000129 %no_zero = fadd float %no_zero1, %no_zero2
Michael Ilsemanbb6f6912012-12-12 00:27:46 +0000130 ret float %no_zero
131}
Mehdi Aminicd3ca6f2015-02-23 18:30:25 +0000132
133; fdiv nsz nnan 0, X ==> 0
134define double @fdiv_zero_by_x(double %X) {
135; CHECK-LABEL: @fdiv_zero_by_x(
Sanjay Patel69632442016-03-25 20:12:25 +0000136; CHECK: ret double 0.000000e+00
137;
Mehdi Aminicd3ca6f2015-02-23 18:30:25 +0000138; 0 / X -> 0
139 %r = fdiv nnan nsz double 0.0, %X
140 ret double %r
Mehdi Aminicd3ca6f2015-02-23 18:30:25 +0000141}
Benjamin Kramer4f052462015-06-14 18:53:58 +0000142
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000143define float @fdiv_self(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000144; CHECK-LABEL: @fdiv_self(
145; CHECK: ret float 1.000000e+00
146;
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000147 %div = fdiv nnan float %f, %f
Benjamin Kramer4f052462015-06-14 18:53:58 +0000148 ret float %div
Benjamin Kramer4f052462015-06-14 18:53:58 +0000149}
150
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000151define float @fdiv_self_invalid(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000152; CHECK-LABEL: @fdiv_self_invalid(
153; CHECK: [[DIV:%.*]] = fdiv float %f, %f
154; CHECK-NEXT: ret float [[DIV]]
155;
Benjamin Kramer4f052462015-06-14 18:53:58 +0000156 %div = fdiv float %f, %f
157 ret float %div
Benjamin Kramer4f052462015-06-14 18:53:58 +0000158}
159
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000160define float @fdiv_neg1(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000161; CHECK-LABEL: @fdiv_neg1(
162; CHECK: ret float -1.000000e+00
163;
Benjamin Kramer4f052462015-06-14 18:53:58 +0000164 %neg = fsub fast float -0.000000e+00, %f
165 %div = fdiv nnan float %neg, %f
166 ret float %div
Benjamin Kramer4f052462015-06-14 18:53:58 +0000167}
168
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000169define float @fdiv_neg2(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000170; CHECK-LABEL: @fdiv_neg2(
171; CHECK: ret float -1.000000e+00
172;
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000173 %neg = fsub fast float 0.000000e+00, %f
174 %div = fdiv nnan float %neg, %f
175 ret float %div
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000176}
177
178define float @fdiv_neg_invalid(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000179; CHECK-LABEL: @fdiv_neg_invalid(
180; CHECK: [[NEG:%.*]] = fsub fast float -0.000000e+00, %f
181; CHECK-NEXT: [[DIV:%.*]] = fdiv float [[NEG]], %f
182; CHECK-NEXT: ret float [[DIV]]
183;
Benjamin Kramer4f052462015-06-14 18:53:58 +0000184 %neg = fsub fast float -0.000000e+00, %f
185 %div = fdiv float %neg, %f
186 ret float %div
Benjamin Kramer4f052462015-06-14 18:53:58 +0000187}
188
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000189define float @fdiv_neg_swapped1(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000190; CHECK-LABEL: @fdiv_neg_swapped1(
191; CHECK: ret float -1.000000e+00
192;
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000193 %neg = fsub float -0.000000e+00, %f
194 %div = fdiv nnan float %f, %neg
Benjamin Kramer4f052462015-06-14 18:53:58 +0000195 ret float %div
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000196}
197
198define float @fdiv_neg_swapped2(float %f) {
Sanjay Patel69632442016-03-25 20:12:25 +0000199; CHECK-LABEL: @fdiv_neg_swapped2(
200; CHECK: ret float -1.000000e+00
201;
Benjamin Kramer1ee59cb2015-06-16 14:57:29 +0000202 %neg = fsub float 0.000000e+00, %f
203 %div = fdiv nnan float %f, %neg
204 ret float %div
Benjamin Kramer4f052462015-06-14 18:53:58 +0000205}