[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