aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2009-10-18 06:27:36 +0000
committerEvan Cheng <evan.cheng@apple.com>2009-10-18 06:27:36 +0000
commit20270c909357e5e501cac1f5393430dfacfc57d8 (patch)
tree41dfc4d483c999b2d3c23c2cd70f4a60d216055d /lib/CodeGen/SelectionDAG/SelectionDAG.cpp
parentc6e200960812992f1124c92f801166bd1b387971 (diff)
Only fixed stack objects and spill slots should be get FixedStack PseudoSourceValue.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84411 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SelectionDAG/SelectionDAG.cpp')
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAG.cpp56
1 files changed, 41 insertions, 15 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8bd0370cc6..cd7e1fd5f2 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3507,16 +3507,22 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
SDValue Ptr, SDValue Cmp,
SDValue Swp, const Value* PtrVal,
unsigned Alignment) {
+ MachineFunction &MF = getMachineFunction();
+ MachineFrameInfo *FrameInfo = MF.getFrameInfo();
+
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(MemVT);
// Check if the memory reference references a frame index
if (!PtrVal)
if (const FrameIndexSDNode *FI =
- dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
- PtrVal = PseudoSourceValue::getFixedStack(FI->getIndex());
+ dyn_cast<const FrameIndexSDNode>(Ptr.getNode())) {
+ if (FrameInfo->isFixedObjectIndex(FI->getIndex()))
+ PtrVal = PseudoSourceValue::getFixedStack(FI->getIndex());
+ else
+ PtrVal = PseudoSourceValue::getStack();
+ }
- MachineFunction &MF = getMachineFunction();
unsigned Flags = MachineMemOperand::MOLoad | MachineMemOperand::MOStore;
// For now, atomics are considered to be volatile always.
@@ -3560,16 +3566,21 @@ SDValue SelectionDAG::getAtomic(unsigned Opcode, DebugLoc dl, EVT MemVT,
SDValue Ptr, SDValue Val,
const Value* PtrVal,
unsigned Alignment) {
+ MachineFunction &MF = getMachineFunction();
+ MachineFrameInfo *FrameInfo = MF.getFrameInfo();
+
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(MemVT);
// Check if the memory reference references a frame index
if (!PtrVal)
if (const FrameIndexSDNode *FI =
- dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
- PtrVal = PseudoSourceValue::getFixedStack(FI->getIndex());
+ dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
+ if (FrameInfo->isFixedObjectIndex(FI->getIndex()))
+ PtrVal = PseudoSourceValue::getFixedStack(FI->getIndex());
+ else
+ PtrVal = PseudoSourceValue::getStack();
- MachineFunction &MF = getMachineFunction();
unsigned Flags = MachineMemOperand::MOLoad | MachineMemOperand::MOStore;
// For now, atomics are considered to be volatile always.
@@ -3707,16 +3718,21 @@ SelectionDAG::getLoad(ISD::MemIndexedMode AM, DebugLoc dl,
SDValue Ptr, SDValue Offset,
const Value *SV, int SVOffset, EVT MemVT,
bool isVolatile, unsigned Alignment) {
+ MachineFunction &MF = getMachineFunction();
+ MachineFrameInfo *FrameInfo = MF.getFrameInfo();
+
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(VT);
// Check if the memory reference references a frame index
if (!SV)
if (const FrameIndexSDNode *FI =
- dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
- SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
+ if (FrameInfo->isFixedObjectIndex(FI->getIndex()))
+ SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ else
+ SV = PseudoSourceValue::getStack();
- MachineFunction &MF = getMachineFunction();
unsigned Flags = MachineMemOperand::MOLoad;
if (isVolatile)
Flags |= MachineMemOperand::MOVolatile;
@@ -3806,16 +3822,21 @@ SelectionDAG::getIndexedLoad(SDValue OrigLoad, DebugLoc dl, SDValue Base,
SDValue SelectionDAG::getStore(SDValue Chain, DebugLoc dl, SDValue Val,
SDValue Ptr, const Value *SV, int SVOffset,
bool isVolatile, unsigned Alignment) {
+ MachineFunction &MF = getMachineFunction();
+ MachineFrameInfo *FrameInfo = MF.getFrameInfo();
+
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(Val.getValueType());
// Check if the memory reference references a frame index
if (!SV)
if (const FrameIndexSDNode *FI =
- dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
- SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
+ if (FrameInfo->isFixedObjectIndex(FI->getIndex()))
+ SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ else
+ SV = PseudoSourceValue::getStack();
- MachineFunction &MF = getMachineFunction();
unsigned Flags = MachineMemOperand::MOStore;
if (isVolatile)
Flags |= MachineMemOperand::MOVolatile;
@@ -3852,16 +3873,21 @@ SDValue SelectionDAG::getTruncStore(SDValue Chain, DebugLoc dl, SDValue Val,
SDValue Ptr, const Value *SV,
int SVOffset, EVT SVT,
bool isVolatile, unsigned Alignment) {
+ MachineFunction &MF = getMachineFunction();
+ MachineFrameInfo *FrameInfo = MF.getFrameInfo();
+
if (Alignment == 0) // Ensure that codegen never sees alignment 0
Alignment = getEVTAlignment(SVT);
// Check if the memory reference references a frame index
if (!SV)
if (const FrameIndexSDNode *FI =
- dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
- SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ dyn_cast<const FrameIndexSDNode>(Ptr.getNode()))
+ if (FrameInfo->isFixedObjectIndex(FI->getIndex()))
+ SV = PseudoSourceValue::getFixedStack(FI->getIndex());
+ else
+ SV = PseudoSourceValue::getStack();
- MachineFunction &MF = getMachineFunction();
unsigned Flags = MachineMemOperand::MOStore;
if (isVolatile)
Flags |= MachineMemOperand::MOVolatile;