diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 321f2b0d642081..049fc0f2f0e81b 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1577,8 +1577,6 @@ Expected BitcodeReader::materializeValue(unsigned StartValID, I->setIsExact(); } else { switch (BC->Opcode) { - case BitcodeConstant::ConstantStructOpcode: - case BitcodeConstant::ConstantArrayOpcode: case BitcodeConstant::ConstantVectorOpcode: { Type *IdxTy = Type::getInt32Ty(BC->getContext()); Value *V = PoisonValue::get(BC->getType()); @@ -1590,6 +1588,15 @@ Expected BitcodeReader::materializeValue(unsigned StartValID, I = cast(V); break; } + case BitcodeConstant::ConstantStructOpcode: + case BitcodeConstant::ConstantArrayOpcode: { + Value *V = PoisonValue::get(BC->getType()); + for (auto Pair : enumerate(Ops)) + V = InsertValueInst::Create(V, Pair.value(), Pair.index(), + "constexpr.ins", InsertBB); + I = cast(V); + break; + } case Instruction::ICmp: case Instruction::FCmp: I = CmpInst::Create((Instruction::OtherOps)BC->Opcode, diff --git a/llvm/test/Bitcode/constexpr-to-instr.ll b/llvm/test/Bitcode/constexpr-to-instr.ll index 07accafb838265..c099273de810f6 100644 --- a/llvm/test/Bitcode/constexpr-to-instr.ll +++ b/llvm/test/Bitcode/constexpr-to-instr.ll @@ -70,6 +70,24 @@ define <3 x i64> @test_vector() { ret <3 x i64> } +define [3 x i64] @test_array() { +; CHECK-LABEL: define [3 x i64] @test_array() { +; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 +; CHECK-NEXT: %constexpr.ins = insertvalue [3 x i64] poison, i64 5, 0 +; CHECK-NEXT: %constexpr.ins1 = insertvalue [3 x i64] %constexpr.ins, i64 %constexpr, 1 +; CHECK-NEXT: %constexpr.ins2 = insertvalue [3 x i64] %constexpr.ins1, i64 7, 2 + ret [3 x i64] [i64 5, i64 ptrtoint (ptr @g to i64), i64 7] +} + +define { i64, i64, i64 } @test_struct() { +; CHECK-LABEL: define { i64, i64, i64 } @test_struct() { +; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 +; CHECK-NEXT: %constexpr.ins = insertvalue { i64, i64, i64 } poison, i64 5, 0 +; CHECK-NEXT: %constexpr.ins1 = insertvalue { i64, i64, i64 } %constexpr.ins, i64 %constexpr, 1 +; CHECK-NEXT: %constexpr.ins2 = insertvalue { i64, i64, i64 } %constexpr.ins1, i64 7, 2 + ret { i64, i64, i64 } {i64 5, i64 ptrtoint (ptr @g to i64), i64 7} +} + define i64 @test_reused_expr() { ; CHECK-LABEL: define i64 @test_reused_expr() { ; CHECK-NEXT: %constexpr = ptrtoint ptr @g to i64 diff --git a/llvm/test/Bitcode/constexpr-to-instr.ll.bc b/llvm/test/Bitcode/constexpr-to-instr.ll.bc index 7fae9c05fbd75f..c77968ce9207a3 100644 Binary files a/llvm/test/Bitcode/constexpr-to-instr.ll.bc and b/llvm/test/Bitcode/constexpr-to-instr.ll.bc differ