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

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


https://github.com/paulwalker-arm created https://github.com/llvm/llvm-project/pull/222287

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

>From 0fad934ec2f539a4868022d04ab59b23c1dab389 Mon Sep 17 00:00:00 2001
From: Paul Walker <paul.walker at arm.com>
Date: Tue, 8 Sep 2026 16:40:20 +0000
Subject: [PATCH] [LLVM][CodeGen][AArch64] Fix incorrect chain usage when
 lowering ISD::STRICT_FP_EXTEND.

The chain was being passed as the last operand when it should be the
first.
---
 llvm/lib/Target/AArch64/AArch64ISelLowering.cpp |  4 ++--
 llvm/test/CodeGen/AArch64/fp-intrinsics-bf16.ll | 11 +++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

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 }



More information about the llvm-commits mailing list