mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
IR: Fix an inverted assertion when replacing resolved operands
Add a unit test, since this bug was only exposed by clang tests. Thanks to Rafael for tracking this down! llvm-svn: 225738
This commit is contained in:
parent
b1ea65a3b8
commit
a9129de19b
@ -444,7 +444,7 @@ void UniquableMDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
|
||||
|
||||
// Check if an operand was resolved.
|
||||
if (!isOperandUnresolved(Old))
|
||||
assert(isOperandUnresolved(New) && "Operand just became unresolved");
|
||||
assert(!isOperandUnresolved(New) && "Operand just became unresolved");
|
||||
else if (!isOperandUnresolved(New))
|
||||
decrementUnresolvedOperandCount();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/IR/Metadata.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
#include "llvm/IR/Instructions.h"
|
||||
@ -361,6 +362,28 @@ TEST_F(MDNodeTest, handleChangedOperandRecursion) {
|
||||
EXPECT_EQ(N4, N6->getOperand(0));
|
||||
}
|
||||
|
||||
TEST_F(MDNodeTest, replaceResolvedOperand) {
|
||||
// Check code for replacing one resolved operand with another. If doing this
|
||||
// directly (via replaceOperandWith()) becomes illegal, change the operand to
|
||||
// a global value that gets RAUW'ed.
|
||||
//
|
||||
// Use a temporary node to keep N from being resolved.
|
||||
std::unique_ptr<MDNodeFwdDecl> Temp(MDNodeFwdDecl::get(Context, None));
|
||||
Metadata *Ops[] = {nullptr, Temp.get()};
|
||||
|
||||
MDNode *Empty = MDTuple::get(Context, {});
|
||||
MDNode *N = MDTuple::get(Context, Ops);
|
||||
EXPECT_EQ(nullptr, N->getOperand(0));
|
||||
ASSERT_FALSE(N->isResolved());
|
||||
|
||||
// Check code for replacing resolved nodes.
|
||||
N->replaceOperandWith(0, Empty);
|
||||
EXPECT_EQ(Empty, N->getOperand(0));
|
||||
|
||||
// Remove the reference to Temp; required for teardown.
|
||||
N->replaceOperandWith(1, nullptr);
|
||||
}
|
||||
|
||||
typedef MetadataTest MetadataAsValueTest;
|
||||
|
||||
TEST_F(MetadataAsValueTest, MDNode) {
|
||||
|
Loading…
Reference in New Issue
Block a user