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