[clang] [llvm] [clang][llvm][LoongArch] Remove definitions and conversions for `f{recipe/rsqrte}.{s/d}` on LA32 (PR #165522)

via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 29 00:42:13 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: ZhaoQi (zhaoqi5)

<details>
<summary>Changes</summary>

`f{recipe/rsqrte}.{s/d}` are not supported on LA32.

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


13 Files Affected:

- (modified) clang/include/clang/Basic/BuiltinsLoongArchBase.def (+4-4) 
- (modified) clang/lib/Headers/larchintrin.h (+1-1) 
- (modified) clang/test/CodeGen/LoongArch/builtin-dbl-approximate.c (-1) 
- (modified) clang/test/CodeGen/LoongArch/builtin-flt-approximate.c (-1) 
- (modified) clang/test/CodeGen/LoongArch/intrinsic-la32-error.c (+10-1) 
- (modified) clang/test/CodeGen/LoongArch/intrinsic-la64-error.c (+4-4) 
- (modified) llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td (+2-2) 
- (modified) llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td (+2-2) 
- (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+6-2) 
- (modified) llvm/test/CodeGen/LoongArch/fdiv-reciprocal-estimate.ll (+1-4) 
- (modified) llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll (+19-54) 
- (modified) llvm/test/CodeGen/LoongArch/intrinsic-frecipe-dbl.ll (-1) 
- (modified) llvm/test/CodeGen/LoongArch/intrinsic-frecipe-flt.ll (-1) 


``````````diff
diff --git a/clang/include/clang/Basic/BuiltinsLoongArchBase.def b/clang/include/clang/Basic/BuiltinsLoongArchBase.def
index a5a07c167908c..cc43eb1722c57 100644
--- a/clang/include/clang/Basic/BuiltinsLoongArchBase.def
+++ b/clang/include/clang/Basic/BuiltinsLoongArchBase.def
@@ -52,7 +52,7 @@ TARGET_BUILTIN(__builtin_loongarch_iocsrwr_d, "vUWiUi", "nc", "64bit")
 TARGET_BUILTIN(__builtin_loongarch_lddir_d, "WiWiIUWi", "nc", "64bit")
 TARGET_BUILTIN(__builtin_loongarch_ldpte_d, "vWiIUWi", "nc", "64bit")
 
-TARGET_BUILTIN(__builtin_loongarch_frecipe_s, "ff", "nc", "f,frecipe")
-TARGET_BUILTIN(__builtin_loongarch_frecipe_d, "dd", "nc", "d,frecipe")
-TARGET_BUILTIN(__builtin_loongarch_frsqrte_s, "ff", "nc", "f,frecipe")
-TARGET_BUILTIN(__builtin_loongarch_frsqrte_d, "dd", "nc", "d,frecipe")
+TARGET_BUILTIN(__builtin_loongarch_frecipe_s, "ff", "nc", "f,frecipe,64bit")
+TARGET_BUILTIN(__builtin_loongarch_frecipe_d, "dd", "nc", "d,frecipe,64bit")
+TARGET_BUILTIN(__builtin_loongarch_frsqrte_s, "ff", "nc", "f,frecipe,64bit")
+TARGET_BUILTIN(__builtin_loongarch_frsqrte_d, "dd", "nc", "d,frecipe,64bit")
diff --git a/clang/lib/Headers/larchintrin.h b/clang/lib/Headers/larchintrin.h
index a1247d12e21f8..e1d06a4535091 100644
--- a/clang/lib/Headers/larchintrin.h
+++ b/clang/lib/Headers/larchintrin.h
@@ -226,7 +226,6 @@ extern __inline void
 
 #define __ldpte_d(/*long int*/ _1, /*ui5*/ _2)                                 \
   ((void)__builtin_loongarch_ldpte_d((long int)(_1), (_2)))
-#endif
 
 #ifdef __loongarch_frecipe
 extern __inline float
@@ -253,6 +252,7 @@ extern __inline double
   return __builtin_loongarch_frsqrte_d(_1);
 }
 #endif
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/clang/test/CodeGen/LoongArch/builtin-dbl-approximate.c b/clang/test/CodeGen/LoongArch/builtin-dbl-approximate.c
index e5fe684346c00..4c4e2428d7e62 100644
--- a/clang/test/CodeGen/LoongArch/builtin-dbl-approximate.c
+++ b/clang/test/CodeGen/LoongArch/builtin-dbl-approximate.c
@@ -1,5 +1,4 @@
 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
