mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
IR: Metadata: Detect an RAUW recursion
Speculatively handle a recursion in `GenericMDNode::handleChangedOperand()`. I'm hoping this fixes the failing hexagon bot [1]. [1]: http://lab.llvm.org:8011/builders/llvm-hexagon-elf/builds/13434 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223849 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c9f47d8821
commit
ae5224d468
@ -49,6 +49,7 @@ 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;
|
||||
@ -65,8 +66,8 @@ public:
|
||||
|
||||
protected:
|
||||
Metadata(unsigned ID)
|
||||
: SubclassID(ID), IsDistinctInContext(false), SubclassData16(0),
|
||||
SubclassData32(0) {}
|
||||
: SubclassID(ID), IsDistinctInContext(false), InRAUW(false),
|
||||
SubclassData16(0), SubclassData32(0) {}
|
||||
~Metadata() {}
|
||||
|
||||
/// \brief Store this in a big non-uniqued untyped bucket.
|
||||
|
@ -495,6 +495,14 @@ void GenericMDNode::handleChangedOperand(void *Ref, Metadata *New) {
|
||||
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.
|
||||
//
|
||||
// FIXME: Can this cycle really happen?
|
||||
setOperand(Op, New);
|
||||
return;
|
||||
}
|
||||
|
||||
auto &Store = getContext().pImpl->MDNodeSet;
|
||||
Store.erase(this);
|
||||
@ -550,6 +558,7 @@ void GenericMDNode::handleChangedOperand(void *Ref, Metadata *New) {
|
||||
// Collision.
|
||||
if (!isResolved()) {
|
||||
// Still unresolved, so RAUW.
|
||||
InRAUW = true;
|
||||
ReplaceableUses->replaceAllUsesWith(*I);
|
||||
delete this;
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user