1
0
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:
Duncan P. N. Exon Smith 2015-01-13 00:10:38 +00:00
parent b1ea65a3b8
commit a9129de19b
2 changed files with 24 additions and 1 deletions

View File

@ -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();
}

View File

@ -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) {