[llvm] r225665 - IR: Prevent handleChangedOperand() recursion
Duncan P. N. Exon Smith
dexonsmith at apple.com
Mon Jan 12 11:36:35 PST 2015
Author: dexonsmith
Date: Mon Jan 12 13:36:35 2015
New Revision: 225665
URL: http://llvm.org/viewvc/llvm-project?rev=225665&view=rev
Log:
IR: Prevent handleChangedOperand() recursion
Instead of returning early on `handleChangedOperand()` recursion
(finally identified (and test added) in r225657), prevent it upfront by
releasing operands before RAUW.
Aside from massively different program flow, there should be no
functionality change ;).
Modified:
llvm/trunk/include/llvm/IR/Metadata.h
llvm/trunk/lib/IR/Metadata.cpp
Modified: llvm/trunk/include/llvm/IR/Metadata.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=225665&r1=225664&r2=225665&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/Metadata.h (original)
+++ llvm/trunk/include/llvm/IR/Metadata.h Mon Jan 12 13:36:35 2015
@@ -49,7 +49,6 @@ class Metadata {
protected:
/// \brief Storage flag for non-uniqued, otherwise unowned, metadata.
bool IsDistinctInContext : 1;
- bool InRAUW : 1;
// TODO: expose remaining bits to subclasses.
unsigned short SubclassData16;
@@ -66,8 +65,8 @@ public:
protected:
Metadata(unsigned ID)
- : SubclassID(ID), IsDistinctInContext(false), InRAUW(false),
- SubclassData16(0), SubclassData32(0) {}
+ : SubclassID(ID), IsDistinctInContext(false), SubclassData16(0),
+ SubclassData32(0) {}
~Metadata() {}
/// \brief Store this in a big non-uniqued untyped bucket.
Modified: llvm/trunk/lib/IR/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=225665&r1=225664&r2=225665&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Metadata.cpp (original)
+++ llvm/trunk/lib/IR/Metadata.cpp Mon Jan 12 13:36:35 2015
@@ -534,12 +534,6 @@ void GenericMDNode::handleChangedOperand
setOperand(Op, New);
return;
}
- if (InRAUW) {
- // We just hit a recursion due to RAUW. Set the operand and move on, since
- // we're about to be deleted.
- setOperand(Op, New);
- return;
- }
auto &Store = getContext().pImpl->MDNodeSet;
Store.erase(this);
@@ -571,13 +565,17 @@ void GenericMDNode::handleChangedOperand
// Collision.
if (!isResolved()) {
// Still unresolved, so RAUW.
- InRAUW = true;
+ //
+ // First, clear out all operands to prevent any recursion (similar to
+ // dropAllReferences(), but we still need the use-list).
+ for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
+ setOperand(O, nullptr);
ReplaceableUses->replaceAllUsesWith(*I);
delete this;
return;
}
- // Store in non-uniqued form if this node has already been resolved.
+ // Store in non-uniqued form if RAUW isn't possible.
storeDistinctInContext();
}
More information about the llvm-commits
mailing list