[llvm] r341526 - Return "[NFC] Add severe validation of InstructionPrecedenceTracking"
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 6 16:11:51 PDT 2018
On 09/06/2018 01:33 AM, Max Kazantsev via llvm-commits wrote:
> Author: mkazantsev
> Date: Thu Sep 6 01:33:02 2018
> New Revision: 341526
>
> URL: http://llvm.org/viewvc/llvm-project?rev=341526&view=rev
> Log:
> Return "[NFC] Add severe validation of InstructionPrecedenceTracking"
>
> This validation patch has been reverted as rL341147 because of conserns raised by
> @reames. This revision returns it as is to raise a discussion and address the concerns.
Max, the wording here didn't quite mean what you meant. We already had
the discussion, this patch isn't intended to trigger one. :)
>
> Differential Revision: https://reviews.llvm.org/D51523
> Reviewed By: reames
>
> Modified:
> llvm/trunk/include/llvm/Analysis/InstructionPrecedenceTracking.h
> llvm/trunk/lib/Analysis/InstructionPrecedenceTracking.cpp
>
> Modified: llvm/trunk/include/llvm/Analysis/InstructionPrecedenceTracking.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/InstructionPrecedenceTracking.h?rev=341526&r1=341525&r2=341526&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Analysis/InstructionPrecedenceTracking.h (original)
> +++ llvm/trunk/include/llvm/Analysis/InstructionPrecedenceTracking.h Thu Sep 6 01:33:02 2018
> @@ -37,6 +37,18 @@ class InstructionPrecedenceTracking {
> // Fills information about the given block's special instructions.
> void fill(const BasicBlock *BB);
>
> +#ifndef NDEBUG
> + /// Asserts that the cached info for \p BB is up-to-date. This helps to catch
> + /// the usage error of accessing a block without properly invalidating after a
> + /// previous transform.
> + void validate(const BasicBlock *BB) const;
> +
> + /// Asserts whether or not the contents of this tracking is up-to-date. This
> + /// helps to catch the usage error of accessing a block without properly
> + /// invalidating after a previous transform.
> + void validateAll() const;
> +#endif
> +
> protected:
> InstructionPrecedenceTracking(DominatorTree *DT)
> : OI(OrderedInstructions(DT)) {}
>
> Modified: llvm/trunk/lib/Analysis/InstructionPrecedenceTracking.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/InstructionPrecedenceTracking.cpp?rev=341526&r1=341525&r2=341526&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Analysis/InstructionPrecedenceTracking.cpp (original)
> +++ llvm/trunk/lib/Analysis/InstructionPrecedenceTracking.cpp Thu Sep 6 01:33:02 2018
> @@ -23,8 +23,25 @@
>
> using namespace llvm;
>
> +#ifndef NDEBUG
> +static cl::opt<bool> ExpensiveAsserts(
> + "ipt-expensive-asserts",
> + cl::desc("Perform expensive assert validation on every query to Instruction"
> + " Precedence Tracking"),
> + cl::init(false), cl::Hidden);
> +#endif
> +
> const Instruction *InstructionPrecedenceTracking::getFirstSpecialInstruction(
> const BasicBlock *BB) {
> +#ifndef NDEBUG
> + // If there is a bug connected to invalid cache, turn on ExpensiveAsserts to
> + // catch this situation as early as possible.
> + if (ExpensiveAsserts)
> + validateAll();
> + else
> + validate(BB);
> +#endif
> +
> if (!KnownBlocks.count(BB))
> fill(BB);
> auto *FirstICF = FirstSpecialInsts.lookup(BB);
> @@ -56,6 +73,45 @@ void InstructionPrecedenceTracking::fill
> KnownBlocks.insert(BB);
> }
>
> +#ifndef NDEBUG
> +void InstructionPrecedenceTracking::validate(const BasicBlock *BB) const {
> + // If we don't know anything about this block, make sure we don't store
> + // a bucket for it in FirstSpecialInsts map.
> + if (!KnownBlocks.count(BB)) {
> + assert(FirstSpecialInsts.find(BB) == FirstSpecialInsts.end() && "Must be!");
> + return;
> + }
> +
> + auto It = FirstSpecialInsts.find(BB);
> + bool BlockHasSpecialInsns = false;
> + for (const Instruction &Insn : *BB) {
> + if (isSpecialInstruction(&Insn)) {
> + assert(It != FirstSpecialInsts.end() &&
> + "Blocked marked as known but we have no cached value for it!");
> + assert(It->second == &Insn &&
> + "Cached first special instruction is wrong!");
> + BlockHasSpecialInsns = true;
> + break;
> + }
> + }
> + if (!BlockHasSpecialInsns)
> + assert(It == FirstSpecialInsts.end() &&
> + "Block is marked as having special instructions but in fact it "
> + "has none!");
> +}
> +
> +void InstructionPrecedenceTracking::validateAll() const {
> + // Check that for every known block the cached value is correct.
> + for (auto *BB : KnownBlocks)
> + validate(BB);
> +
> + // Check that all blocks with cached values are marked as known.
> + for (auto &It : FirstSpecialInsts)
> + assert(KnownBlocks.count(It.first) &&
> + "We have a cached value but the block is not marked as known?");
> +}
> +#endif
> +
> void InstructionPrecedenceTracking::invalidateBlock(const BasicBlock *BB) {
> OI.invalidateBlock(BB);
> FirstSpecialInsts.erase(BB);
> @@ -67,6 +123,10 @@ void InstructionPrecedenceTracking::clea
> OI.invalidateBlock(It.first);
> FirstSpecialInsts.clear();
> KnownBlocks.clear();
> +#ifndef NDEBUG
> + // The map should be valid after clearing (at least empty).
> + validateAll();
> +#endif
> }
>
> bool ImplicitControlFlowTracking::isSpecialInstruction(
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list