-// RUN: %clang_cc1 -triple loongarch32 -target-feature +d -target-feature +frecipe -O2 -emit-llvm %s -o - | FileCheck %s
 // RUN: %clang_cc1 -triple loongarch64 -target-feature +d -target-feature +frecipe -O2 -emit-llvm %s -o - | FileCheck %s
 
 #include <larchintrin.h>
diff --git a/clang/test/CodeGen/LoongArch/builtin-flt-approximate.c b/clang/test/CodeGen/LoongArch/builtin-flt-approximate.c
index 47bb47084364b..e544cde4e6131 100644
--- a/clang/test/CodeGen/LoongArch/builtin-flt-approximate.c
+++ b/clang/test/CodeGen/LoongArch/builtin-flt-approximate.c
@@ -1,5 +1,4 @@
 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4
-// RUN: %clang_cc1 -triple loongarch32 -target-feature +f -target-feature +frecipe -O2 -emit-llvm %s -o - | FileCheck %s
 // RUN: %clang_cc1 -triple loongarch64 -target-feature +f -target-feature +frecipe -O2 -emit-llvm %s -o - | FileCheck %s
 
 #include <larchintrin.h>
diff --git a/clang/test/CodeGen/LoongArch/intrinsic-la32-error.c b/clang/test/CodeGen/LoongArch/intrinsic-la32-error.c
index 89ce0052214e2..8032919d18ef5 100644
--- a/clang/test/CodeGen/LoongArch/intrinsic-la32-error.c
+++ b/clang/test/CodeGen/LoongArch/intrinsic-la32-error.c
@@ -5,7 +5,7 @@
 #include <larchintrin.h>
 
 #ifdef FEATURE_CHECK
