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
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 8bd0370..cd7e1fd 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -3507,16 +3507,22 @@
                                 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 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 @@
                       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 @@
 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 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;