[llvm] [Mips] Optimize instr `slti+mfc1+cvt.s.d` to `slti+mfhc1` (PR #187463)

via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 19 02:33:38 PDT 2026


https://github.com/yingopq created https://github.com/llvm/llvm-project/pull/187463

Fix #171262.

>From d67887863a3ea8e33072aa778a0162bf81896045 Mon Sep 17 00:00:00 2001
From: Ying Huang <ying.huang at oss.cipunited.com>
Date: Thu, 19 Mar 2026 17:28:36 +0800
Subject: [PATCH] [Mips] Optimize instr `slti+mfc1+cvt.s.d` to `slti+mfhc1`

Fix #171262.
---
 llvm/lib/Target/Mips/MipsInstrFPU.td    |  4 ++++
 llvm/test/CodeGen/Mips/slti-mfc1-cvt.ll | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+)
 create mode 100644 llvm/test/CodeGen/Mips/slti-mfc1-cvt.ll

diff --git a/llvm/lib/Target/Mips/MipsInstrFPU.td b/llvm/lib/Target/Mips/MipsInstrFPU.td
index 942faf6ea223d..b6bd862794d70 100644
--- a/llvm/lib/Target/Mips/MipsInstrFPU.td
+++ b/llvm/lib/Target/Mips/MipsInstrFPU.td
@@ -1011,6 +1011,10 @@ def : MipsPat<(f64 fpimm0), (DMTC1 ZERO_64)>, ISA_MIPS3, GPR_64, FGR_64;
 def : MipsPat<(f64 fpimm0neg), (FNEG_D64 (DMTC1 ZERO_64))>, ISA_MIPS3, GPR_64,
       FGR_64;
 
+def : Pat<(setlt (i32 (bitconvert (f32 (fpround AFGR64Opnd:$src)))), 0),
+          (SLTi (MFHC1_D32 AFGR64Opnd:$src), 0)>,
+          ISA_MIPS32R2, FGR_32;
+
 def : MipsPat<(f64 (any_sint_to_fp GPR32Opnd:$src)), 
               (PseudoCVT_D64_W GPR32Opnd:$src)>, FGR_64;
 def : MipsPat<(f32 (any_sint_to_fp GPR64Opnd:$src)),
diff --git a/llvm/test/CodeGen/Mips/slti-mfc1-cvt.ll b/llvm/test/CodeGen/Mips/slti-mfc1-cvt.ll
new file mode 100644
index 0000000000000..9ed8cccc04870
--- /dev/null
+++ b/llvm/test/CodeGen/Mips/slti-mfc1-cvt.ll
@@ -0,0 +1,18 @@
+; RUN: llc -mtriple=mipsel-unknown-linux-gnu -mcpu=mips32 -verify-machineinstrs < %s | FileCheck %s -check-prefix=MIPS32
+
+define i32 @test_sign_bit(double %a) nounwind {
+; MIPS32-LABEL: test_sign_bit:
+; MIPS32:       # %bb.0: # %entry
+; MIPS32-NEXT:    mfhc1	$1, $f12
+; MIPS32-NEXT:    slti $1, $1, 0
+; MIPS32-NEXT:    addiu	$2, $zero, -4
+; MIPS32-NEXT:    jr $ra
+; MIPS32-NEXT:    or $2, $1, $2
+
+entry:
+  %conv = fptrunc double %a to float
+  %i_val = bitcast float %conv to i32
+  %1 = icmp slt i32 %i_val, 0
+  %2 = select i1 %1, i32 -3, i32 -4
+  ret i32 %2
+}



More information about the llvm-commits mailing list