[llvm] [LoongArch] Fix FP_EXTEND legalization for v2f32 (PR #201260)

via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 2 21:03:37 PDT 2026


https://github.com/wangleiat created https://github.com/llvm/llvm-project/pull/201260

FP_EXTEND may reach ReplaceNodeResults due to a Custom action for
v2f32 results, but no target-specific lowering is required.

Fixes #198339


>From 49bf4fab7a3380fb639aef5219071def7b461c77 Mon Sep 17 00:00:00 2001
From: Ray Wang <wangray1021 at gmail.com>
Date: Wed, 3 Jun 2026 11:55:32 +0800
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
 =?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Created using spr 1.3.7
---
 .../LoongArch/LoongArchISelLowering.cpp       |  5 ++
 llvm/test/CodeGen/LoongArch/pr198339.ll       | 49 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 llvm/test/CodeGen/LoongArch/pr198339.ll

diff --git a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
index 561064b3e1090..0a80a88122c2c 100644
--- a/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
+++ b/llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp
@@ -5860,6 +5860,11 @@ void LoongArchTargetLowering::ReplaceNodeResults(
     Results.push_back(DAG.getNode(ISD::CONCAT_VECTORS, DL, DstVT, Blocks));
     break;
   }
+  case ISD::FP_EXTEND:
+    // FP_EXTEND may reach here due to the Custom action for v2f32 results, but
+    // no target-specific lowering is required. Leave it unchanged and rely on
+    // the default type legalization.
+    break;
   }
 }
 
diff --git a/llvm/test/CodeGen/LoongArch/pr198339.ll b/llvm/test/CodeGen/LoongArch/pr198339.ll
new file mode 100644
index 0000000000000..08505b7ba6ab2
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/pr198339.ll
@@ -0,0 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lsx < %s | FileCheck %s --check-prefixes=CHECK-32
+; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s --check-prefixes=CHECK-64
+
+define <2 x float> @repro(<2 x half> %x) nounwind {
+; CHECK-32-LABEL: repro:
+; CHECK-32:       # %bb.0:
+; CHECK-32-NEXT:    addi.w $sp, $sp, -32
+; CHECK-32-NEXT:    st.w $ra, $sp, 28 # 4-byte Folded Spill
+; CHECK-32-NEXT:    fst.d $fs0, $sp, 16 # 8-byte Folded Spill
+; CHECK-32-NEXT:    movgr2fr.w $fs0, $a0
+; CHECK-32-NEXT:    movgr2fr.w $fa0, $a1
+; CHECK-32-NEXT:    bl __extendhfsf2
+; CHECK-32-NEXT:    # kill: def $f0 killed $f0 def $vr0
+; CHECK-32-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill
+; CHECK-32-NEXT:    fmov.s $fa0, $fs0
+; CHECK-32-NEXT:    bl __extendhfsf2
+; CHECK-32-NEXT:    # kill: def $f0 killed $f0 def $vr0
+; CHECK-32-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload
+; CHECK-32-NEXT:    vextrins.w $vr0, $vr1, 16
+; CHECK-32-NEXT:    fld.d $fs0, $sp, 16 # 8-byte Folded Reload
+; CHECK-32-NEXT:    ld.w $ra, $sp, 28 # 4-byte Folded Reload
+; CHECK-32-NEXT:    addi.w $sp, $sp, 32
+; CHECK-32-NEXT:    ret
+;
+; CHECK-64-LABEL: repro:
+; CHECK-64:       # %bb.0:
+; CHECK-64-NEXT:    addi.d $sp, $sp, -32
+; CHECK-64-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
+; CHECK-64-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
+; CHECK-64-NEXT:    move $fp, $a0
+; CHECK-64-NEXT:    movgr2fr.w $fa0, $a1
+; CHECK-64-NEXT:    pcaddu18i $ra, %call36(__extendhfsf2)
+; CHECK-64-NEXT:    jirl $ra, $ra, 0
+; CHECK-64-NEXT:    # kill: def $f0 killed $f0 def $vr0
+; CHECK-64-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill
+; CHECK-64-NEXT:    movgr2fr.w $fa0, $fp
+; CHECK-64-NEXT:    pcaddu18i $ra, %call36(__extendhfsf2)
+; CHECK-64-NEXT:    jirl $ra, $ra, 0
+; CHECK-64-NEXT:    # kill: def $f0 killed $f0 def $vr0
+; CHECK-64-NEXT:    vld $vr1, $sp, 0 # 16-byte Folded Reload
+; CHECK-64-NEXT:    vextrins.w $vr0, $vr1, 16
+; CHECK-64-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
+; CHECK-64-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
+; CHECK-64-NEXT:    addi.d $sp, $sp, 32
+; CHECK-64-NEXT:    ret
+  %y = fpext <2 x half> %x to <2 x float>
+  ret <2 x float> %y
+}



More information about the llvm-commits mailing list