diff options
| author | Anna Thomas <anna@azul.com> | 2017-11-02 16:45:51 +0000 |
|---|---|---|
| committer | Anna Thomas <anna@azul.com> | 2017-11-02 16:45:51 +0000 |
| commit | ebe429d99f539c876082597e6790b51ef28f50b0 (patch) | |
| tree | 66741ae00848903e451119a479c42e1d63545f12 /llvm/lib/Transforms | |
| parent | c217b1b124678089e8e73d073c33b6b19aa32189 (diff) | |
| download | bcm5719-llvm-ebe429d99f539c876082597e6790b51ef28f50b0.tar.gz bcm5719-llvm-ebe429d99f539c876082597e6790b51ef28f50b0.zip | |
Revert "[RS4GC] Strip off invariant.start because memory locations arent invariant"
This reverts commit r317215, investigating the test failure.
llvm-svn: 317217
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp | 48 |
1 files changed, 9 insertions, 39 deletions
diff --git a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp index 9a064829dee..1ca77cfec32 100644 --- a/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp +++ b/llvm/lib/Transforms/Scalar/RewriteStatepointsForGC.cpp @@ -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) { |

