Revert "[RS4GC] Strip off invariant.start because memory locations arent invariant"

This reverts commit r317215, investigating the test failure.

llvm-svn: 317217
This commit is contained in:
Anna Thomas
2017-11-02 16:45:51 +00:00
parent c217b1b124
commit ebe429d99f
2 changed files with 9 additions and 92 deletions

View File

@@ -125,10 +125,10 @@ struct RewriteStatepointsForGC : public ModulePass {
Changed |= runOnFunction(F);
if (Changed) {
// stripNonValidData asserts that shouldRewriteStatepointsIn
// stripNonValidAttributesAndMetadata asserts that shouldRewriteStatepointsIn
// returns true for at least one function in the module. Since at least
// one function changed, we know that the precondition is satisfied.
stripNonValidData(M);
stripNonValidAttributesAndMetadata(M);
}
return Changed;
@@ -146,17 +146,15 @@ struct RewriteStatepointsForGC : public ModulePass {
/// metadata implying dereferenceability that are no longer valid/correct after
/// RewriteStatepointsForGC has run. This is because semantically, after
/// RewriteStatepointsForGC runs, all calls to gc.statepoint "free" the entire
/// heap. stripNonValidData (conservatively) restores
/// heap. stripNonValidAttributesAndMetadata (conservatively) restores
/// correctness by erasing all attributes in the module that externally imply
/// dereferenceability. Similar reasoning also applies to the noalias
/// attributes and metadata. gc.statepoint can touch the entire heap including
/// noalias objects.
/// Apart from attributes and metadata, we also remove instructions that imply
/// constant physical memory: llvm.invariant.start.
void stripNonValidData(Module &M);
void stripNonValidAttributesAndMetadata(Module &M);
// Helpers for stripNonValidData
void stripNonValidDataFromBody(Function &F);
// Helpers for stripNonValidAttributesAndMetadata
void stripNonValidAttributesAndMetadataFromBody(Function &F);
void stripNonValidAttributesFromPrototype(Function &F);
// Certain metadata on instructions are invalid after running RS4GC.
@@ -2387,30 +2385,14 @@ void RewriteStatepointsForGC::stripInvalidMetadataFromInstruction(Instruction &I
I.dropUnknownNonDebugMetadata(ValidMetadataAfterRS4GC);
}
void RewriteStatepointsForGC::stripNonValidDataFromBody(Function &F) {
void RewriteStatepointsForGC::stripNonValidAttributesAndMetadataFromBody(Function &F) {
if (F.empty())
return;
LLVMContext &Ctx = F.getContext();
MDBuilder Builder(Ctx);
// Set of invariantstart instructions that we need to remove.
// Use this to avoid invalidating the instruction iterator.
SmallVector<IntrinsicInst*, 12> InvariantStartInstructions;
for (Instruction &I : instructions(F)) {
// invariant.start on memory location implies that the referenced memory
// location is constant and unchanging. This is no longer true after
// RewriteStatepointsForGC runs because there can be calls to gc.statepoint
// which frees the entire heap and the presence of invariant.start allows
// the optimizer to sink the load of a memory location past a statepoint,
// which is incorrect.
if (auto *II = dyn_cast<IntrinsicInst>(&I))
if (II->getIntrinsicID() == Intrinsic::invariant_start) {
InvariantStartInstructions.push_back(II);
continue;
}
if (const MDNode *MD = I.getMetadata(LLVMContext::MD_tbaa)) {
assert(MD->getNumOperands() < 5 && "unrecognized metadata shape!");
bool IsImmutableTBAA =
@@ -2440,18 +2422,6 @@ void RewriteStatepointsForGC::stripNonValidDataFromBody(Function &F) {
RemoveNonValidAttrAtIndex(Ctx, CS, AttributeList::ReturnIndex);
}
}
// Delete the invariant.start instructions and any corresponding uses that
// don't have further uses, for example invariant.end.
for (auto *II : InvariantStartInstructions) {
for (auto *U : II->users())
if (auto *I = dyn_cast<Instruction>(U))
if (U->hasNUses(0))
I->eraseFromParent();
// We cannot just delete the remaining uses of II, so we RAUW undef.
II->replaceAllUsesWith(UndefValue::get(II->getType()));
II->eraseFromParent();
}
}
/// Returns true if this function should be rewritten by this pass. The main
@@ -2468,7 +2438,7 @@ static bool shouldRewriteStatepointsIn(Function &F) {
return false;
}
void RewriteStatepointsForGC::stripNonValidData(Module &M) {
void RewriteStatepointsForGC::stripNonValidAttributesAndMetadata(Module &M) {
#ifndef NDEBUG
assert(llvm::any_of(M, shouldRewriteStatepointsIn) && "precondition!");
#endif
@@ -2477,7 +2447,7 @@ void RewriteStatepointsForGC::stripNonValidData(Module &M) {
stripNonValidAttributesFromPrototype(F);
for (Function &F : M)
stripNonValidDataFromBody(F);
stripNonValidAttributesAndMetadataFromBody(F);
}
bool RewriteStatepointsForGC::runOnFunction(Function &F) {