Skip to content

Commit 7a9809e

Browse files
committed
[M68k]: always use the movem instruction for register spills
In the previous implementation, the mov instruction was used for 8-bit register spills. However, this instruction has the side effect of overwriting the CCR. When a spill is inserted between a compare and a branch instruction, this would cause the necessary condition flags to be overwritten. As 8-bit spills are already assigned 16-bit stack slots, the 16-bit movem instruction, which doesn't affect the CCR, may be used instead. Fixes #106209.
1 parent 7b4370e commit 7a9809e

File tree

3 files changed

+490
-23
lines changed

3 files changed

+490
-23
lines changed

llvm/lib/Target/M68k/M68kInstrInfo.cpp

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -791,22 +791,25 @@ namespace {
791791
unsigned getLoadStoreRegOpcode(unsigned Reg, const TargetRegisterClass *RC,
792792
const TargetRegisterInfo *TRI,
793793
const M68kSubtarget &STI, bool load) {
794-
switch (TRI->getRegSizeInBits(*RC)) {
794+
switch (TRI->getSpillSize(*RC)) {
795795
default:
796+
LLVM_DEBUG(
797+
dbgs() << "Cannot determine appropriate opcode for load/store to/from "
798+
<< TRI->getName(Reg) << " of class " << TRI->getRegClassName(RC)
799+
<< " with spill size " << TRI->getSpillSize(*RC) << '\n');
796800
llvm_unreachable("Unknown spill size");
797-
case 8:
801+
case 2:
802+
if (M68k::XR16RegClass.hasSubClassEq(RC))
803+
return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
798804
if (M68k::DR8RegClass.hasSubClassEq(RC))
799-
return load ? M68k::MOV8dp : M68k::MOV8pd;
805+
return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
800806
if (M68k::CCRCRegClass.hasSubClassEq(RC))
801-
return load ? M68k::MOV16cp : M68k::MOV16pc;
802-
803-
llvm_unreachable("Unknown 1-byte regclass");
804-
case 16:
805-
assert(M68k::XR16RegClass.hasSubClassEq(RC) && "Unknown 2-byte regclass");
806-
return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
807-
case 32:
808-
assert(M68k::XR32RegClass.hasSubClassEq(RC) && "Unknown 4-byte regclass");
809-
return load ? M68k::MOVM32mp_P : M68k::MOVM32pm_P;
807+
return load ? M68k::MOVM16mp_P : M68k::MOVM16pm_P;
808+
llvm_unreachable("Unknown 2-byte regclass");
809+
case 4:
810+
if (M68k::XR32RegClass.hasSubClassEq(RC))
811+
return load ? M68k::MOVM32mp_P : M68k::MOVM32pm_P;
812+
llvm_unreachable("Unknown 4-byte regclass");
810813
}
811814
}
812815

llvm/test/CodeGen/M68k/PR57660.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ define dso_local void @foo1() {
88
; CHECK-NEXT: suba.l #2, %sp
99
; CHECK-NEXT: .cfi_def_cfa_offset -6
1010
; CHECK-NEXT: moveq #0, %d0
11-
; CHECK-NEXT: move.b %d0, (0,%sp) ; 1-byte Folded Spill
11+
; CHECK-NEXT: movem.w %d0, (0,%sp)
1212
; CHECK-NEXT: .LBB0_1: ; %do.body
1313
; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1
14-
; CHECK-NEXT: move.b (0,%sp), %d0 ; 1-byte Folded Reload
14+
; CHECK-NEXT: movem.w (0,%sp), %d0
1515
; CHECK-NEXT: cmpi.b #0, %d0
1616
; CHECK-NEXT: bne .LBB0_1
1717
; CHECK-NEXT: ; %bb.2: ; %do.end
@@ -39,24 +39,24 @@ define i32 @foo2(ptr noundef %0) {
3939
; CHECK-NEXT: .cfi_def_cfa_offset -8
4040
; CHECK-NEXT: move.l (8,%sp), %a0
4141
; CHECK-NEXT: move.b (%a0), %d0
42-
; CHECK-NEXT: move.b %d0, (0,%sp) ; 1-byte Folded Spill
42+
; CHECK-NEXT: movem.w %d0, (0,%sp)
4343
; CHECK-NEXT: and.b #1, %d0
44-
; CHECK-NEXT: move.b %d0, (2,%sp) ; 1-byte Folded Spill
44+
; CHECK-NEXT: movem.w %d0, (2,%sp)
4545
; CHECK-NEXT: sub.b #1, %d0
4646
; CHECK-NEXT: bgt .LBB1_2
4747
; CHECK-NEXT: ; %bb.1: ; %if
48-
; CHECK-NEXT: move.b (2,%sp), %d0 ; 1-byte Folded Reload
49-
; CHECK-NEXT: move.b (0,%sp), %d1 ; 1-byte Folded Reload
48+
; CHECK-NEXT: movem.w (2,%sp), %d0
49+
; CHECK-NEXT: movem.w (0,%sp), %d1
5050
; CHECK-NEXT: add.b %d1, %d0
5151
; CHECK-NEXT: bra .LBB1_3
5252
; CHECK-NEXT: .LBB1_2: ; %else
53-
; CHECK-NEXT: move.b (2,%sp), %d1 ; 1-byte Folded Reload
54-
; CHECK-NEXT: move.b (0,%sp), %d0 ; 1-byte Folded Reload
53+
; CHECK-NEXT: movem.w (2,%sp), %d1
54+
; CHECK-NEXT: movem.w (0,%sp), %d0
5555
; CHECK-NEXT: sub.b %d1, %d0
56-
; CHECK-NEXT: move.b %d0, (0,%sp) ; 1-byte Folded Spill
56+
; CHECK-NEXT: movem.w %d0, (0,%sp)
5757
; CHECK-NEXT: .LBB1_3: ; %cont
58-
; CHECK-NEXT: move.b %d0, (2,%sp) ; 1-byte Folded Spill
59-
; CHECK-NEXT: move.b (2,%sp), %d0 ; 1-byte Folded Reload
58+
; CHECK-NEXT: movem.w %d0, (2,%sp)
59+
; CHECK-NEXT: movem.w (2,%sp), %d0
6060
; CHECK-NEXT: ext.w %d0
6161
; CHECK-NEXT: ext.l %d0
6262
; CHECK-NEXT: adda.l #4, %sp

0 commit comments

Comments
 (0)