@@ -126,29 +126,29 @@ define float @oeq_zero_swapped_nsz(float %x) {
126
126
ret float %cond
127
127
}
128
128
129
- ; X != 0.0 ? X : - 0.0 --> X
129
+ ; X != 0.0 ? X : 0.0 --> X
130
130
131
131
define double @une_zero_nsz (double %x ) {
132
132
; CHECK-LABEL: @une_zero_nsz(
133
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
134
+ ; CHECK-NEXT: [[COND:%.*]] = select ninf nsz i1 [[CMP]], double [[X]], double 0.000000e+00
135
135
; CHECK-NEXT: ret double [[COND]]
136
136
;
137
137
%cmp = fcmp une double %x , 0 .0
138
- %cond = select nsz ninf i1 %cmp , double %x , double - 0 .0
138
+ %cond = select nsz ninf i1 %cmp , double %x , double 0 .0
139
139
ret double %cond
140
140
}
141
141
142
- ; X != 0.0 ? - 0.0 : X --> 0.0
142
+ ; X != 0.0 ? 0.0 : X --> 0.0
143
143
144
144
define <2 x double > @une_zero_swapped_nsz (<2 x double > %x ) {
145
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]]
146
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], zeroinitializer
147
+ ; CHECK-NEXT: [[COND:%.*]] = select nsz <2 x i1> [[CMP]], <2 x double> zeroinitializer , <2 x double> [[X]]
148
148
; CHECK-NEXT: ret <2 x double> [[COND]]
149
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
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
152
ret <2 x double > %cond
153
153
}
154
154
@@ -204,6 +204,34 @@ define <2 x double> @une_swapped_nsz(<2 x double> %x, <2 x double> %y) {
204
204
ret <2 x double > %cond
205
205
}
206
206
207
+ ; Harder - mismatched zero constants (not typical due to canonicalization):
208
+ ; X != 0.0 ? X : -0.0 --> X
209
+
210
+ define double @une_zero_mismatch_nsz (double %x ) {
211
+ ; CHECK-LABEL: @une_zero_mismatch_nsz(
212
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], 0.000000e+00
213
+ ; CHECK-NEXT: [[COND:%.*]] = select ninf nsz i1 [[CMP]], double [[X]], double -0.000000e+00
214
+ ; CHECK-NEXT: ret double [[COND]]
215
+ ;
216
+ %cmp = fcmp une double %x , 0 .0
217
+ %cond = select nsz ninf i1 %cmp , double %x , double -0 .0
218
+ ret double %cond
219
+ }
220
+
221
+ ; Even harder - mismatched vector zero constants (not typical due to canonicalization):
222
+ ; X != 0.0 ? -0.0 : X --> 0.0
223
+
224
+ define <2 x double > @une_zero_mismatch_swapped_nsz (<2 x double > %x ) {
225
+ ; CHECK-LABEL: @une_zero_mismatch_swapped_nsz(
226
+ ; CHECK-NEXT: [[CMP:%.*]] = fcmp une <2 x double> [[X:%.*]], <double -0.000000e+00, double 0.000000e+00>
227
+ ; CHECK-NEXT: [[COND:%.*]] = select nsz <2 x i1> [[CMP]], <2 x double> <double 0.000000e+00, double -0.000000e+00>, <2 x double> [[X]]
228
+ ; CHECK-NEXT: ret <2 x double> [[COND]]
229
+ ;
230
+ %cmp = fcmp une <2 x double > %x , <double -0 .0 , double 0 .0 >
231
+ %cond = select nsz <2 x i1 > %cmp , <2 x double > <double 0 .0 , double -0 .0 >, <2 x double > %x
232
+ ret <2 x double > %cond
233
+ }
234
+
207
235
define double @une_could_be_negzero (double %x , double %y ) {
208
236
; CHECK-LABEL: @une_could_be_negzero(
209
237
; CHECK-NEXT: [[CMP:%.*]] = fcmp une double [[X:%.*]], [[Y:%.*]]
0 commit comments