mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-12 13:30:51 +00:00
[mips][microMIPS] Fix issue with delay slot filler and microMIPS
Differential Revision: http://reviews.llvm.org/D6193 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221612 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d2c5947a4c
commit
c63c935a80
@ -497,24 +497,32 @@ getUnderlyingObjects(const MachineInstr &MI,
|
||||
/// We assume there is only one delay slot per delayed instruction.
|
||||
bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
|
||||
bool Changed = false;
|
||||
bool InMicroMipsMode = TM.getSubtarget<MipsSubtarget>().inMicroMipsMode();
|
||||
|
||||
for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
|
||||
if (!hasUnoccupiedSlot(&*I))
|
||||
continue;
|
||||
|
||||
++FilledSlots;
|
||||
Changed = true;
|
||||
// For microMIPS, at the moment, do not fill delay slots of call
|
||||
// instructions.
|
||||
//
|
||||
// TODO: Support for replacing regular call instructions with corresponding
|
||||
// short delay slot instructions should be implemented.
|
||||
if (!InMicroMipsMode || !I->isCall()) {
|
||||
++FilledSlots;
|
||||
Changed = true;
|
||||
|
||||
// Delay slot filling is disabled at -O0.
|
||||
if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) {
|
||||
if (searchBackward(MBB, I))
|
||||
continue;
|
||||
|
||||
if (I->isTerminator()) {
|
||||
if (searchSuccBBs(MBB, I))
|
||||
// Delay slot filling is disabled at -O0.
|
||||
if (!DisableDelaySlotFiller && (TM.getOptLevel() != CodeGenOpt::None)) {
|
||||
if (searchBackward(MBB, I))
|
||||
continue;
|
||||
} else if (searchForward(MBB, I)) {
|
||||
continue;
|
||||
|
||||
if (I->isTerminator()) {
|
||||
if (searchSuccBBs(MBB, I))
|
||||
continue;
|
||||
} else if (searchForward(MBB, I)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
18
test/CodeGen/Mips/micromips-delay-slot.ll
Normal file
18
test/CodeGen/Mips/micromips-delay-slot.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc -march=mipsel -mcpu=mips32r2 -mattr=+micromips \
|
||||
; RUN: -relocation-model=pic -O3 < %s | FileCheck %s
|
||||
|
||||
; Function Attrs: nounwind uwtable
|
||||
define i32 @foo(i32 %a) #0 {
|
||||
entry:
|
||||
%a.addr = alloca i32, align 4
|
||||
store i32 %a, i32* %a.addr, align 4
|
||||
%0 = load i32* %a.addr, align 4
|
||||
%shl = shl i32 %0, 2
|
||||
%call = call i32 @bar(i32 %shl)
|
||||
ret i32 %call
|
||||
}
|
||||
|
||||
declare i32 @bar(i32) #1
|
||||
|
||||
; CHECK: nop
|
||||
|
Loading…
Reference in New Issue
Block a user