[Bitcode] Fix constexpr autoupgrade for arrays and structs
While vectors use insertelement, structs and arrays should use insertvalue.
This commit is contained in:
parent
973fec78e9
commit
d452d5e2de
|
@ -1577,8 +1577,6 @@ Expected<Value *> 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<Value *> BitcodeReader::materializeValue(unsigned StartValID,
|
|||
I = cast<Instruction>(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<Instruction>(V);
|
||||
break;
|
||||
}
|
||||
case Instruction::ICmp:
|
||||
case Instruction::FCmp:
|
||||
I = CmpInst::Create((Instruction::OtherOps)BC->Opcode,
|
||||
|
|
|
@ -70,6 +70,24 @@ define <3 x i64> @test_vector() {
|
|||
ret <3 x i64> <i64 5, i64 ptrtoint (ptr @g to i64), i64 7>
|
||||
}
|
||||
|
||||
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
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue