mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-11 08:29:25 +00:00
Clear unknown mem ops when merging stack slots (pr14090)
When merging stack slots, if StackColoring::remapInstructions gets a value back from GetUnderlyingObject that it does not know about or is not itself a stack slot, clear the memory operand in case it aliases the merged slot. This prevents the introduction of incorrect aliasing information. Author: Matthew Curtis <mcurtis@codeaurora.org> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166216 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -261,7 +261,7 @@ unsigned StackColoring::collectMarkers(unsigned NumSlot) {
|
||||
|
||||
MarkersFound++;
|
||||
|
||||
const Value *Allocation = MFI->getObjectAllocation(Slot);
|
||||
const AllocaInst *Allocation = MFI->getObjectAllocation(Slot);
|
||||
if (Allocation) {
|
||||
DEBUG(dbgs()<<"Found a lifetime marker for slot #"<<Slot<<
|
||||
" with allocation: "<< Allocation->getName()<<"\n");
|
||||
@@ -481,11 +481,11 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
|
||||
}
|
||||
|
||||
// Keep a list of *allocas* which need to be remapped.
|
||||
DenseMap<const Value*, const Value*> Allocas;
|
||||
DenseMap<const AllocaInst*, const AllocaInst*> Allocas;
|
||||
for (DenseMap<int, int>::iterator it = SlotRemap.begin(),
|
||||
e = SlotRemap.end(); it != e; ++it) {
|
||||
const Value *From = MFI->getObjectAllocation(it->first);
|
||||
const Value *To = MFI->getObjectAllocation(it->second);
|
||||
const AllocaInst *From = MFI->getObjectAllocation(it->first);
|
||||
const AllocaInst *To = MFI->getObjectAllocation(it->second);
|
||||
assert(To && From && "Invalid allocation object");
|
||||
Allocas[From] = To;
|
||||
}
|
||||
@@ -515,10 +515,17 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
|
||||
V = GetUnderlyingObject(V);
|
||||
// If we did not find one, or if the one that we found is not in our
|
||||
// map, then move on.
|
||||
if (!V || !Allocas.count(V))
|
||||
if (!V || !isa<AllocaInst>(V)) {
|
||||
// Clear mem operand since we don't know for sure that it doesn't
|
||||
// alias a merged alloca.
|
||||
MMO->setValue(0);
|
||||
continue;
|
||||
}
|
||||
const AllocaInst *AI= cast<AllocaInst>(V);
|
||||
if (!Allocas.count(AI))
|
||||
continue;
|
||||
|
||||
MMO->setValue(Allocas[V]);
|
||||
MMO->setValue(Allocas[AI]);
|
||||
FixedMemOp++;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user