AsmParser: parse zeroinitializer, poison constants (#117809)

LLParser::parseConstantValue is missing support for parsing
zeroinitializer and poison constants. Fix this.
This commit is contained in:
Ramkumar Ramachandra
2024-11-27 11:59:59 +00:00
committed by GitHub
parent e874c8fc27
commit 7b2a708a27
2 changed files with 22 additions and 0 deletions

View File

@@ -6261,6 +6261,8 @@ bool LLParser::parseConstantValue(Type *Ty, Constant *&C) {
case ValID::t_APSInt:
case ValID::t_APFloat:
case ValID::t_Undef:
case ValID::t_Poison:
case ValID::t_Zero:
case ValID::t_Constant:
case ValID::t_ConstantSplat:
case ValID::t_ConstantStruct:

View File

@@ -93,6 +93,22 @@ TEST(AsmParserTest, TypeAndConstantValueParsing) {
EXPECT_TRUE(V->getType()->isVectorTy());
ASSERT_TRUE(isa<ConstantDataVector>(V));
V = parseConstantValue("<4 x i32> splat (i32 -2)", Error, M);
ASSERT_TRUE(V);
EXPECT_TRUE(V->getType()->isVectorTy());
ASSERT_TRUE(isa<ConstantDataVector>(V));
V = parseConstantValue("<4 x i32> zeroinitializer", Error, M);
ASSERT_TRUE(V);
EXPECT_TRUE(V->getType()->isVectorTy());
ASSERT_TRUE(isa<Constant>(V));
EXPECT_TRUE(cast<Constant>(V)->isNullValue());
V = parseConstantValue("<4 x i32> poison", Error, M);
ASSERT_TRUE(V);
EXPECT_TRUE(V->getType()->isVectorTy());
ASSERT_TRUE(isa<PoisonValue>(V));
V = parseConstantValue("i32 add (i32 1, i32 2)", Error, M);
ASSERT_TRUE(V);
ASSERT_TRUE(isa<ConstantInt>(V));
@@ -105,6 +121,10 @@ TEST(AsmParserTest, TypeAndConstantValueParsing) {
ASSERT_TRUE(V);
ASSERT_TRUE(isa<UndefValue>(V));
V = parseConstantValue("ptr poison", Error, M);
ASSERT_TRUE(V);
ASSERT_TRUE(isa<PoisonValue>(V));
EXPECT_FALSE(parseConstantValue("duble 3.25", Error, M));
EXPECT_EQ(Error.getMessage(), "expected type");