[PATCH] D15798: Fix for Bug 24852 (crash with -debug -instcombine)
Mehdi AMINI via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 6 14:28:15 PST 2016
joker.eph added a comment.
David: I have the same question. It turns out that to reproduce you need to print an instruction that has a metadata attached, but does not have a parent.
Here is the offending code in InstCombine (with comment from me on what happens):
DEBUG(raw_string_ostream SS(OrigI); I->print(SS); OrigI = SS.str(););
DEBUG(dbgs() << "IC: Visiting: " << OrigI << '\n');
if (Instruction *Result = visit(*I)) { // <-- Result does not have a parent, neither a dbgloc at this point
++NumCombined;
// Should we replace the old instruction with a new one?
if (Result != I) {
DEBUG(dbgs() << "IC: Old = " << *I << '\n'
<< " New = " << *Result << '\n'); // <-- This print succeed because there is no debug location
if (I->getDebugLoc())
Result->setDebugLoc(I->getDebugLoc()); // <-- here we set the debug location, still no parent
// Everything uses the new instruction now.
I->replaceAllUsesWith(Result); // <- we are in a state where we have user but still no parent, is it valid?
// Move the name to the new instruction first.
Result->takeName(I);
// Push the new instruction and any users onto the worklist.
Worklist.Add(Result); // <- This is where we will try to print again, but this time with a debug location and no parent (->crash)
Worklist.AddUsersToWorkList(*Result);
// Insert the new instruction into the basic block...
BasicBlock *InstParent = I->getParent();
BasicBlock::iterator InsertPos = I->getIterator();
http://reviews.llvm.org/D15798
More information about the llvm-commits
mailing list