[Bitcode] Fix constexpr autoupgrade for arrays and structs
authorNikita Popov <npopov@redhat.com>
Wed, 7 Sep 2022 10:46:32 +0000 (12:46 +0200)
committerNikita Popov <npopov@redhat.com>
Wed, 7 Sep 2022 10:47:21 +0000 (12:47 +0200)
While vectors use insertelement, structs and arrays should use
insertvalue.

llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/test/Bitcode/constexpr-to-instr.ll
llvm/test/Bitcode/constexpr-to-instr.ll.bc

index 321f2b0..049fc0f 100644 (file)
@@ -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,
index 07accaf..c099273 100644 (file)
@@ -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
index 7fae9c0..c77968c 100644 (file)
Binary files a/llvm/test/Bitcode/constexpr-to-instr.ll.bc and b/llvm/test/Bitcode/constexpr-to-instr.ll.bc differ