@@ -48,6 +48,162 @@ define double @une_swapped(double %x) {
48
48
ret double %cond
49
49
}
50
50
51
+ ; X == 0.0 ? X : 0.0 --> ? (X could be -0.0)
52
+
53
+ define double @oeq_zero (double %x ) {
54
+ ; CHECK-LABEL: @oeq_zero(
55
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], 0.000000e+00
56
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double [[X]], double 0.000000e+00
57
+ ; CHECK-NEXT: ret double [[COND]]
58
+ ;
59
+ %cmp = fcmp oeq double %x , 0 .0
60
+ %cond = select i1 %cmp , double %x , double 0 .0
61
+ ret double %cond
62
+ }
63
+
64
+ ; X == 0.0 ? 0.0 : X --> ? (change sign if X is -0.0)
65
+
66
+ define float @oeq_zero_swapped (float %x ) {
67
+ ; CHECK-LABEL: @oeq_zero_swapped(
68
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
69
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], float 0.000000e+00, float [[X]]
70
+ ; CHECK-NEXT: ret float [[COND]]
71
+ ;
72
+ %cmp = fcmp oeq float %x , 0 .0
73
+ %cond = select i1 %cmp , float 0 .0 , float %x
74
+ ret float %cond
75
+ }
76
+
77
+ ; X != 0.0 ? X : -0.0 --> ? (change sign if X is 0.0)
78
+
79
+ define double @une_zero (double %x ) {
80
+ ; CHECK-LABEL: @une_zero(
81
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
82
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double [[X]], double -0.000000e+00
83
+ ; CHECK-NEXT: ret double [[COND]]
84
+ ;
85
+ %cmp = fcmp une double %x , 0 .0
86
+ %cond = select i1 %cmp , double %x , double -0 .0
87
+ ret double %cond
88
+ }
89
+
90
+ ; X != 0.0 ? -0.0 : X --> ? (X could be 0.0)
91
+
92
+ define double @une_zero_swapped (double %x ) {
93
+ ; CHECK-LABEL: @une_zero_swapped(
94
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
95
+ ; CHECK-NEXT: [[COND:%.*]] = select i1 [[CMP]], double -0.000000e+00, double [[X]]
96
+ ; CHECK-NEXT: ret double [[COND]]
97
+ ;
98
+ %cmp = fcmp une double %x , 0 .0
99
+ %cond = select i1 %cmp , double -0 .0 , double %x
100
+ ret double %cond
101
+ }
102
+
103
+ ; X == 0.0 ? X : 0.0 --> 0.0
104
+
105
+ define double @oeq_zero_nsz (double %x ) {
106
+ ; CHECK-LABEL: @oeq_zero_nsz(
107
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], 0.000000e+00
108
+ ; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double 0.000000e+00
109
+ ; CHECK-NEXT: ret double [[COND]]
110
+ ;
111
+ %cmp = fcmp oeq double %x , 0 .0
112
+ %cond = select nsz i1 %cmp , double %x , double 0 .0
113
+ ret double %cond
114
+ }
115
+
116
+ ; X == 0.0 ? 0.0 : X --> X
117
+
118
+ define float @oeq_zero_swapped_nsz (float %x ) {
119
+ ; CHECK-LABEL: @oeq_zero_swapped_nsz(
120
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq float [[X:%.*]], 0.000000e+00
121
+ ; CHECK-NEXT: [[COND:%.*]] = select fast i1 [[CMP]], float 0.000000e+00, float [[X]]
122
+ ; CHECK-NEXT: ret float [[COND]]
123
+ ;
124
+ %cmp = fcmp oeq float %x , 0 .0
125
+ %cond = select fast i1 %cmp , float 0 .0 , float %x
126
+ ret float %cond
127
+ }
128
+
129
+ ; X != 0.0 ? X : -0.0 --> X
130
+
131
+ define double @une_zero_nsz (double %x ) {
132
+ ; CHECK-LABEL: @une_zero_nsz(
133
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
134
+ ; CHECK-NEXT: [[COND:%.*]] = select ninf nsz i1 [[CMP]], double [[X]], double -0.000000e+00
135
+ ; CHECK-NEXT: ret double [[COND]]
136
+ ;
137
+ %cmp = fcmp une double %x , 0 .0
138
+ %cond = select nsz ninf i1 %cmp , double %x , double -0 .0
139
+ ret double %cond
140
+ }
141
+
142
+ ; X != 0.0 ? -0.0 : X --> 0.0
143
+
144
+ define <2 x double > @une_zero_swapped_nsz (<2 x double > %x ) {
145
+ ; CHECK-LABEL: @une_zero_swapped_nsz(
146
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], <double -0.000000e+00, double 0.000000e+00>
147
+ ; CHECK-NEXT: [[COND:%.*]] = select nsz <2 x i1> [[CMP]], <2 x double> <double 0.000000e+00, double -0.000000e+00>, <2 x double> [[X]]
148
+ ; CHECK-NEXT: ret <2 x double> [[COND]]
149
+ ;
150
+ %cmp = fcmp une <2 x double > %x , <double -0 .0 , double 0 .0 >
151
+ %cond = select nsz <2 x i1 > %cmp , <2 x double > <double 0 .0 , double -0 .0 >, <2 x double > %x
152
+ ret <2 x double > %cond
153
+ }
154
+
155
+ ; X == Y ? X : Y --> Y
156
+
157
+ define double @oeq_nsz (double %x , double %y ) {
158
+ ; CHECK-LABEL: @oeq_nsz(
159
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq double [[X:%.*]], [[Y:%.*]]
160
+ ; CHECK-NEXT: [[COND:%.*]] = select fast i1 [[CMP]], double [[X]], double [[Y]]
161
+ ; CHECK-NEXT: ret double [[COND]]
162
+ ;
163
+ %cmp = fcmp oeq double %x , %y
164
+ %cond = select fast i1 %cmp , double %x , double %y
165
+ ret double %cond
166
+ }
167
+
168
+ ; X == Y ? Y : X --> X
169
+
170
+ define <2 x float > @oeq_swapped_nsz (<2 x float > %x , <2 x float > %y ) {
171
+ ; CHECK-LABEL: @oeq_swapped_nsz(
172
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp oeq <2 x float> [[X:%.*]], [[Y:%.*]]
173
+ ; CHECK-NEXT: [[COND:%.*]] = select nnan nsz <2 x i1> [[CMP]], <2 x float> [[Y]], <2 x float> [[X]]
174
+ ; CHECK-NEXT: ret <2 x float> [[COND]]
175
+ ;
176
+ %cmp = fcmp oeq <2 x float > %x , %y
177
+ %cond = select nsz nnan <2 x i1 > %cmp , <2 x float > %y , <2 x float > %x
178
+ ret <2 x float > %cond
179
+ }
180
+
181
+ ; X != Y ? X : Y --> X
182
+
183
+ define double @une_nsz (double %x , double %y ) {
184
+ ; CHECK-LABEL: @une_nsz(
185
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], [[Y:%.*]]
186
+ ; CHECK-NEXT: [[COND:%.*]] = select nsz i1 [[CMP]], double [[X]], double [[Y]]
187
+ ; CHECK-NEXT: ret double [[COND]]
188
+ ;
189
+ %cmp = fcmp une double %x , %y
190
+ %cond = select nsz i1 %cmp , double %x , double %y
191
+ ret double %cond
192
+ }
193
+
194
+ ; X != Y ? Y : X --> Y
195
+
196
+ define <2 x double > @une_swapped_nsz (<2 x double > %x , <2 x double > %y ) {
197
+ ; CHECK-LABEL: @une_swapped_nsz(
198
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], [[Y:%.*]]
199
+ ; CHECK-NEXT: [[COND:%.*]] = select fast <2 x i1> [[CMP]], <2 x double> [[Y]], <2 x double> [[X]]
200
+ ; CHECK-NEXT: ret <2 x double> [[COND]]
201
+ ;
202
+ %cmp = fcmp une <2 x double > %x , %y
203
+ %cond = select fast <2 x i1 > %cmp , <2 x double > %y , <2 x double > %x
204
+ ret <2 x double > %cond
205
+ }
206
+
51
207
define double @une_could_be_negzero (double %x , double %y ) {
52
208
; CHECK-LABEL: @une_could_be_negzero(
53
209
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], [[Y:%.*]]
0 commit comments