diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 8ec5c6a4aa67..1f786e4093f6 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -4228,6 +4228,7 @@ bool LLParser::parseConstantValue(Type *Ty, Constant *&C) { switch (ID.Kind) { case ValID::t_APSInt: case ValID::t_APFloat: + case ValID::t_Undef: case ValID::t_Constant: case ValID::t_ConstantStruct: case ValID::t_PackedConstantStruct: { diff --git a/llvm/test/CodeGen/MIR/X86/memory-operands.mir b/llvm/test/CodeGen/MIR/X86/memory-operands.mir index 0f9b38feda2a..3c9463d2f313 100644 --- a/llvm/test/CodeGen/MIR/X86/memory-operands.mir +++ b/llvm/test/CodeGen/MIR/X86/memory-operands.mir @@ -180,6 +180,12 @@ store i32 %conv, i32* getelementptr inbounds ([50 x %st], [50 x %st]* @values, i64 0, i64 0, i32 0), align 16 ret void } + + define i8* @undef_value() { + entry: + %0 = load i8*, i8** undef, align 8 + ret i8* %0 + } ... --- name: test @@ -490,3 +496,13 @@ body: | MOV32mr killed %rax, 1, _, 0, _, %edi, implicit killed %rdi :: (store 4 into `i32* getelementptr inbounds ([50 x %st], [50 x %st]* @values, i64 0, i64 0, i32 0)`, align 16) RETQ ... +--- +name: undef_value +tracksRegLiveness: true +body: | + bb.0.entry: + ; CHECK-LABEL: name: undef_value + ; CHECK: %rax = MOV64rm undef %rax, 1, _, 0, _ :: (load 8 from `i8** undef`) + %rax = MOV64rm undef %rax, 1, _, 0, _ :: (load 8 from `i8** undef`) + RETQ %rax +... diff --git a/llvm/unittests/AsmParser/AsmParserTest.cpp b/llvm/unittests/AsmParser/AsmParserTest.cpp index ef16eb1cfb38..4189310fda23 100644 --- a/llvm/unittests/AsmParser/AsmParserTest.cpp +++ b/llvm/unittests/AsmParser/AsmParserTest.cpp @@ -99,6 +99,10 @@ TEST(AsmParserTest, TypeAndConstantValueParsing) { ASSERT_TRUE(V); ASSERT_TRUE(isa(V)); + V = parseConstantValue("i8** undef", Error, M); + ASSERT_TRUE(V); + ASSERT_TRUE(isa(V)); + EXPECT_FALSE(parseConstantValue("duble 3.25", Error, M)); EXPECT_EQ(Error.getMessage(), "expected type");