Skip to content

Commit bd83137

Browse files
authored
expandFMINIMUMNUM_FMAXIMUMNUM: Quiet is not needed for NaN vs NaN (#139237)
New LangRef doesn't requires quieting for NaN vs NaN, aka the result may be sNaN for sNaN vs NaN. See: #139228
1 parent 5458ea5 commit bd83137

File tree

7 files changed

+15178
-26375
lines changed

7 files changed

+15178
-26375
lines changed

llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8692,11 +8692,8 @@ SDValue TargetLowering::expandFMINIMUMNUM_FMAXIMUMNUM(SDNode *Node,
86928692

86938693
SDValue MinMax =
86948694
DAG.getSelectCC(DL, LHS, RHS, LHS, RHS, IsMax ? ISD::SETGT : ISD::SETLT);
8695-
// If MinMax is NaN, let's quiet it.
8696-
if (!Flags.hasNoNaNs() && !DAG.isKnownNeverNaN(LHS) &&
8697-
!DAG.isKnownNeverNaN(RHS)) {
8698-
MinMax = DAG.getNode(ISD::FCANONICALIZE, DL, VT, MinMax, Flags);
8699-
}
8695+
8696+
// TODO: We need quiet sNaN if strictfp.
87008697

87018698
// Fixup signed zero behavior.
87028699
if (Options.NoSignedZerosFPMath || Flags.hasNoSignedZeros() ||

llvm/test/CodeGen/AMDGPU/fmax3-maximumnum.ll

Lines changed: 365 additions & 757 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/AMDGPU/fmin3-minimumnum.ll

Lines changed: 389 additions & 782 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/AMDGPU/maximumnum.bf16.ll

Lines changed: 7096 additions & 12273 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/AMDGPU/minimumnum.bf16.ll

Lines changed: 7204 additions & 12366 deletions
Large diffs are not rendered by default.

llvm/test/CodeGen/Mips/fp-maximumnum-minimumnum.ll

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,12 @@ define float @maximumnum_float(float %x, float %y) {
2424
; MIPS64R2-NEXT: c.ule.s $f12, $f13
2525
; MIPS64R2-NEXT: mov.s $f0, $f13
2626
; MIPS64R2-NEXT: movf.s $f0, $f12, $fcc0
27-
; MIPS64R2-NEXT: add.s $f1, $f0, $f0
28-
; MIPS64R2-NEXT: c.un.s $f0, $f0
29-
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
3027
; MIPS64R2-NEXT: mfc1 $1, $f12
3128
; MIPS64R2-NEXT: mov.s $f1, $f0
3229
; MIPS64R2-NEXT: movz.s $f1, $f12, $1
3330
; MIPS64R2-NEXT: mfc1 $1, $f13
34-
; MIPS64R2-NEXT: mtc1 $zero, $f2
3531
; MIPS64R2-NEXT: movz.s $f1, $f13, $1
32+
; MIPS64R2-NEXT: mtc1 $zero, $f2
3633
; MIPS64R2-NEXT: c.eq.s $f0, $f2
3734
; MIPS64R2-NEXT: jr $ra
3835
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
@@ -56,11 +53,8 @@ define float @maximumnum_float_nsz(float %x, float %y) {
5653
; MIPS64R2-NEXT: c.un.s $f13, $f13
5754
; MIPS64R2-NEXT: movt.s $f0, $f12, $fcc0
5855
; MIPS64R2-NEXT: c.ule.s $f12, $f0
59-
; MIPS64R2-NEXT: movf.s $f0, $f12, $fcc0
60-
; MIPS64R2-NEXT: add.s $f1, $f0, $f0
61-
; MIPS64R2-NEXT: c.un.s $f0, $f0
6256
; MIPS64R2-NEXT: jr $ra
63-
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
57+
; MIPS64R2-NEXT: movf.s $f0, $f12, $fcc0
6458
%z = call nsz float @llvm.maximumnum.f32(float %x, float %y)
6559
ret float %z
6660
}
@@ -107,9 +101,6 @@ define double @maximumnum_double(double %x, double %y) {
107101
; MIPS64R2-NEXT: c.ule.d $f12, $f13
108102
; MIPS64R2-NEXT: mov.d $f0, $f13
109103
; MIPS64R2-NEXT: movf.d $f0, $f12, $fcc0
110-
; MIPS64R2-NEXT: add.d $f1, $f0, $f0
111-
; MIPS64R2-NEXT: c.un.d $f0, $f0
112-
; MIPS64R2-NEXT: movt.d $f0, $f1, $fcc0
113104
; MIPS64R2-NEXT: dmfc1 $1, $f12
114105
; MIPS64R2-NEXT: mov.d $f1, $f0
115106
; MIPS64R2-NEXT: movz.d $f1, $f12, $1
@@ -139,11 +130,8 @@ define double @maximumnum_double_nsz(double %x, double %y) {
139130
; MIPS64R2-NEXT: c.un.d $f13, $f13
140131
; MIPS64R2-NEXT: movt.d $f0, $f12, $fcc0
141132
; MIPS64R2-NEXT: c.ule.d $f12, $f0
142-
; MIPS64R2-NEXT: movf.d $f0, $f12, $fcc0
143-
; MIPS64R2-NEXT: add.d $f1, $f0, $f0
144-
; MIPS64R2-NEXT: c.un.d $f0, $f0
145133
; MIPS64R2-NEXT: jr $ra
146-
; MIPS64R2-NEXT: movt.d $f0, $f1, $fcc0
134+
; MIPS64R2-NEXT: movf.d $f0, $f12, $fcc0
147135
%z = call nsz double @llvm.maximumnum.f64(double %x, double %y)
148136
ret double %z
149137
}
@@ -189,18 +177,15 @@ define float @minimumnum_float(float %x, float %y) {
189177
; MIPS64R2-NEXT: c.olt.s $f12, $f13
190178
; MIPS64R2-NEXT: mov.s $f0, $f13
191179
; MIPS64R2-NEXT: movt.s $f0, $f12, $fcc0
192-
; MIPS64R2-NEXT: add.s $f1, $f0, $f0
193-
; MIPS64R2-NEXT: c.un.s $f0, $f0
194-
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
195180
; MIPS64R2-NEXT: mfc1 $1, $f12
196181
; MIPS64R2-NEXT: lui $2, 32768
197182
; MIPS64R2-NEXT: xor $1, $1, $2
198183
; MIPS64R2-NEXT: mov.s $f1, $f0
199184
; MIPS64R2-NEXT: movz.s $f1, $f12, $1
200185
; MIPS64R2-NEXT: mfc1 $1, $f13
201186
; MIPS64R2-NEXT: xor $1, $1, $2
202-
; MIPS64R2-NEXT: mtc1 $zero, $f2
203187
; MIPS64R2-NEXT: movz.s $f1, $f13, $1
188+
; MIPS64R2-NEXT: mtc1 $zero, $f2
204189
; MIPS64R2-NEXT: c.eq.s $f0, $f2
205190
; MIPS64R2-NEXT: jr $ra
206191
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
@@ -224,11 +209,8 @@ define float @minimumnum_float_nsz(float %x, float %y) {
224209
; MIPS64R2-NEXT: c.un.s $f13, $f13
225210
; MIPS64R2-NEXT: movt.s $f0, $f12, $fcc0
226211
; MIPS64R2-NEXT: c.olt.s $f12, $f0
227-
; MIPS64R2-NEXT: movt.s $f0, $f12, $fcc0
228-
; MIPS64R2-NEXT: add.s $f1, $f0, $f0
229-
; MIPS64R2-NEXT: c.un.s $f0, $f0
230212
; MIPS64R2-NEXT: jr $ra
231-
; MIPS64R2-NEXT: movt.s $f0, $f1, $fcc0
213+
; MIPS64R2-NEXT: movt.s $f0, $f12, $fcc0
232214
%z = call nsz float @llvm.minimumnum.f32(float %x, float %y)
233215
ret float %z
234216
}
@@ -277,9 +259,6 @@ define double @minimumnum_double(double %x, double %y) {
277259
; MIPS64R2-NEXT: c.olt.d $f12, $f13
278260
; MIPS64R2-NEXT: mov.d $f0, $f13
279261
; MIPS64R2-NEXT: movt.d $f0, $f12, $fcc0
280-
; MIPS64R2-NEXT: add.d $f1, $f0, $f0
281-
; MIPS64R2-NEXT: c.un.d $f0, $f0
282-
; MIPS64R2-NEXT: movt.d $f0, $f1, $fcc0
283262
; MIPS64R2-NEXT: dmfc1 $1, $f12
284263
; MIPS64R2-NEXT: daddiu $2, $zero, 1
285264
; MIPS64R2-NEXT: dsll $2, $2, 63
@@ -313,11 +292,8 @@ define double @minimumnum_double_nsz(double %x, double %y) {
313292
; MIPS64R2-NEXT: c.un.d $f13, $f13
314293
; MIPS64R2-NEXT: movt.d $f0, $f12, $fcc0
315294
; MIPS64R2-NEXT: c.olt.d $f12, $f0
316-
; MIPS64R2-NEXT: movt.d $f0, $f12, $fcc0
317-
; MIPS64R2-NEXT: add.d $f1, $f0, $f0
318-
; MIPS64R2-NEXT: c.un.d $f0, $f0
319295
; MIPS64R2-NEXT: jr $ra
320-
; MIPS64R2-NEXT: movt.d $f0, $f1, $fcc0
296+
; MIPS64R2-NEXT: movt.d $f0, $f12, $fcc0
321297
%z = call nsz double @llvm.minimumnum.f64(double %x, double %y)
322298
ret double %z
323299
}

0 commit comments

Comments
 (0)