xref: /llvm-project/llvm/test/Transforms/InstSimplify/fdiv.ll (revision 38fffa630ee80163dc65e759392ad29798905679)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=instsimplify -S | FileCheck %s
3
4define float @fdiv_constant_fold() {
5; CHECK-LABEL: @fdiv_constant_fold(
6; CHECK-NEXT:    ret float 1.500000e+00
7;
8  %f = fdiv float 3.0, 2.0
9  ret float %f
10}
11
12define float @frem_constant_fold() {
13; CHECK-LABEL: @frem_constant_fold(
14; CHECK-NEXT:    ret float 1.000000e+00
15;
16  %f = frem float 3.0, 2.0
17  ret float %f
18}
19
20define double @fmul_fdiv_common_operand(double %x, double %y) {
21; CHECK-LABEL: @fmul_fdiv_common_operand(
22; CHECK-NEXT:    ret double [[X:%.*]]
23;
24  %m = fmul double %x, %y
25  %d = fdiv reassoc nnan double %m, %y
26  ret double %d
27}
28
29; Negative test - the fdiv must be reassociative and not allow NaNs.
30
31define double @fmul_fdiv_common_operand_too_strict(double %x, double %y) {
32; CHECK-LABEL: @fmul_fdiv_common_operand_too_strict(
33; CHECK-NEXT:    [[M:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
34; CHECK-NEXT:    [[D:%.*]] = fdiv reassoc double [[M]], [[Y]]
35; CHECK-NEXT:    ret double [[D]]
36;
37  %m = fmul fast double %x, %y
38  %d = fdiv reassoc double %m, %y
39  ret double %d
40}
41
42; Commute the fmul operands. Use a vector type to verify that works too.
43
44define <2 x float> @fmul_fdiv_common_operand_commute_vec(<2 x float> %x, <2 x float> %y) {
45; CHECK-LABEL: @fmul_fdiv_common_operand_commute_vec(
46; CHECK-NEXT:    ret <2 x float> [[X:%.*]]
47;
48  %m = fmul <2 x float> %y, %x
49  %d = fdiv fast <2 x float> %m, %y
50  ret <2 x float> %d
51}
52
53; The constant expression version of this used to crash llvm-as.
54define <2 x i1> @pr6096() {
55; CHECK-LABEL: @pr6096(
56; CHECK-NEXT:    ret <2 x i1> zeroinitializer
57;
58  %fdiv = fdiv <2 x float> undef, <float 1.000000e+00, float 1.000000e+00>
59  %fcmp = fcmp ole <2 x float> %fdiv, zeroinitializer
60  ret <2 x i1> %fcmp
61}
62
63
64; https://alive2.llvm.org/ce/z/JxX5in
65define float @fdiv_nnan_ninf_by_zero_f32(float %x) {
66; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_f32(
67; CHECK-NEXT:    ret float poison
68;
69  %fdiv = fdiv nnan ninf float %x, 0.0
70  ret float %fdiv
71}
72
73define float @fdiv_nnan_ninf_by_negzero_f32(float %x) {
74; CHECK-LABEL: @fdiv_nnan_ninf_by_negzero_f32(
75; CHECK-NEXT:    ret float poison
76;
77  %fdiv = fdiv nnan ninf float %x, -0.0
78  ret float %fdiv
79}
80
81define float @fdiv_nnan_ninf_by_undef_f32(float %x) {
82; CHECK-LABEL: @fdiv_nnan_ninf_by_undef_f32(
83; CHECK-NEXT:    ret float poison
84;
85  %fdiv = fdiv nnan ninf float %x, undef
86  ret float %fdiv
87}
88
89define float @fdiv_nnan_ninf_by_poison_f32(float %x) {
90; CHECK-LABEL: @fdiv_nnan_ninf_by_poison_f32(
91; CHECK-NEXT:    ret float poison
92;
93  %fdiv = fdiv nnan ninf float %x, poison
94  ret float %fdiv
95}
96
97define <2 x float> @fdiv_nnan_ninf_by_zero_v2f32(<2 x float> %x) {
98; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_v2f32(
99; CHECK-NEXT:    ret <2 x float> poison
100;
101  %fdiv = fdiv nnan ninf <2 x float> %x, zeroinitializer
102  ret <2 x float> %fdiv
103}
104
105define <2 x float> @fdiv_nnan_ninf_by_undef_v2f32(<2 x float> %x) {
106; CHECK-LABEL: @fdiv_nnan_ninf_by_undef_v2f32(
107; CHECK-NEXT:    ret <2 x float> poison
108;
109  %fdiv = fdiv nnan ninf <2 x float> %x, undef
110  ret <2 x float> %fdiv
111}
112
113define <2 x float> @fdiv_nnan_ninf_by_zero_poison_v2f32(<2 x float> %x) {
114; CHECK-LABEL: @fdiv_nnan_ninf_by_zero_poison_v2f32(
115; CHECK-NEXT:    ret <2 x float> poison
116;
117  %fdiv = fdiv nnan ninf <2 x float> %x, <float 0.0, float poison>
118  ret <2 x float> %fdiv
119}
120
121; https://alive2.llvm.org/ce/z/wRV28p
122define float @fdiv_nnan_nsz_ninf_by_zero_f32(float %x) {
123; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_zero_f32(
124; CHECK-NEXT:    [[FDIV:%.*]] = fdiv nnan nsz float [[X:%.*]], 0.000000e+00
125; CHECK-NEXT:    ret float [[FDIV]]
126;
127  %fdiv = fdiv nnan nsz float %x, 0.0
128  ret float %fdiv
129}
130
131define float @fdiv_nnan_nsz_ninf_by_negzero_f32(float %x) {
132; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_negzero_f32(
133; CHECK-NEXT:    [[FDIV:%.*]] = fdiv nnan nsz float [[X:%.*]], -0.000000e+00
134; CHECK-NEXT:    ret float [[FDIV]]
135;
136  %fdiv = fdiv nnan nsz float %x, -0.0
137  ret float %fdiv
138}
139
140define <2 x float> @fdiv_nnan_nsz_ninf_by_zero_v2f32(<2 x float> %x) {
141; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_zero_v2f32(
142; CHECK-NEXT:    [[FDIV:%.*]] = fdiv nnan nsz <2 x float> [[X:%.*]], zeroinitializer
143; CHECK-NEXT:    ret <2 x float> [[FDIV]]
144;
145  %fdiv = fdiv nnan nsz <2 x float> %x, zeroinitializer
146  ret <2 x float> %fdiv
147}
148
149define <2 x float> @fdiv_nnan_nsz_ninf_by_negzero_v2f32(<2 x float> %x) {
150; CHECK-LABEL: @fdiv_nnan_nsz_ninf_by_negzero_v2f32(
151; CHECK-NEXT:    [[FDIV:%.*]] = fdiv nnan nsz <2 x float> [[X:%.*]], splat (float -0.000000e+00)
152; CHECK-NEXT:    ret <2 x float> [[FDIV]]
153;
154  %fdiv = fdiv nnan nsz <2 x float> %x, <float -0.0, float -0.0>
155  ret <2 x float> %fdiv
156}
157