Have hasLoad/StoreFrom/ToStackSlot return the relevant MachineMemOperand.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90608 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Greene 2009-12-04 22:38:46 +00:00
parent 39fdd6947c
commit 29dbf50b18
2 changed files with 21 additions and 9 deletions

View File

@ -34,6 +34,7 @@
#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmInfo.h"
#include <limits> #include <limits>
#include <cstring>
using namespace llvm; using namespace llvm;
@ -783,12 +784,14 @@ unsigned X86InstrInfo::isLoadFromStackSlotPostFE(const MachineInstr *MI,
if ((Reg = isLoadFromStackSlot(MI, FrameIndex))) if ((Reg = isLoadFromStackSlot(MI, FrameIndex)))
return Reg; return Reg;
// Check for post-frame index elimination operations // Check for post-frame index elimination operations
return hasLoadFromStackSlot(MI, FrameIndex); const MachineMemOperand *Dummy;
return hasLoadFromStackSlot(MI, Dummy, FrameIndex);
} }
return 0; return 0;
} }
bool X86InstrInfo::hasLoadFromStackSlot(const MachineInstr *MI, bool X86InstrInfo::hasLoadFromStackSlot(const MachineInstr *MI,
const MachineMemOperand *&MMO,
int &FrameIndex) const { int &FrameIndex) const {
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(), for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
oe = MI->memoperands_end(); oe = MI->memoperands_end();
@ -798,6 +801,7 @@ bool X86InstrInfo::hasLoadFromStackSlot(const MachineInstr *MI,
if (const FixedStackPseudoSourceValue *Value = if (const FixedStackPseudoSourceValue *Value =
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) { dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
FrameIndex = Value->getFrameIndex(); FrameIndex = Value->getFrameIndex();
MMO = *o;
return true; return true;
} }
} }
@ -819,12 +823,14 @@ unsigned X86InstrInfo::isStoreToStackSlotPostFE(const MachineInstr *MI,
if ((Reg = isStoreToStackSlot(MI, FrameIndex))) if ((Reg = isStoreToStackSlot(MI, FrameIndex)))
return Reg; return Reg;
// Check for post-frame index elimination operations // Check for post-frame index elimination operations
return hasStoreToStackSlot(MI, FrameIndex); const MachineMemOperand *Dummy;
return hasStoreToStackSlot(MI, Dummy, FrameIndex);
} }
return 0; return 0;
} }
bool X86InstrInfo::hasStoreToStackSlot(const MachineInstr *MI, bool X86InstrInfo::hasStoreToStackSlot(const MachineInstr *MI,
const MachineMemOperand *&MMO,
int &FrameIndex) const { int &FrameIndex) const {
for (MachineInstr::mmo_iterator o = MI->memoperands_begin(), for (MachineInstr::mmo_iterator o = MI->memoperands_begin(),
oe = MI->memoperands_end(); oe = MI->memoperands_end();
@ -834,6 +840,7 @@ bool X86InstrInfo::hasStoreToStackSlot(const MachineInstr *MI,
if (const FixedStackPseudoSourceValue *Value = if (const FixedStackPseudoSourceValue *Value =
dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) { dyn_cast<const FixedStackPseudoSourceValue>((*o)->getValue())) {
FrameIndex = Value->getFrameIndex(); FrameIndex = Value->getFrameIndex();
MMO = *o;
return true; return true;
} }
} }

View File

@ -457,11 +457,14 @@ public:
/// hasLoadFromStackSlot - If the specified machine instruction has /// hasLoadFromStackSlot - If the specified machine instruction has
/// a load from a stack slot, return true along with the FrameIndex /// a load from a stack slot, return true along with the FrameIndex
/// of the loaded stack slot. If not, return false. Unlike /// of the loaded stack slot and the machine mem operand containing
/// the reference. If not, return false. Unlike
/// isLoadFromStackSlot, this returns true for any instructions that /// isLoadFromStackSlot, this returns true for any instructions that
/// loads from the stack. This is a hint only and may not catch all /// loads from the stack. This is a hint only and may not catch all
/// cases. /// cases.
bool hasLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const; bool hasLoadFromStackSlot(const MachineInstr *MI,
const MachineMemOperand *&MMO,
int &FrameIndex) const;
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const; unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const;
/// isStoreToStackSlotPostFE - Check for post-frame ptr elimination /// isStoreToStackSlotPostFE - Check for post-frame ptr elimination
@ -472,11 +475,13 @@ public:
/// hasStoreToStackSlot - If the specified machine instruction has a /// hasStoreToStackSlot - If the specified machine instruction has a
/// store to a stack slot, return true along with the FrameIndex of /// store to a stack slot, return true along with the FrameIndex of
/// the loaded stack slot. If not, return false. Unlike /// the loaded stack slot and the machine mem operand containing the
/// isStoreToStackSlot, this returns true for any instructions that /// reference. If not, return false. Unlike isStoreToStackSlot,
/// loads from the stack. This is a hint only and may not catch all /// this returns true for any instructions that loads from the
/// cases. /// stack. This is a hint only and may not catch all cases.
bool hasStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const; bool hasStoreToStackSlot(const MachineInstr *MI,
const MachineMemOperand *&MMO,
int &FrameIndex) const;
bool isReallyTriviallyReMaterializable(const MachineInstr *MI, bool isReallyTriviallyReMaterializable(const MachineInstr *MI,
AliasAnalysis *AA) const; AliasAnalysis *AA) const;