[llvm] [LoongArch] Fix FP_EXTEND legalization for v2f32 (PR #201260)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 2 21:04:15 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-loongarch
Author: wanglei (wangleiat)
<details>
<summary>Changes</summary>
FP_EXTEND may reach ReplaceNodeResults due to a Custom action for
v2f32 results, but no target-specific lowering is required.
Fixes #<!-- -->198339
---
Full diff: https://github.com/llvm/llvm-project/pull/201260.diff
2 Files Affected:
- (modified) llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp (+5)
- (added) llvm/test/CodeGen/LoongArch/pr198339.ll (+49)
``````````diff
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
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/201260
More information about the llvm-commits
mailing list