mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-02 22:32:08 +00:00
[Sparc] Prevent instructions that defines or uses %o7 to be in call's delay slot.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182063 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
df68803890
commit
d6b4caf291
@ -61,8 +61,9 @@ namespace {
|
|||||||
bool isDelayFiller(MachineBasicBlock &MBB,
|
bool isDelayFiller(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator candidate);
|
MachineBasicBlock::iterator candidate);
|
||||||
|
|
||||||
void insertCallUses(MachineBasicBlock::iterator MI,
|
void insertCallDefsUses(MachineBasicBlock::iterator MI,
|
||||||
SmallSet<unsigned, 32>& RegUses);
|
SmallSet<unsigned, 32>& RegDefs,
|
||||||
|
SmallSet<unsigned, 32>& RegUses);
|
||||||
|
|
||||||
void insertDefsUses(MachineBasicBlock::iterator MI,
|
void insertDefsUses(MachineBasicBlock::iterator MI,
|
||||||
SmallSet<unsigned, 32>& RegDefs,
|
SmallSet<unsigned, 32>& RegDefs,
|
||||||
@ -150,7 +151,7 @@ Filler::findDelayInstr(MachineBasicBlock &MBB,
|
|||||||
|
|
||||||
//Call's delay filler can def some of call's uses.
|
//Call's delay filler can def some of call's uses.
|
||||||
if (slot->isCall())
|
if (slot->isCall())
|
||||||
insertCallUses(slot, RegUses);
|
insertCallDefsUses(slot, RegDefs, RegUses);
|
||||||
else
|
else
|
||||||
insertDefsUses(slot, RegDefs, RegUses);
|
insertDefsUses(slot, RegDefs, RegUses);
|
||||||
|
|
||||||
@ -230,9 +231,12 @@ bool Filler::delayHasHazard(MachineBasicBlock::iterator candidate,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Filler::insertCallUses(MachineBasicBlock::iterator MI,
|
void Filler::insertCallDefsUses(MachineBasicBlock::iterator MI,
|
||||||
SmallSet<unsigned, 32>& RegUses)
|
SmallSet<unsigned, 32>& RegDefs,
|
||||||
|
SmallSet<unsigned, 32>& RegUses)
|
||||||
{
|
{
|
||||||
|
//Call defines o7, which is visible to the instruction in delay slot.
|
||||||
|
RegDefs.insert(SP::O7);
|
||||||
|
|
||||||
switch(MI->getOpcode()) {
|
switch(MI->getOpcode()) {
|
||||||
default: llvm_unreachable("Unknown opcode.");
|
default: llvm_unreachable("Unknown opcode.");
|
||||||
|
@ -87,4 +87,21 @@ entry:
|
|||||||
ret i32 0
|
ret i32 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
define i32 @prevent_o7_in_call_delay_slot(i32 %i0) {
|
||||||
|
entry:
|
||||||
|
;CHECK: prevent_o7_in_call_delay_slot
|
||||||
|
;CHECK: add %i0, 2, %o5
|
||||||
|
;CHECK: add %i0, 3, %o7
|
||||||
|
;CHECK: add %o5, %o7, %o0
|
||||||
|
;CHECK: call bar
|
||||||
|
;CHECK-NEXT: nop
|
||||||
|
%0 = add nsw i32 %i0, 2
|
||||||
|
%1 = add nsw i32 %i0, 3
|
||||||
|
tail call void asm sideeffect "", "r,r,~{l0},~{l1},~{l2},~{l3},~{l4},~{l5},~{l6},~{l7},~{i0},~{i1},~{i2},~{i3},~{i4},~{i5},~{i6},~{i7},~{o0},~{o1},~{o2},~{o3},~{o4}"(i32 %0, i32 %1)
|
||||||
|
%2 = add nsw i32 %0, %1
|
||||||
|
%3 = tail call i32 @bar(i32 %2)
|
||||||
|
ret i32 %3
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
declare i32 @func(i32*)
|
declare i32 @func(i32*)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user