[llvm] [GISel] Extend ConstantFoldFPBinOp with fminimumnum, fmaximumnum, fix frem vs fmod (PR #190561)

via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 5 16:36:31 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-globalisel

Author: Tim Gymnich (tgymnich)

<details>
<summary>Changes</summary>

- Distinguish G_FREM (IEEE remainder) from G_FMODF (fmod), using APFloat::remainder() and APFloat::mod() respectively.
- Add constant folding for G_FMINIMUMNUM and G_FMAXIMUMNUM using the minimumnum/maximumnum APFloat helpers.

---
Full diff: https://github.com/llvm/llvm-project/pull/190561.diff


2 Files Affected:

- (modified) llvm/lib/CodeGen/GlobalISel/Utils.cpp (+7) 
- (modified) llvm/test/CodeGen/AArch64/select_const.ll (+5-4) 


``````````diff
diff --git a/llvm/lib/CodeGen/GlobalISel/Utils.cpp b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
index d019633369163..4ebab8b3da2e2 100644
--- a/llvm/lib/CodeGen/GlobalISel/Utils.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/Utils.cpp
@@ -763,6 +763,9 @@ llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
     C1.divide(C2, APFloat::rmNearestTiesToEven);
     return C1;
   case TargetOpcode::G_FREM:
+    C1.remainder(C2);
+    return C1;
+  case TargetOpcode::G_FMODF:
     C1.mod(C2);
     return C1;
   case TargetOpcode::G_FCOPYSIGN:
@@ -776,6 +779,10 @@ llvm::ConstantFoldFPBinOp(unsigned Opcode, const Register Op1,
     return minimum(C1, C2);
   case TargetOpcode::G_FMAXIMUM:
     return maximum(C1, C2);
+  case TargetOpcode::G_FMINIMUMNUM:
+    return minimumnum(C1, C2);
+  case TargetOpcode::G_FMAXIMUMNUM:
+    return maximumnum(C1, C2);
   case TargetOpcode::G_FMINNUM_IEEE:
   case TargetOpcode::G_FMAXNUM_IEEE:
     // FIXME: These operations were unfortunately named. fminnum/fmaxnum do not
diff --git a/llvm/test/CodeGen/AArch64/select_const.ll b/llvm/test/CodeGen/AArch64/select_const.ll
index 0a73aed803415..48616d6af96d2 100644
--- a/llvm/test/CodeGen/AArch64/select_const.ll
+++ b/llvm/test/CodeGen/AArch64/select_const.ll
@@ -933,12 +933,13 @@ define double @sel_constants_frem_constant(i1 %cond) {
 ;
 ; CHECK-GI-LABEL: sel_constants_frem_constant:
 ; CHECK-GI:       // %bb.0:
-; CHECK-GI-NEXT:    adrp x8, .LCPI48_0
-; CHECK-GI-NEXT:    fmov d0, #-4.00000000
-; CHECK-GI-NEXT:    ldr d1, [x8, :lo12:.LCPI48_0]
+; CHECK-GI-NEXT:    adrp x8, .LCPI48_1
+; CHECK-GI-NEXT:    adrp x9, .LCPI48_0
+; CHECK-GI-NEXT:    ldr d0, [x8, :lo12:.LCPI48_1]
+; CHECK-GI-NEXT:    ldr d1, [x9, :lo12:.LCPI48_0]
 ; CHECK-GI-NEXT:    and w8, w0, #0x1
 ; CHECK-GI-NEXT:    tst w8, #0x1
-; CHECK-GI-NEXT:    fcsel d0, d0, d1, ne
+; CHECK-GI-NEXT:    fcsel d0, d1, d0, ne
 ; CHECK-GI-NEXT:    ret
   %sel = select i1 %cond, double -4.0, double 23.3
   %bo = frem double %sel, 5.1

``````````

</details>


https://github.com/llvm/llvm-project/pull/190561


More information about the llvm-commits mailing list