Skip to content

Commit 5b87c12

Browse files
committed
[M68k] add test showing callseq begin failure for doubles, and fix mem chain generation
1 parent f42e58f commit 5b87c12

File tree

3 files changed

+59
-8
lines changed

3 files changed

+59
-8
lines changed

llvm/lib/CodeGen/SelectionDAG/ScheduleDAGRRList.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,8 @@ FindCallSeqStart(SDNode *N, unsigned &NestLevel, unsigned &MaxNest,
507507
BestMaxNest = MyMaxNest;
508508
}
509509
}
510-
assert(Best);
510+
if (!Best)
511+
return nullptr;
511512
MaxNest = BestMaxNest;
512513
return Best;
513514
}
@@ -584,7 +585,8 @@ void ScheduleDAGRRList::ReleasePredecessors(SUnit *SU) {
584585
unsigned NestLevel = 0;
585586
unsigned MaxNest = 0;
586587
SDNode *N = FindCallSeqStart(Node, NestLevel, MaxNest, TII);
587-
assert(N && "Must find call sequence start");
588+
if (!N)
589+
break;
588590

589591
SUnit *Def = &SUnits[N->getNodeId()];
590592
CallSeqEndForStart[Def] = SU;

llvm/lib/Target/M68k/M68kISelLowering.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,6 @@ SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
633633
Chain = EmitTailCallLoadRetAddr(DAG, RetFI, Chain, IsTailCall, FPDiff, DL);
634634

635635
SmallVector<std::pair<unsigned, SDValue>, 8> RegsToPass;
636-
SmallVector<SDValue, 8> MemOpChains;
637636
SDValue StackPtr;
638637

639638
// Walk the register/memloc assignments, inserting copies/loads. In the case
@@ -689,14 +688,10 @@ SDValue M68kTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
689688
StackPtr = DAG.getCopyFromReg(Chain, DL, RegInfo->getStackRegister(),
690689
getPointerTy(DAG.getDataLayout()));
691690
}
692-
MemOpChains.push_back(
693-
LowerMemOpCallTo(Chain, StackPtr, Arg, DL, DAG, VA, Flags));
691+
Chain = LowerMemOpCallTo(Chain, StackPtr, Arg, DL, DAG, VA, Flags);
694692
}
695693
}
696694

697-
if (!MemOpChains.empty())
698-
Chain = DAG.getNode(ISD::TokenFactor, DL, MVT::Other, MemOpChains);
699-
700695
// FIXME Make sure PIC style GOT works as expected
701696
// The only time GOT is really needed is for Medium-PIC static data
702697
// otherwise we are happy with pc-rel or static references
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2+
; RUN: llc < %s -mtriple=m68k-linux | FileCheck %s
3+
4+
declare float @float_arg(float)
5+
declare float @double_arg(double)
6+
7+
define float @float_arg_test(ptr %inout) nounwind {
8+
; CHECK-LABEL: float_arg_test:
9+
; CHECK: ; %bb.0: ; %start
10+
; CHECK-NEXT: suba.l #12, %sp
11+
; CHECK-NEXT: movem.l %a2, (8,%sp) ; 8-byte Folded Spill
12+
; CHECK-NEXT: move.l #0, (%sp)
13+
; CHECK-NEXT: jsr float_arg
14+
; CHECK-NEXT: move.l (16,%sp), %a2
15+
; CHECK-NEXT: move.l (%a2), (%sp)
16+
; CHECK-NEXT: move.l #0, (4,%sp)
17+
; CHECK-NEXT: jsr __mulsf3
18+
; CHECK-NEXT: move.l %d0, (%a2)
19+
; CHECK-NEXT: moveq #0, %d0
20+
; CHECK-NEXT: movem.l (8,%sp), %a2 ; 8-byte Folded Reload
21+
; CHECK-NEXT: adda.l #12, %sp
22+
; CHECK-NEXT: rts
23+
start:
24+
%_58 = call float @float_arg(float 0.000000e+00)
25+
%_60 = load float, ptr %inout, align 8
26+
%_57 = fmul float 0.000000e+00, %_60
27+
store float %_57, ptr %inout, align 8
28+
ret float 0.000000e+00
29+
}
30+
31+
define float @double_arg_test(ptr %inout) nounwind {
32+
; CHECK-LABEL: double_arg_test:
33+
; CHECK: ; %bb.0: ; %start
34+
; CHECK-NEXT: suba.l #12, %sp
35+
; CHECK-NEXT: movem.l %a2, (8,%sp) ; 8-byte Folded Spill
36+
; CHECK-NEXT: move.l #0, (4,%sp)
37+
; CHECK-NEXT: move.l #0, (%sp)
38+
; CHECK-NEXT: jsr double_arg
39+
; CHECK-NEXT: move.l (16,%sp), %a2
40+
; CHECK-NEXT: move.l (%a2), (%sp)
41+
; CHECK-NEXT: move.l #0, (4,%sp)
42+
; CHECK-NEXT: jsr __mulsf3
43+
; CHECK-NEXT: move.l %d0, (%a2)
44+
; CHECK-NEXT: moveq #0, %d0
45+
; CHECK-NEXT: movem.l (8,%sp), %a2 ; 8-byte Folded Reload
46+
; CHECK-NEXT: adda.l #12, %sp
47+
; CHECK-NEXT: rts
48+
start:
49+
%_58 = call float @double_arg(double 0.000000e+00)
50+
%_60 = load float, ptr %inout, align 8
51+
%_57 = fmul float 0.000000e+00, %_60
52+
store float %_57, ptr %inout, align 8
53+
ret float 0.000000e+00
54+
}

0 commit comments

Comments
 (0)