diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -83,13 +83,17 @@ // reference and something is wrong. This code is here to print out where // the value is still being referenced. // - if (!use_empty()) { + // Note that use_empty() cannot be called here, as it eventually downcasts + // 'this' to GlobalValue (derived class of Value), but GlobalValue has already + // been destructed, so accessing it is UB. + // + if (!materialized_use_empty()) { dbgs() << "While deleting: " << *VTy << " %" << getName() << "\n"; for (auto *U : users()) dbgs() << "Use still stuck around after Def is destroyed:" << *U << "\n"; } #endif - assert(use_empty() && "Uses remain when a value is destroyed!"); + assert(materialized_use_empty() && "Uses remain when a value is destroyed!"); // If this value is named, destroy the name. This should not be in a symtab // at this point.