diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 152b494..25a0155 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -2223,7 +2223,21 @@ remapIndices(Function &Caller, BasicBlock *StartBB, } for (auto &I : llvm::make_early_inc_range(*BB)) { if (auto *Inc = dyn_cast<InstrProfIncrementInst>(&I)) { - if (Inc != BBID) { + if (isa<InstrProfIncrementInstStep>(Inc)) { + // Step instrumentation is used for select instructions. Inlining may + // have propagated a constant resulting in the condition of the select + // being resolved, case in which function cloning resolves the value + // of the select, and elides the select instruction. If that is the + // case, the step parameter of the instrumentation will reflect that. + // We can delete the instrumentation in that case. + if (isa<Constant>(Inc->getStep())) { + assert(!Inc->getNextNode() || !isa<SelectInst>(Inc->getNextNode())); + Inc->eraseFromParent(); + } else { + assert(isa_and_nonnull<SelectInst>(Inc->getNextNode())); + RewriteInstrIfNeeded(*Inc); + } + } else if (Inc != BBID) { // If we're here it means that the BB had more than 1 IDs, presumably // some coming from the callee. We "made up our mind" to keep the // first one (which may or may not have been originally the caller's). |