summaryrefslogtreecommitdiff
path: root/lib/CodeGen/StackSlotColoring.cpp
diff options
context:
space:
mode:
authorDan Gohman <gohman@apple.com>2008-12-05 05:31:14 +0000
committerDan Gohman <gohman@apple.com>2008-12-05 05:31:14 +0000
commit9bf23b54524c06efd164648b613fd724e8d4494b (patch)
tree0161a266eb8e0a6e6c7a17b5a12ede19f75eee7f /lib/CodeGen/StackSlotColoring.cpp
parent490b1833a96bf0391ebdfba7828d43a8c3512851 (diff)
downloadllvm-9bf23b54524c06efd164648b613fd724e8d4494b.tar.gz
llvm-9bf23b54524c06efd164648b613fd724e8d4494b.tar.bz2
llvm-9bf23b54524c06efd164648b613fd724e8d4494b.tar.xz
Teach StackSlotColoring to update MachineMemOperands when
changing the stack slots on an instruction, to keep them consistent with the actual memory addresses. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60584 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/StackSlotColoring.cpp')
-rw-r--r--lib/CodeGen/StackSlotColoring.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/CodeGen/StackSlotColoring.cpp b/lib/CodeGen/StackSlotColoring.cpp
index bc062835fb..fdd2336e78 100644
--- a/lib/CodeGen/StackSlotColoring.cpp
+++ b/lib/CodeGen/StackSlotColoring.cpp
@@ -15,6 +15,7 @@
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/LiveStackAnalysis.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
+#include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Compiler.h"
#include "llvm/Support/Debug.h"
@@ -225,10 +226,26 @@ bool StackSlotColoring::ColorSlots(MachineFunction &MF) {
int FI = MO.getIndex();
if (FI < 0)
continue;
- FI = SlotMapping[FI];
- if (FI == -1)
+ int NewFI = SlotMapping[FI];
+ if (NewFI == -1)
continue;
- MO.setIndex(FI);
+ MO.setIndex(NewFI);
+
+ // Update the MachineMemOperand for the new memory location.
+ // FIXME: We need a better method of managing these too.
+ SmallVector<MachineMemOperand, 2> MMOs(MI.memoperands_begin(),
+ MI.memoperands_end());
+ MI.clearMemOperands(MF);
+ const Value *OldSV = PseudoSourceValue::getFixedStack(FI);
+ for (unsigned i = 0, e = MMOs.size(); i != e; ++i) {
+ if (MMOs[i].getValue() == OldSV) {
+ MachineMemOperand MMO(PseudoSourceValue::getFixedStack(NewFI),
+ MMOs[i].getFlags(), MMOs[i].getOffset(),
+ MMOs[i].getSize(), MMOs[i].getAlignment());
+ MI.addMemOperand(MF, MMO);
+ } else
+ MI.addMemOperand(MF, MMOs[i]);
+ }
}
}
}