diff options
author | Joachim Meyer <5982050+fodinabor@users.noreply.github.com> | 2024-05-21 17:31:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-21 17:31:50 -0700 |
commit | 0170bd5d111f55f45f993a749727ce2815cc0b16 (patch) | |
tree | de467bd9d11c2ee247aa54d7d395f2139b275b4e | |
parent | 79a32609759af317a62184c2c7b1300263a336c8 (diff) | |
download | llvm-0170bd5d111f55f45f993a749727ce2815cc0b16.zip llvm-0170bd5d111f55f45f993a749727ce2815cc0b16.tar.gz llvm-0170bd5d111f55f45f993a749727ce2815cc0b16.tar.bz2 |
[MDBuilder] `mergeCallbackEncodings` fails due to inspecting the wrong node (#92466)
Given the following metadata as, with `!6` as `ExistingCallbacks` and
`!8` as `NewCB`:
```
!6 = !{!7}
!7 = !{i64 0, i1 false}
!8 = !{i64 2, i64 3, i1 false}
```
The merge function should add `!8` to the list of `!6`, i.e. `!6 =
!{!7,!8}`. However, at the moment the check if this is legal, tries to
interpret `!7` as integer instead of it's operand.
-rw-r--r-- | llvm/lib/IR/MDBuilder.cpp | 14 | ||||
-rw-r--r-- | llvm/unittests/IR/MDBuilderTest.cpp | 39 |
2 files changed, 46 insertions, 7 deletions
diff --git a/llvm/lib/IR/MDBuilder.cpp b/llvm/lib/IR/MDBuilder.cpp index 0bf41d7..bd68db3 100644 --- a/llvm/lib/IR/MDBuilder.cpp +++ b/llvm/lib/IR/MDBuilder.cpp @@ -86,9 +86,8 @@ MDNode *MDBuilder::createFunctionEntryCount( } MDNode *MDBuilder::createFunctionSectionPrefix(StringRef Prefix) { - return MDNode::get(Context, - {createString("function_section_prefix"), - createString(Prefix)}); + return MDNode::get( + Context, {createString("function_section_prefix"), createString(Prefix)}); } MDNode *MDBuilder::createRange(const APInt &Lo, const APInt &Hi) { @@ -148,9 +147,10 @@ MDNode *MDBuilder::mergeCallbackEncodings(MDNode *ExistingCallbacks, for (unsigned u = 0; u < NumExistingOps; u++) { Ops[u] = ExistingCallbacks->getOperand(u); - auto *OldCBCalleeIdxAsCM = cast<ConstantAsMetadata>(Ops[u]); + auto *OldCBCalleeIdxAsCM = + cast<ConstantAsMetadata>(cast<MDNode>(Ops[u])->getOperand(0)); uint64_t OldCBCalleeIdx = - cast<ConstantInt>(OldCBCalleeIdxAsCM->getValue())->getZExtValue(); + cast<ConstantInt>(OldCBCalleeIdxAsCM->getValue())->getZExtValue(); (void)OldCBCalleeIdx; assert(NewCBCalleeIdx != OldCBCalleeIdx && "Cannot map a callback callee index twice!"); @@ -339,8 +339,8 @@ MDNode *MDBuilder::createMutableTBAAAccessTag(MDNode *Tag) { MDNode *MDBuilder::createIrrLoopHeaderWeight(uint64_t Weight) { Metadata *Vals[] = { - createString("loop_header_weight"), - createConstant(ConstantInt::get(Type::getInt64Ty(Context), Weight)), + createString("loop_header_weight"), + createConstant(ConstantInt::get(Type::getInt64Ty(Context), Weight)), }; return MDNode::get(Context, Vals); } diff --git a/llvm/unittests/IR/MDBuilderTest.cpp b/llvm/unittests/IR/MDBuilderTest.cpp index 2b5ab81..4656c70 100644 --- a/llvm/unittests/IR/MDBuilderTest.cpp +++ b/llvm/unittests/IR/MDBuilderTest.cpp @@ -127,4 +127,43 @@ TEST_F(MDBuilderTest, createPCSections) { EXPECT_EQ(mdconst::extract<ConstantInt>(Aux->getOperand(1))->getValue(), C2->getValue()); } +TEST_F(MDBuilderTest, createCallbackAndMerge) { + MDBuilder MDHelper(Context); + auto *CB1 = MDHelper.createCallbackEncoding(0, {1, -1}, false); + auto *CB2 = MDHelper.createCallbackEncoding(2, {-1}, false); + ASSERT_EQ(CB1->getNumOperands(), 4U); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB1->getOperand(0))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB1->getOperand(1))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB1->getOperand(2))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB1->getOperand(3))); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB1->getOperand(0))->getValue(), 0); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB1->getOperand(1))->getValue(), 1); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB1->getOperand(2))->getValue(), -1); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB1->getOperand(3))->getValue(), + false); + ASSERT_EQ(CB2->getNumOperands(), 3U); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB2->getOperand(0))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB2->getOperand(1))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB2->getOperand(2))); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB2->getOperand(0))->getValue(), 2); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB2->getOperand(1))->getValue(), -1); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB2->getOperand(2))->getValue(), + false); + auto *CBList = MDNode::get(Context, {CB1, CB2}); + auto *CB3 = MDHelper.createCallbackEncoding(4, {5}, false); + auto *NewCBList = MDHelper.mergeCallbackEncodings(CBList, CB3); + ASSERT_EQ(NewCBList->getNumOperands(), 3U); + EXPECT_TRUE(NewCBList->getOperand(0) == CB1); + EXPECT_TRUE(NewCBList->getOperand(1) == CB2); + EXPECT_TRUE(NewCBList->getOperand(2) == CB3); + + ASSERT_EQ(CB3->getNumOperands(), 3U); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB3->getOperand(0))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB3->getOperand(1))); + ASSERT_TRUE(isa<ConstantAsMetadata>(CB3->getOperand(2))); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB3->getOperand(0))->getValue(), 4); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB3->getOperand(1))->getValue(), 5); + EXPECT_EQ(mdconst::extract<ConstantInt>(CB3->getOperand(2))->getValue(), + false); +} } // namespace |