mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
Now that register allocation properly considers reserved regs, simplify the
ARM register class allocation order functions to take advantage of that. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112841 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
040bbcc876
commit
e7c1416263
@ -220,41 +220,11 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
iterator allocation_order_end(const MachineFunction &MF) const;
|
||||
}];
|
||||
let MethodBodies = [{
|
||||
// FP is R11, R9 is available.
|
||||
static const unsigned ARM_GPR_AO_1[] = {
|
||||
static const unsigned ARM_GPR_AO[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7,
|
||||
ARM::R8, ARM::R9, ARM::R10,
|
||||
ARM::R11 };
|
||||
// FP is R11, R9 is not available.
|
||||
static const unsigned ARM_GPR_AO_2[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7,
|
||||
ARM::R8, ARM::R10,
|
||||
ARM::R11 };
|
||||
// FP is R7, R9 is available as non-callee-saved register.
|
||||
// This is used by Darwin.
|
||||
static const unsigned ARM_GPR_AO_3[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R9, ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R10,ARM::R11,ARM::R7 };
|
||||
// FP is R7, R9 is not available.
|
||||
static const unsigned ARM_GPR_AO_4[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R10,ARM::R11,
|
||||
ARM::R7 };
|
||||
// FP is R7, R9 is available as callee-saved register.
|
||||
// This is used by non-Darwin platform in Thumb mode.
|
||||
static const unsigned ARM_GPR_AO_5[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R9, ARM::R10,ARM::R11,ARM::R7 };
|
||||
ARM::R8, ARM::R9, ARM::R10, ARM::R11 };
|
||||
|
||||
// For Thumb1 mode, we don't want to allocate hi regs at all, as we
|
||||
// don't know how to spill them. If we make our prologue/epilogue code
|
||||
@ -270,48 +240,16 @@ def GPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_GPR_AO;
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_GPR_AO_4;
|
||||
else
|
||||
return ARM_GPR_AO_3;
|
||||
} else {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_GPR_AO_2;
|
||||
else if (Subtarget.isThumb())
|
||||
return ARM_GPR_AO_5;
|
||||
else
|
||||
return ARM_GPR_AO_1;
|
||||
}
|
||||
return ARM_GPR_AO;
|
||||
}
|
||||
|
||||
GPRClass::iterator
|
||||
GPRClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
GPRClass::iterator I;
|
||||
|
||||
if (Subtarget.isThumb1Only()) {
|
||||
I = THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned));
|
||||
return RI->hasFP(MF) ? I-1 : I;
|
||||
}
|
||||
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_GPR_AO_4 + (sizeof(ARM_GPR_AO_4)/sizeof(unsigned));
|
||||
else
|
||||
I = ARM_GPR_AO_3 + (sizeof(ARM_GPR_AO_3)/sizeof(unsigned));
|
||||
} else {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_GPR_AO_2 + (sizeof(ARM_GPR_AO_2)/sizeof(unsigned));
|
||||
else if (Subtarget.isThumb())
|
||||
I = ARM_GPR_AO_5 + (sizeof(ARM_GPR_AO_5)/sizeof(unsigned));
|
||||
else
|
||||
I = ARM_GPR_AO_1 + (sizeof(ARM_GPR_AO_1)/sizeof(unsigned));
|
||||
}
|
||||
|
||||
return RI->hasFP(MF) ? I-1 : I;
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_GPR_AO + (sizeof(THUMB_GPR_AO)/sizeof(unsigned));
|
||||
return ARM_GPR_AO + (sizeof(ARM_GPR_AO)/sizeof(unsigned));
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -327,47 +265,18 @@ def rGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
iterator allocation_order_end(const MachineFunction &MF) const;
|
||||
}];
|
||||
let MethodBodies = [{
|
||||
// FP is R11, R9 is available.
|
||||
static const unsigned ARM_rGPRAO_1[] = {
|
||||
static const unsigned ARM_rGPR_AO[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7,
|
||||
ARM::R8, ARM::R9, ARM::R10,
|
||||
ARM::R11 };
|
||||
// FP is R11, R9 is not available.
|
||||
static const unsigned ARM_rGPRAO_2[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7,
|
||||
ARM::R8, ARM::R10,
|
||||
ARM::R11 };
|
||||
// FP is R7, R9 is available as non-callee-saved register.
|
||||
// This is used by Darwin.
|
||||
static const unsigned ARM_rGPRAO_3[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R9, ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R10,ARM::R11,ARM::R7 };
|
||||
// FP is R7, R9 is not available.
|
||||
static const unsigned ARM_rGPRAO_4[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R10,ARM::R11,
|
||||
ARM::R7 };
|
||||
// FP is R7, R9 is available as callee-saved register.
|
||||
// This is used by non-Darwin platform in Thumb mode.
|
||||
static const unsigned ARM_rGPRAO_5[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R12,ARM::LR,
|
||||
ARM::R4, ARM::R5, ARM::R6,
|
||||
ARM::R8, ARM::R9, ARM::R10,ARM::R11,ARM::R7 };
|
||||
|
||||
// For Thumb1 mode, we don't want to allocate hi regs at all, as we
|
||||
// don't know how to spill them. If we make our prologue/epilogue code
|
||||
// smarter at some point, we can go back to using the above allocation
|
||||
// orders for the Thumb1 instructions that know how to use hi regs.
|
||||
static const unsigned THUMB_rGPRAO[] = {
|
||||
static const unsigned THUMB_rGPR_AO[] = {
|
||||
ARM::R0, ARM::R1, ARM::R2, ARM::R3,
|
||||
ARM::R4, ARM::R5, ARM::R6, ARM::R7 };
|
||||
|
||||
@ -376,49 +285,18 @@ def rGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R4, R5, R6,
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_rGPRAO;
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_rGPRAO_4;
|
||||
else
|
||||
return ARM_rGPRAO_3;
|
||||
} else {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_rGPRAO_2;
|
||||
else if (Subtarget.isThumb())
|
||||
return ARM_rGPRAO_5;
|
||||
else
|
||||
return ARM_rGPRAO_1;
|
||||
}
|
||||
return THUMB_rGPR_AO;
|
||||
return ARM_rGPR_AO;
|
||||
}
|
||||
|
||||
rGPRClass::iterator
|
||||
rGPRClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const TargetRegisterInfo *RI = TM.getRegisterInfo();
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
GPRClass::iterator I;
|
||||
|
||||
if (Subtarget.isThumb1Only()) {
|
||||
I = THUMB_rGPRAO + (sizeof(THUMB_rGPRAO)/sizeof(unsigned));
|
||||
return RI->hasFP(MF) ? I-1 : I;
|
||||
}
|
||||
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_rGPRAO_4 + (sizeof(ARM_rGPRAO_4)/sizeof(unsigned));
|
||||
else
|
||||
I = ARM_rGPRAO_3 + (sizeof(ARM_rGPRAO_3)/sizeof(unsigned));
|
||||
} else {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_rGPRAO_2 + (sizeof(ARM_rGPRAO_2)/sizeof(unsigned));
|
||||
else if (Subtarget.isThumb())
|
||||
I = ARM_rGPRAO_5 + (sizeof(ARM_rGPRAO_5)/sizeof(unsigned));
|
||||
else
|
||||
I = ARM_rGPRAO_1 + (sizeof(ARM_rGPRAO_1)/sizeof(unsigned));
|
||||
}
|
||||
|
||||
return RI->hasFP(MF) ? I-1 : I;
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_rGPR_AO + (sizeof(THUMB_rGPR_AO)/sizeof(unsigned));
|
||||
return ARM_rGPR_AO + (sizeof(ARM_rGPR_AO)/sizeof(unsigned));
|
||||
}
|
||||
}];
|
||||
}
|
||||
@ -459,34 +337,20 @@ def tcGPR : RegisterClass<"ARM", [i32], 32, [R0, R1, R2, R3, R9, R12]> {
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_GPR_AO_TC;
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
return ARM_GPR_NOR9_TC;
|
||||
else
|
||||
return ARM_GPR_R9_TC;
|
||||
} else
|
||||
// R9 is either callee-saved or reserved; can't use it.
|
||||
return ARM_GPR_NOR9_TC;
|
||||
return Subtarget.isTargetDarwin() ? ARM_GPR_R9_TC : ARM_GPR_NOR9_TC;
|
||||
}
|
||||
|
||||
tcGPRClass::iterator
|
||||
tcGPRClass::allocation_order_end(const MachineFunction &MF) const {
|
||||
const TargetMachine &TM = MF.getTarget();
|
||||
const ARMSubtarget &Subtarget = TM.getSubtarget<ARMSubtarget>();
|
||||
GPRClass::iterator I;
|
||||
|
||||
if (Subtarget.isThumb1Only())
|
||||
return THUMB_GPR_AO_TC + (sizeof(THUMB_GPR_AO_TC)/sizeof(unsigned));
|
||||
|
||||
if (Subtarget.isTargetDarwin()) {
|
||||
if (Subtarget.isR9Reserved())
|
||||
I = ARM_GPR_NOR9_TC + (sizeof(ARM_GPR_NOR9_TC)/sizeof(unsigned));
|
||||
else
|
||||
I = ARM_GPR_R9_TC + (sizeof(ARM_GPR_R9_TC)/sizeof(unsigned));
|
||||
} else
|
||||
// R9 is either callee-saved or reserved; can't use it.
|
||||
I = ARM_GPR_NOR9_TC + (sizeof(ARM_GPR_NOR9_TC)/sizeof(unsigned));
|
||||
return I;
|
||||
return Subtarget.isTargetDarwin() ?
|
||||
ARM_GPR_R9_TC + (sizeof(ARM_GPR_R9_TC)/sizeof(unsigned)) :
|
||||
ARM_GPR_NOR9_TC + (sizeof(ARM_GPR_NOR9_TC)/sizeof(unsigned));
|
||||
}
|
||||
}];
|
||||
}
|
||||
|
@ -628,7 +628,7 @@ bb24: ; preds = %bb23
|
||||
|
||||
; CHECK: @ %bb24
|
||||
; CHECK-NEXT: @ in Loop: Header=BB1_1 Depth=1
|
||||
; CHECK-NEXT: sub{{.*}} [[REGISTER:r[0-9]+]], #1
|
||||
; CHECK-NEXT: sub{{.*}} [[REGISTER:(r[0-9]+)|(lr)]], #1
|
||||
; CHECK-NEXT: bne.w
|
||||
|
||||
%92 = icmp eq i32 %tmp81, %indvar78 ; <i1> [#uses=1]
|
||||
|
@ -11,8 +11,8 @@
|
||||
define weak arm_aapcs_vfpcc i32 @_ZNKSs7compareERKSs(%"struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >"* %this, %"struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >"* %__str) {
|
||||
; CHECK: _ZNKSs7compareERKSs:
|
||||
; CHECK: it eq
|
||||
; CHECK-NEXT: subeq.w r0, r6, r8
|
||||
; CHECK-NEXT: ldmia.w sp!, {r4, r5, r6, r8, r9, pc}
|
||||
; CHECK-NEXT: subeq r0, r6, r7
|
||||
; CHECK-NEXT: ldmia.w sp!, {r4, r5, r6, r7, r8, pc}
|
||||
entry:
|
||||
%0 = tail call arm_aapcs_vfpcc i32 @_ZNKSs4sizeEv(%"struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >"* %this) ; <i32> [#uses=3]
|
||||
%1 = tail call arm_aapcs_vfpcc i32 @_ZNKSs4sizeEv(%"struct.std::basic_string<char,std::char_traits<char>,std::allocator<char> >"* %__str) ; <i32> [#uses=3]
|
||||
|
@ -22,7 +22,7 @@
|
||||
|
||||
define %union.rec* @Manifest(%union.rec* %x, %union.rec* %env, %struct.STYLE* %style, %union.rec** %bthr, %union.rec** %fthr, %union.rec** %target, %union.rec** %crs, i32 %ok, i32 %need_expand, %union.rec** %enclose, i32 %fcr) nounwind {
|
||||
entry:
|
||||
; CHECK: ldr.w r9, [r7, #28]
|
||||
; CHECK: ldr.w {{(r[0-9])|(lr)}}, [r7, #28]
|
||||
%xgaps.i = alloca [32 x %union.rec*], align 4 ; <[32 x %union.rec*]*> [#uses=0]
|
||||
%ycomp.i = alloca [32 x %union.rec*], align 4 ; <[32 x %union.rec*]*> [#uses=0]
|
||||
br label %bb20
|
||||
@ -46,9 +46,9 @@ bb119: ; preds = %bb20, %bb20
|
||||
|
||||
bb420: ; preds = %bb20, %bb20
|
||||
; CHECK: bb420
|
||||
; CHECK: str r{{[0-7]}}, [sp]
|
||||
; CHECK: str r{{[0-7]}}, [sp, #4]
|
||||
; CHECK: str r{{[0-7]}}, [sp, #8]
|
||||
; CHECK: str{{(.w)?}} r{{[0-9]+}}, [sp]
|
||||
; CHECK: str{{(.w)?}} r{{[0-9]+}}, [sp, #4]
|
||||
; CHECK: str{{(.w)?}} r{{[0-9]+}}, [sp, #8]
|
||||
; CHECK: str{{(.w)?}} r{{[0-9]+}}, [sp, #24]
|
||||
store %union.rec* null, %union.rec** @zz_hold, align 4
|
||||
store %union.rec* null, %union.rec** @zz_res, align 4
|
||||
|
@ -21,8 +21,8 @@ entry:
|
||||
bb: ; preds = %bb, %entry
|
||||
; CHECK: LBB0_1:
|
||||
; CHECK: cmp r2, #0
|
||||
; CHECK: sub.w r9, r2, #1
|
||||
; CHECK: mov r2, r9
|
||||
; CHECK: sub{{(.w)?}} [[REGISTER:(r[0-9]+)|(lr)]], r2, #1
|
||||
; CHECK: mov r2, [[REGISTER]]
|
||||
|
||||
%0 = phi i32 [ %.pre, %entry ], [ %3, %bb ] ; <i32> [#uses=1]
|
||||
%indvar = phi i32 [ 0, %entry ], [ %indvar.next, %bb ] ; <i32> [#uses=2]
|
||||
|
Loading…
Reference in New Issue
Block a user