Skip to content

Commit

Permalink
[StackColoring] Update AliasAnalysis information in stack coloring pa…
Browse files Browse the repository at this point in the history
…ss (part 2)

This patch is update after the first patch (https://reviews.llvm.org/rL309651) based on the post-commit comments.

Stack coloring pass need to maintain AliasAnalysis information when merging stack slots of different types.
Actually, there is a FIXME comment in StackColoring.cpp

// FIXME: In order to enable the use of TBAA when using AA in CodeGen,
// we'll also need to update the TBAA nodes in MMOs with values
// derived from the merged allocas.

But, TBAA has been already enabled in CodeGen without fixing this pass.
The incorrect TBAA metadata results in recent failures in bootstrap test on ppc64le (PR33928) by allowing unsafe instruction scheduling.
Although we observed the problem on ppc64le, this is a platform neutral issue.

This patch makes the stack coloring pass maintains AliasAnalysis information when merging multiple stack slots.

This patch fixes PR33928.

llvm-svn: 309849
  • Loading branch information
inouehrs committed Aug 2, 2017
1 parent f67036b commit 0bd906e
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 11 deletions.
13 changes: 6 additions & 7 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3319,13 +3319,6 @@ void llvm::getUnderlyingObjectsForCodeGen(const Value *V,
GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL);

for (Value *V : Objs) {
// If GetUnderlyingObjects fails to find an identifiable object,
// getUnderlyingObjectsForCodeGen also fails for safety.
if (!isIdentifiedObject(V)) {
Objects.clear();
return;
}

if (!Visited.insert(V).second)
continue;
if (Operator::getOpcode(V) == Instruction::IntToPtr) {
Expand All @@ -3336,6 +3329,12 @@ void llvm::getUnderlyingObjectsForCodeGen(const Value *V,
continue;
}
}
// If GetUnderlyingObjects fails to find an identifiable object,
// getUnderlyingObjectsForCodeGen also fails for safety.
if (!isIdentifiedObject(V)) {
Objects.clear();
return;
}
Objects.push_back(const_cast<Value *>(V));
}
} while (!Working.empty());
Expand Down
8 changes: 4 additions & 4 deletions llvm/lib/CodeGen/StackColoring.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1001,7 +1001,7 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
}

// We adjust AliasAnalysis information for merged stack slots.
MachineSDNode::mmo_iterator MemOps =
MachineSDNode::mmo_iterator NewMemOps =
MF->allocateMemRefsArray(I.getNumMemOperands());
unsigned MemOpIdx = 0;
bool ReplaceMemOps = false;
Expand Down Expand Up @@ -1030,17 +1030,17 @@ void StackColoring::remapInstructions(DenseMap<int, int> &SlotRemap) {
}
}
if (MayHaveConflictingAAMD) {
MemOps[MemOpIdx++] = MF->getMachineMemOperand(MMO, AAMDNodes());
NewMemOps[MemOpIdx++] = MF->getMachineMemOperand(MMO, AAMDNodes());
ReplaceMemOps = true;
}
else
MemOps[MemOpIdx++] = MMO;
NewMemOps[MemOpIdx++] = MMO;
}

// If any memory operand is updated, set memory references of
// this instruction.
if (ReplaceMemOps)
I.setMemRefs(std::make_pair(MemOps, I.getNumMemOperands()));
I.setMemRefs(std::make_pair(NewMemOps, I.getNumMemOperands()));
}

// Update the location of C++ catch objects for the MSVC personality routine.
Expand Down

0 comments on commit 0bd906e

Please sign in to comment.