mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-23 02:29:18 +00:00
Don't add memory operands to storeRegToStackSlot / loadRegFromStackSlot results,
they already have one. This fixes the himenobmtxpa miscompilation on ARM. The PostRA scheduler got confused by the double memoperand and hoisted a stack slot load above a store to the same slot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108219 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8f17bc4fbd
commit
9fac4159dd
@ -24,6 +24,7 @@
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/PostRAHazardRecognizer.h"
|
||||
#include "llvm/CodeGen/PseudoSourceValue.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/ErrorHandling.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
using namespace llvm;
|
||||
@ -253,35 +254,8 @@ TargetInstrInfo::foldMemoryOperand(MachineBasicBlock::iterator MI,
|
||||
MachineFunction &MF = *MBB->getParent();
|
||||
|
||||
// Ask the target to do the actual folding.
|
||||
MachineInstr *NewMI = foldMemoryOperandImpl(MF, MI, Ops, FI);
|
||||
|
||||
// Straight COPY may fold as load/store.
|
||||
if (!NewMI) {
|
||||
if (!MI->isCopy() || Ops.size() != 1)
|
||||
return 0;
|
||||
|
||||
const TargetRegisterClass *RC = canFoldCopy(MI, Ops[0]);
|
||||
if (!RC)
|
||||
return 0;
|
||||
|
||||
const MachineOperand &MO = MI->getOperand(1-Ops[0]);
|
||||
MachineBasicBlock::iterator Pos = MI;
|
||||
const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
|
||||
|
||||
if (Flags == MachineMemOperand::MOStore)
|
||||
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, TRI);
|
||||
else
|
||||
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, TRI);
|
||||
|
||||
NewMI = --Pos;
|
||||
} else {
|
||||
// FIXME: change foldMemoryOperandImpl semantics to also insert NewMI.
|
||||
NewMI = MBB->insert(MI, NewMI);
|
||||
}
|
||||
|
||||
if (!NewMI) return 0;
|
||||
|
||||
|
||||
if (MachineInstr *NewMI = foldMemoryOperandImpl(MF, MI, Ops, FI)) {
|
||||
// Add a memory operand, foldMemoryOperandImpl doesn't do that.
|
||||
assert((!(Flags & MachineMemOperand::MOStore) ||
|
||||
NewMI->getDesc().mayStore()) &&
|
||||
"Folded a def to a non-store!");
|
||||
@ -297,7 +271,27 @@ TargetInstrInfo::foldMemoryOperand(MachineBasicBlock::iterator MI,
|
||||
MFI.getObjectAlignment(FI));
|
||||
NewMI->addMemOperand(MF, MMO);
|
||||
|
||||
return NewMI;
|
||||
// FIXME: change foldMemoryOperandImpl semantics to also insert NewMI.
|
||||
return MBB->insert(MI, NewMI);
|
||||
}
|
||||
|
||||
// Straight COPY may fold as load/store.
|
||||
if (!MI->isCopy() || Ops.size() != 1)
|
||||
return 0;
|
||||
|
||||
const TargetRegisterClass *RC = canFoldCopy(MI, Ops[0]);
|
||||
if (!RC)
|
||||
return 0;
|
||||
|
||||
const MachineOperand &MO = MI->getOperand(1-Ops[0]);
|
||||
MachineBasicBlock::iterator Pos = MI;
|
||||
const TargetRegisterInfo *TRI = MF.getTarget().getRegisterInfo();
|
||||
|
||||
if (Flags == MachineMemOperand::MOStore)
|
||||
storeRegToStackSlot(*MBB, Pos, MO.getReg(), MO.isKill(), FI, RC, TRI);
|
||||
else
|
||||
loadRegFromStackSlot(*MBB, Pos, MO.getReg(), FI, RC, TRI);
|
||||
return --Pos;
|
||||
}
|
||||
|
||||
/// foldMemoryOperand - Same as the previous version except it allows folding
|
||||
|
Loading…
Reference in New Issue
Block a user