[llvm] [LLVM][CodeGen][AArch64] Fix incorrect chain usage when lowering ISD::STRICT_FP_EXTEND. (PR #222287)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 9 03:16:51 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: Paul Walker (paulwalker-arm)

<details>
<summary>Changes</summary>

The chain was being passed as the last operand when it should be the first.

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


2 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+2-2) 
- (modified) llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll (+11) 


``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 25570e1eddc44..a3823f8552a3a 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -4989,9 +4989,9 @@ SDValue AArch64TargetLowering::LowerFP_EXTEND(SDValue Op,
     if (Op0VT == MVT::bf16 && IsStrict) {
       SDValue Ext1 =
           DAG.getNode(ISD::STRICT_FP_EXTEND, SDLoc(Op), {MVT::f32, MVT::Other},
-                      {Op0, Op.getOperand(0)});
+                      {Op.getOperand(0), Op0});
       return DAG.getNode(ISD::STRICT_FP_EXTEND, SDLoc(Op), {VT, MVT::Other},
-                         {Ext1, Ext1.getValue(1)});
+                         {Ext1.getValue(1), Ext1});
     }
     if (Op0VT == MVT::bf16)
       return DAG.getNode(ISD::FP_EXTEND, SDLoc(Op), VT,
diff --git a/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll b/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll
index c17670391483f..da20a2c8ad7c1 100644
--- a/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll
+++ b/llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll
@@ -1541,4 +1541,15 @@ define float @fpext_f32_bf16(bfloat %x) #0 {
   ret float %val
 }
 
+define double @fpext_f64_bf16(bfloat %x) #0 {
+; CHECK-LABEL: fpext_f64_bf16:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    // kill: def $h0 killed $h0 def $d0
+; CHECK-NEXT:    shll v0.4s, v0.4h, #16
+; CHECK-NEXT:    fcvt d0, s0
+; CHECK-NEXT:    ret
+  %val = call double @llvm.experimental.constrained.fpext.f64.bf16(bfloat %x, metadata !"fpexcept.strict") #0
+  ret double %val
+}
+
 attributes #0 = { strictfp }

``````````

</details>


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


More information about the llvm-commits mailing list