[llvm] [M68k] add test showing callseq begin failure for doubles, and fix mem chain generation (PR #170049)

via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 30 12:40:08 PST 2025


https://github.com/knickish updated https://github.com/llvm/llvm-project/pull/170049

>From 5b87c122803ceb5d8cb773891b168a8bee630855 Mon Sep 17 00:00:00 2001
From: kirk <knickish at gmail.com>
Date: Sun, 23 Mar 2025 01:05:12 +0000
Subject: [PATCH] [M68k] add test showing callseq begin failure for doubles,
 and fix mem chain generation

---
 .../SelectionDAG/ScheduleDAGRRList.cpp        |  6 ++-
 llvm/lib/Target/M68k/M68kISelLowering.cpp     |  7 +--
 llvm/test/CodeGen/M68k/Regression/146213.ll   | 54 +++++++++++++++++++
 3 files changed, 59 insertions(+), 8 deletions(-)
 create mode 100644 llvm/test/CodeGen/M68k/Regression/146213.ll

diff --git a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
index 12fc26d949581..09f7e07fb0343 100644
--- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp
@@ -507,7 +507,8 @@ FindCallSeqStart(SDNode *N, unsigned &NestLevel, unsigned &MaxNest,
             BestMaxNest = MyMaxNest;
           }
       }
-      assert(Best);
+      if (!Best)
+        return nullptr;
       MaxNest = BestMaxNest;
       return Best;
     }
@@ -584,7 +585,8 @@ void ScheduleDAGRRList::ReleasePredecessors(SUnit *SU) {
         unsigned NestLevel = 0;
         unsigned MaxNest = 0;
         SDNode *N = FindCallSeqStart(Node, NestLevel, MaxNest, TII);
-        assert(N && "Must find call sequence start");
+        if (!N)
+          break;
 
         SUnit *Def = &SUnits[N->getNodeId()];
         CallSeqEndForStart[Def] = SU;
diff --git a/llvm/lib/Target/M68k/M68kISelLowering.cpp b/llvm/lib/Target/M68k/M68kISelLowering.cpp
index 65084087f6e3f..c1810b0067478 100644
--- a/llvm/lib/Target/M68k/M68kISelLowering.cpp
+++ b/llvm/lib/Target/M68k/M68kISelLowering.cpp
@@ -633,7 +633,6 @@ SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
     Chain = EmitTailCallLoadRetAddr(DAG, RetFI, Chain, IsTailCall, FPDiff, DL);
 
   SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
-  SmallVector<SDValue, 8> MemOpChains;
   SDValue StackPtr;
 
   // Walk the register/memloc assignments, inserting copies/loads.  In the case
@@ -689,14 +688,10 @@ SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
         StackPtr = DAG.getCopyFromReg(Chain, DL, RegInfo->getStackRegister(),
                                       getPointerTy(DAG.getDataLayout()));
       }
-      MemOpChains.push_back(
-          LowerMemOpCallTo(Chain, StackPtr, Arg, DL, DAG, VA, Flags));
+      Chain = LowerMemOpCallTo(Chain, StackPtr, Arg, DL, DAG, VA, Flags);
     }
   }
 
-  if (!MemOpChains.empty())
-    Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
-
   // FIXME Make sure PIC style GOT works as expected
   // The only time GOT is really needed is for Medium-PIC static data
   // otherwise we are happy with pc-rel or static references
diff --git a/llvm/test/CodeGen/M68k/Regression/146213.ll b/llvm/test/CodeGen/M68k/Regression/146213.ll
new file mode 100644
index 0000000000000..997df1b569ca7
--- /dev/null
+++ b/llvm/test/CodeGen/M68k/Regression/146213.ll
@@ -0,0 +1,54 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc < %s -mtriple=m68k-linux | FileCheck %s
+
+declare float @float_arg(float)
+declare float @double_arg(double)
+
+define float @float_arg_test(ptr %inout) nounwind {
+; CHECK-LABEL: float_arg_test:
+; CHECK:       ; %bb.0: ; %start
+; CHECK-NEXT:    suba.l #12, %sp
+; CHECK-NEXT:    movem.l %a2, (8,%sp) ; 8-byte Folded Spill
+; CHECK-NEXT:    move.l #0, (%sp)
+; CHECK-NEXT:    jsr float_arg
+; CHECK-NEXT:    move.l (16,%sp), %a2
+; CHECK-NEXT:    move.l (%a2), (%sp)
+; CHECK-NEXT:    move.l #0, (4,%sp)
+; CHECK-NEXT:    jsr __mulsf3
+; CHECK-NEXT:    move.l %d0, (%a2)
+; CHECK-NEXT:    moveq #0, %d0
+; CHECK-NEXT:    movem.l (8,%sp), %a2 ; 8-byte Folded Reload
+; CHECK-NEXT:    adda.l #12, %sp
+; CHECK-NEXT:    rts
+start:
+  %_58 = call float @float_arg(float 0.000000e+00)
+  %_60 = load float, ptr %inout, align 8
+  %_57 = fmul float 0.000000e+00, %_60
+  store float %_57, ptr %inout, align 8
+  ret float 0.000000e+00
+}
+
+define float @double_arg_test(ptr %inout) nounwind {
+; CHECK-LABEL: double_arg_test:
+; CHECK:       ; %bb.0: ; %start
+; CHECK-NEXT:    suba.l #12, %sp
+; CHECK-NEXT:    movem.l %a2, (8,%sp) ; 8-byte Folded Spill
+; CHECK-NEXT:    move.l #0, (4,%sp)
+; CHECK-NEXT:    move.l #0, (%sp)
+; CHECK-NEXT:    jsr double_arg
+; CHECK-NEXT:    move.l (16,%sp), %a2
+; CHECK-NEXT:    move.l (%a2), (%sp)
+; CHECK-NEXT:    move.l #0, (4,%sp)
+; CHECK-NEXT:    jsr __mulsf3
+; CHECK-NEXT:    move.l %d0, (%a2)
+; CHECK-NEXT:    moveq #0, %d0
+; CHECK-NEXT:    movem.l (8,%sp), %a2 ; 8-byte Folded Reload
+; CHECK-NEXT:    adda.l #12, %sp
+; CHECK-NEXT:    rts
+start:
+  %_58 = call float @double_arg(double 0.000000e+00)
+  %_60 = load float, ptr %inout, align 8
+  %_57 = fmul float 0.000000e+00, %_60
+  store float %_57, ptr %inout, align 8
+  ret float 0.000000e+00
+}



More information about the llvm-commits mailing list