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.
|
// Check if an operand was resolved.
|
||||||
if (!isOperandUnresolved(Old))
|
if (!isOperandUnresolved(Old))
|
||||||
assert(isOperandUnresolved(New) && "Operand just became unresolved");
|
assert(!isOperandUnresolved(New) && "Operand just became unresolved");
|
||||||
else if (!isOperandUnresolved(New))
|
else if (!isOperandUnresolved(New))
|
||||||
decrementUnresolvedOperandCount();
|
decrementUnresolvedOperandCount();
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
//
|
//
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
#include "llvm/ADT/STLExtras.h"
|
||||||
#include "llvm/IR/Metadata.h"
|
#include "llvm/IR/Metadata.h"
|
||||||
#include "llvm/IR/Constants.h"
|
#include "llvm/IR/Constants.h"
|
||||||
#include "llvm/IR/Instructions.h"
|
#include "llvm/IR/Instructions.h"
|
||||||
@ -361,6 +362,28 @@ TEST_F(MDNodeTest, handleChangedOperandRecursion) {
|
|||||||
EXPECT_EQ(N4, N6->getOperand(0));
|
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;
|
typedef MetadataTest MetadataAsValueTest;
|
||||||
|
|
||||||
TEST_F(MetadataAsValueTest, MDNode) {
|
TEST_F(MetadataAsValueTest, MDNode) {
|
||||||
|
Loading…
Reference in New Issue
Block a user