Skip to content

Commit

Permalink
Inlining: Don't re-map simplified cloned instructions.
Browse files Browse the repository at this point in the history
When simplifying an instruction that has been re-mapped, it should never
simplify to an instruction in the original function. In the edge case
where we are inlining a function into itself, the existing code led to
incorrect behavior. Replace the incorrect code with an assert verifying
that we never expect simplification to produce an instruction in the old
function, unless the functions are the same.

Differential Revision: https://reviews.llvm.org/D33850

llvm-svn: 306495
  • Loading branch information
Kyle Butt committed Jun 28, 2017
1 parent 46dd7db commit f73c8a0
Showing 1 changed file with 5 additions and 4 deletions.
9 changes: 5 additions & 4 deletions llvm/lib/Transforms/Utils/CloneFunction.cpp
Expand Up @@ -325,10 +325,11 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
// the basic block.
if (Value *V =
SimplifyInstruction(NewInst, BB->getModule()->getDataLayout())) {
// On the off-chance that this simplifies to an instruction in the old
// function, map it back into the new function.
if (Value *MappedV = VMap.lookup(V))
V = MappedV;
assert((!isa<Instruction>(V) ||
cast<Instruction>(V)->getParent() == nullptr ||
cast<Instruction>(V)->getFunction() != OldFunc ||
OldFunc == NewFunc) &&
"Simplified Instruction should not be in the old function.");

if (!NewInst->mayHaveSideEffects()) {
VMap[&*II] = V;
Expand Down

0 comments on commit f73c8a0

Please sign in to comment.