[llvm] SelectionDAG: Support nofpclass (PR #108350)
YunQiang Su via llvm-commits
llvm-commits at lists.llvm.org
Sat Sep 21 06:47:33 PDT 2024
================
@@ -96,17 +285,89 @@ define float @minimumnum_float_nnan(float %x, float %y) {
; MIPS32R6: # %bb.0:
; MIPS32R6-NEXT: jr $ra
; MIPS32R6-NEXT: min.s $f0, $f12, $f14
+;
+; MIPS64-LABEL: minimumnum_float_nnan:
+; MIPS64: # %bb.0:
+; MIPS64-NEXT: c.olt.s $f12, $f13
+; MIPS64-NEXT: mov.s $f0, $f13
+; MIPS64-NEXT: movt.s $f0, $f12, $fcc0
+; MIPS64-NEXT: mfc1 $1, $f12
+; MIPS64-NEXT: lui $2, 32768
+; MIPS64-NEXT: xor $1, $1, $2
+; MIPS64-NEXT: mov.s $f1, $f0
+; MIPS64-NEXT: movz.s $f1, $f12, $1
+; MIPS64-NEXT: mfc1 $1, $f13
+; MIPS64-NEXT: xor $1, $1, $2
+; MIPS64-NEXT: movz.s $f1, $f13, $1
+; MIPS64-NEXT: mtc1 $zero, $f2
+; MIPS64-NEXT: c.eq.s $f0, $f2
+; MIPS64-NEXT: jr $ra
+; MIPS64-NEXT: movt.s $f0, $f1, $fcc0
+ %z = call nnan float @llvm.minimumnum.f32(float %x, float %y)
----------------
wzssyqa wrote:
I have a try `fcmp + select` with this IR
```
define dso_local noundef float @max(float noundef nofpclass(nan) %a, float noundef nofpclass(nan) %b) local_unnamed_addr #0 {
entry:
%cmp = fcmp ogt float %a, %b
%cond = select i1 %cmp, float %a, float %b
ret float %cond
}
```
It is not easy to support it. The problem is that the argument of `void SelectionDAGBuilder::visitSelect(const User &I)`
is marked as `const`, so we have no chance to edit `I` if we detect the both `LHS` and `RHS` are `nnan`.
And then `visitSelect` calls
```
SelectPatternResult llvm::matchDecomposedSelectPattern(
CmpInst *CmpI, Value *TrueVal, Value *FalseVal, Value *&LHS, Value *&RHS,
Instruction::CastOps *CastOp, unsigned Depth)
```
It may be not a good idea to use the methods from SelectionDAG there.
https://github.com/llvm/llvm-project/pull/108350
More information about the llvm-commits
mailing list