-void test_feature(long *v_l, unsigned long *v_ul, int *v_i, unsigned ui, char c, short s) {
+void test_feature(long *v_l, unsigned long *v_ul, int *v_i, unsigned ui, char c, short s, float a, double b) {
 // CHECK: error: '__builtin_loongarch_cacop_d' needs target feature 64bit
   __builtin_loongarch_cacop_d(1, v_ul[0], 1024);
 
@@ -49,6 +49,15 @@ void test_feature(long *v_l, unsigned long *v_ul, int *v_i, unsigned ui, char c,
   v_ul[4] = __builtin_loongarch_lddir_d(v_l[0], 1);
 // CHECK: error: '__builtin_loongarch_ldpte_d' needs target feature 64bit
   __builtin_loongarch_ldpte_d(v_l[0], 1);
+
+// CHECK: error: '__builtin_loongarch_frecipe_s' needs target feature f,frecipe,64bit
+  float f1 = __builtin_loongarch_frecipe_s(a);
+// CHECK: error: '__builtin_loongarch_frsqrte_s' needs target feature f,frecipe,64bit
+  float f2 = __builtin_loongarch_frsqrte_s(a);
+// CHECK: error: '__builtin_loongarch_frecipe_d' needs target feature d,frecipe,64bit
+  double d1 = __builtin_loongarch_frecipe_d(b);
+// CHECK: error: '__builtin_loongarch_frsqrte_d' needs target feature d,frecipe,64bit
+  double d2 = __builtin_loongarch_frsqrte_d(b);
 }
 #endif
 
diff --git a/clang/test/CodeGen/LoongArch/intrinsic-la64-error.c b/clang/test/CodeGen/LoongArch/intrinsic-la64-error.c
index 085f3fdc89bad..b5348b73d2aed 100644
--- a/clang/test/CodeGen/LoongArch/intrinsic-la64-error.c
+++ b/clang/test/CodeGen/LoongArch/intrinsic-la64-error.c
@@ -12,13 +12,13 @@ void test_feature(unsigned long *v_ul, int *v_i, float a, double b) {
   v_i[0] = __builtin_loongarch_movfcsr2gr(1);
 // CHECK: error: '__builtin_loongarch_movgr2fcsr' needs target feature f
   __builtin_loongarch_movgr2fcsr(1, v_i[1]);
-// CHECK: error: '__builtin_loongarch_frecipe_s' needs target feature f,frecipe
+// CHECK: error: '__builtin_loongarch_frecipe_s' needs target feature f,frecipe,64bit
   float f1 = __builtin_loongarch_frecipe_s(a);
-// CHECK: error: '__builtin_loongarch_frsqrte_s' needs target feature f,frecipe
+// CHECK: error: '__builtin_loongarch_frsqrte_s' needs target feature f,frecipe,64bit
   float f2 = __builtin_loongarch_frsqrte_s(a);
-// CHECK: error: '__builtin_loongarch_frecipe_d' needs target feature d,frecipe
+// CHECK: error: '__builtin_loongarch_frecipe_d' needs target feature d,frecipe,64bit
   double d1 = __builtin_loongarch_frecipe_d(b);
-// CHECK: error: '__builtin_loongarch_frsqrte_d' needs target feature d,frecipe
+// CHECK: error: '__builtin_loongarch_frsqrte_d' needs target feature d,frecipe,64bit
   double d2 = __builtin_loongarch_frsqrte_d(b);
 }
 #endif
diff --git a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
index 690dd73014e57..e9aa00f013e93 100644
--- a/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchFloat32InstrInfo.td
@@ -316,13 +316,13 @@ def : Pat<(fdiv (loongarch_movgr2fr_w (i32 1065353216)), FPR32:$src),
           (FRECIP_S $src)>;
 } // Predicates = [HasBasicF, IsLA32]
 
-let Predicates = [HasFrecipe] in {
+let Predicates = [HasFrecipe, IsLA64] in {
 // FP approximate reciprocal operation
 def : Pat<(int_loongarch_frecipe_s FPR32:$src), (FRECIPE_S FPR32:$src)>;
 def : Pat<(int_loongarch_frsqrte_s FPR32:$src), (FRSQRTE_S FPR32:$src)>;
 def : Pat<(loongarch_frecipe FPR32:$src), (FRECIPE_S FPR32:$src)>;
 def : Pat<(loongarch_frsqrte FPR32:$src), (FRSQRTE_S FPR32:$src)>;
-}
+} // Predicates = [HasFrecipe, IsLA64]
 
 // fmadd.s: fj * fk + fa
 def : Pat<(fma FPR32:$fj, FPR32:$fk, FPR32:$fa), (FMADD_S $fj, $fk, $fa)>;
diff --git a/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td b/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
index daefbaa52d42a..3cdcdb688fb5b 100644
--- a/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
+++ b/llvm/lib/Target/LoongArch/LoongArchFloat64InstrInfo.td
@@ -277,13 +277,13 @@ def : Pat<(fdiv (loongarch_movgr2fr_d_lo_hi (i32 0), (i32 1072693248)), FPR64:$s
           (FRECIP_D FPR64:$src)>;
 } // Predicates = [IsLA32]
 
-let Predicates = [HasFrecipe] in {
+let Predicates = [HasFrecipe, IsLA64] in {
 // FP approximate reciprocal operation
 def : Pat<(int_loongarch_frecipe_d FPR64:$src), (FRECIPE_D FPR64:$src)>;
 def : Pat<(int_loongarch_frsqrte_d FPR64:$src), (FRSQRTE_D FPR64:$src)>;
 def : Pat<(loongarch_frecipe FPR64:$src), (FRECIPE_D FPR64:$src)>;
 def : Pat<(loongarch_frsqrte FPR64:$src), (FRSQRTE_D FPR64:$src)>;
-}
+} // Predicates = [HasFrecipe, IsLA64]
 
 // fmadd.d: fj * fk + fa
 def : Pat<(fma FPR64:$fj, FPR64:$fk, FPR64:$fa), (FMADD_D $fj, $fk, $fa)>;
diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 80c96c6dc8eb6..2960b320701d5 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -9097,6 +9097,7 @@ static int getEstimateRefinementSteps(EVT VT,
   return RefinementSteps;
 }
 
+// NOTE: May cause worse results. See tests in 'fsqrt-reciprocal-estimate.ll'.
 SDValue LoongArchTargetLowering::getSqrtEstimate(SDValue Operand,
                                                  SelectionDAG &DAG, int Enabled,
                                                  int &RefinementSteps,
@@ -9106,7 +9107,8 @@ SDValue LoongArchTargetLowering::getSqrtEstimate(SDValue Operand,
     SDLoc DL(Operand);
     EVT VT = Operand.getValueType();
 
-    if (VT == MVT::f32 || (VT == MVT::f64 && Subtarget.hasBasicD()) ||
+    if (((VT == MVT::f32 || (VT == MVT::f64 && Subtarget.hasBasicD())) &&
+         Subtarget.is64Bit()) ||
         (VT == MVT::v4f32 && Subtarget.hasExtLSX()) ||
         (VT == MVT::v2f64 && Subtarget.hasExtLSX()) ||
         (VT == MVT::v8f32 && Subtarget.hasExtLASX()) ||
@@ -9126,6 +9128,7 @@ SDValue LoongArchTargetLowering::getSqrtEstimate(SDValue Operand,
   return SDValue();
 }
 
+// NOTE: May cause worse results. See tests in 'fdiv-reciprocal-estimate.ll'.
 SDValue LoongArchTargetLowering::getRecipEstimate(SDValue Operand,
                                                   SelectionDAG &DAG,
                                                   int Enabled,
@@ -9134,7 +9137,8 @@ SDValue LoongArchTargetLowering::getRecipEstimate(SDValue Operand,
     SDLoc DL(Operand);
     EVT VT = Operand.getValueType();
 
-    if (VT == MVT::f32 || (VT == MVT::f64 && Subtarget.hasBasicD()) ||
+    if (((VT == MVT::f32 || (VT == MVT::f64 && Subtarget.hasBasicD())) &&
+         Subtarget.is64Bit()) ||
         (VT == MVT::v4f32 && Subtarget.hasExtLSX()) ||
         (VT == MVT::v2f64 && Subtarget.hasExtLSX()) ||
         (VT == MVT::v8f32 && Subtarget.hasExtLASX()) ||
diff --git a/llvm/test/CodeGen/LoongArch/fdiv-reciprocal-estimate.ll b/llvm/test/CodeGen/LoongArch/fdiv-reciprocal-estimate.ll
index 63c26bd016b0e..8995dac2458bf 100644
--- a/llvm/test/CodeGen/LoongArch/fdiv-reciprocal-estimate.ll
+++ b/llvm/test/CodeGen/LoongArch/fdiv-reciprocal-estimate.ll
@@ -14,10 +14,7 @@ define float @fdiv_s(float %x, float %y) {
 ;
 ; LA32F-FRECIPE-LABEL: fdiv_s:
 ; LA32F-FRECIPE:       # %bb.0:
-; LA32F-FRECIPE-NEXT:    frecipe.s $fa2, $fa1
-; LA32F-FRECIPE-NEXT:    fmul.s $fa3, $fa0, $fa2
-; LA32F-FRECIPE-NEXT:    fnmsub.s $fa0, $fa1, $fa3, $fa0
-; LA32F-FRECIPE-NEXT:    fmadd.s $fa0, $fa2, $fa0, $fa3
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa0, $fa0, $fa1
 ; LA32F-FRECIPE-NEXT:    ret
 ;
 ; LA64D-LABEL: fdiv_s:
diff --git a/llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll b/llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll
index d875bb98e4593..de03eded5f1c4 100644
--- a/llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll
+++ b/llvm/test/CodeGen/LoongArch/fsqrt-reciprocal-estimate.ll
@@ -16,16 +16,7 @@ define float @frsqrt_f32(float %a) nounwind {
 ;
 ; LA32F-FRECIPE-LABEL: frsqrt_f32:
 ; LA32F-FRECIPE:       # %bb.0:
-; LA32F-FRECIPE-NEXT:    frsqrte.s $fa1, $fa0
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    lu12i.w $a0, -261120
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a0
-; LA32F-FRECIPE-NEXT:    fmadd.s $fa0, $fa0, $fa1, $fa2
-; LA32F-FRECIPE-NEXT:    lu12i.w $a0, -266240
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a0
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa0, $fa1, $fa0
+; LA32F-FRECIPE-NEXT:    frsqrt.s $fa0, $fa0
 ; LA32F-FRECIPE-NEXT:    ret
 ;
 ; LA64D-LABEL: frsqrt_f32:
@@ -553,22 +544,14 @@ define float @sqrt_simplify_before_recip_3_uses_f32(float %x, ptr %p1, ptr %p2)
 ;
 ; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_f32:
 ; LA32F-FRECIPE:       # %bb.0:
-; LA32F-FRECIPE-NEXT:    frsqrte.s $fa1, $fa0
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    lu12i.w $a2, -261120
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a2
-; LA32F-FRECIPE-NEXT:    fmadd.s $fa2, $fa2, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    lu12i.w $a2, -266240
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa2
+; LA32F-FRECIPE-NEXT:    fsqrt.s $fa1, $fa0
+; LA32F-FRECIPE-NEXT:    frsqrt.s $fa0, $fa0
 ; LA32F-FRECIPE-NEXT:    lu12i.w $a2, 270976
 ; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa1, $fa2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fst.s $fa1, $a0, 0
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa2, $fa2, $fa1
+; LA32F-FRECIPE-NEXT:    fst.s $fa0, $a0, 0
 ; LA32F-FRECIPE-NEXT:    fst.s $fa2, $a1, 0
+; LA32F-FRECIPE-NEXT:    fmov.s $fa0, $fa1
 ; LA32F-FRECIPE-NEXT:    ret
 ;
 ; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_f32:
@@ -628,26 +611,18 @@ define float @sqrt_simplify_before_recip_4_uses_f32(float %x, ptr %p1, ptr %p2,
 ;
 ; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_4_uses_f32:
 ; LA32F-FRECIPE:       # %bb.0:
-; LA32F-FRECIPE-NEXT:    frsqrte.s $fa1, $fa0
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    lu12i.w $a3, -261120
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a3
-; LA32F-FRECIPE-NEXT:    fmadd.s $fa2, $fa2, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    lu12i.w $a3, -266240
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa2
+; LA32F-FRECIPE-NEXT:    fsqrt.s $fa1, $fa0
+; LA32F-FRECIPE-NEXT:    frsqrt.s $fa0, $fa0
 ; LA32F-FRECIPE-NEXT:    lu12i.w $a3, 270976
 ; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa1, $fa2
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa2, $fa2, $fa1
 ; LA32F-FRECIPE-NEXT:    lu12i.w $a3, 271040
 ; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa3, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa0, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fst.s $fa1, $a0, 0
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa3, $fa3, $fa1
+; LA32F-FRECIPE-NEXT:    fst.s $fa0, $a0, 0
 ; LA32F-FRECIPE-NEXT:    fst.s $fa2, $a1, 0
 ; LA32F-FRECIPE-NEXT:    fst.s $fa3, $a2, 0
+; LA32F-FRECIPE-NEXT:    fmov.s $fa0, $fa1
 ; LA32F-FRECIPE-NEXT:    ret
 ;
 ; LA64D-LABEL: sqrt_simplify_before_recip_4_uses_f32:
@@ -714,25 +689,15 @@ define float @sqrt_simplify_before_recip_3_uses_order_f32(float %x, ptr %p1, ptr
 ;
 ; LA32F-FRECIPE-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:
 ; LA32F-FRECIPE:       # %bb.0:
-; LA32F-FRECIPE-NEXT:    frsqrte.s $fa1, $fa0
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa0, $fa1
-; LA32F-FRECIPE-NEXT:    lu12i.w $a2, -261120
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a2
-; LA32F-FRECIPE-NEXT:    fmadd.s $fa2, $fa2, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    lu12i.w $a2, -266240
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa0, $fa0, $fa1
+; LA32F-FRECIPE-NEXT:    fsqrt.s $fa0, $fa0
 ; LA32F-FRECIPE-NEXT:    lu12i.w $a2, 270976
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa2, $fa1, $fa2
+; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa1, $a2
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa1, $fa1, $fa0
 ; LA32F-FRECIPE-NEXT:    lu12i.w $a2, 271040
-; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa3, $a2
-; LA32F-FRECIPE-NEXT:    fmul.s $fa1, $fa1, $fa3
-; LA32F-FRECIPE-NEXT:    fst.s $fa2, $a0, 0
-; LA32F-FRECIPE-NEXT:    fst.s $fa1, $a1, 0
+; LA32F-FRECIPE-NEXT:    movgr2fr.w $fa2, $a2
+; LA32F-FRECIPE-NEXT:    fdiv.s $fa2, $fa2, $fa0
+; LA32F-FRECIPE-NEXT:    fst.s $fa1, $a0, 0
+; LA32F-FRECIPE-NEXT:    fst.s $fa2, $a1, 0
 ; LA32F-FRECIPE-NEXT:    ret
 ;
 ; LA64D-LABEL: sqrt_simplify_before_recip_3_uses_order_f32:
diff --git a/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-dbl.ll b/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-dbl.ll
index 9f572500caa0e..2797ebde43b96 100644
--- a/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-dbl.ll
+++ b/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-dbl.ll
@@ -1,4 +1,3 @@
-; RUN: llc --mtriple=loongarch32 --mattr=+d,+frecipe < %s | FileCheck %s
 ; RUN: llc --mtriple=loongarch64 --mattr=+d,+frecipe < %s | FileCheck %s
 
 declare double @llvm.loongarch.frecipe.d(double)
diff --git a/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-flt.ll b/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-flt.ll
index 0b2029f2e44a0..8e7f5f3f3b242 100644
--- a/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-flt.ll
+++ b/llvm/test/CodeGen/LoongArch/intrinsic-frecipe-flt.ll
@@ -1,4 +1,3 @@
-; RUN: llc --mtriple=loongarch32 --mattr=+f,+frecipe < %s | FileCheck %s
 ; RUN: llc --mtriple=loongarch64 --mattr=+f,+frecipe < %s | FileCheck %s
 
 declare float @llvm.loongarch.frecipe.s(float)

``````````

</details>


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


More information about the cfe-commits mailing list