[llvm] 05b86a8 - [Bitcode] Support expanding constant expressions in function metadata

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 28 06:04:00 PDT 2023


Author: Nikita Popov
Date: 2023-09-28T15:03:52+02:00
New Revision: 05b86a8fea23865e4a437efa9cb4f6844ccbf50e

URL: https://github.com/llvm/llvm-project/commit/05b86a8fea23865e4a437efa9cb4f6844ccbf50e
DIFF: https://github.com/llvm/llvm-project/commit/05b86a8fea23865e4a437efa9cb4f6844ccbf50e.diff

LOG: [Bitcode] Support expanding constant expressions in function metadata

This fixes the bitcode upgrade failure reported in
https://reviews.llvm.org/D155924#4616789.

The expansion always happens in the entry block, so this may be
inaccurate if there are trapping constant expressions.

Added: 
    llvm/test/Bitcode/Inputs/constexpr-to-instr-metadata.bc
    llvm/test/Bitcode/constexpr-to-instr-metadata.ll

Modified: 
    llvm/lib/Bitcode/Reader/BitcodeReader.cpp
    llvm/lib/Bitcode/Reader/MetadataLoader.cpp
    llvm/lib/Bitcode/Reader/MetadataLoader.h

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 1d1ec988a93d847..e56291859022eec 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -4683,7 +4683,7 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
       case bitc::METADATA_BLOCK_ID:
         assert(DeferredMetadataInfo.empty() &&
                "Must read all module-level metadata before function-level");
-        if (Error Err = MDLoader->parseFunctionMetadata())
+        if (Error Err = MDLoader->parseFunctionMetadata(CurBB))
           return Err;
         break;
       case bitc::USELIST_BLOCK_ID:

diff  --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
index 641cd1befa4c03a..e124354990907c3 100644
--- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
+++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
@@ -473,7 +473,8 @@ class MetadataLoader::MetadataLoaderImpl {
 
   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
                          PlaceholderQueue &Placeholders, StringRef Blob,
-                         unsigned &NextMetadataNo);
+                         unsigned &NextMetadataNo,
+                         BasicBlock *ConstExprInsertBB);
   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
                              function_ref<void(StringRef)> CallBack);
   Error parseGlobalObjectAttachment(GlobalObject &GO,
@@ -742,7 +743,7 @@ class MetadataLoader::MetadataLoaderImpl {
         TheModule(TheModule), Callbacks(std::move(Callbacks)),
         IsImporting(IsImporting) {}
 
-  Error parseMetadata(bool ModuleLevel);
+  Error parseMetadata(bool ModuleLevel, BasicBlock *ConstExprInsertBB);
 
   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
 
@@ -1067,7 +1068,8 @@ void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(Metadata **Val,
 
 /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
 /// module level metadata.
-Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
+Error MetadataLoader::MetadataLoaderImpl::parseMetadata(
+    bool ModuleLevel, BasicBlock *ConstExprInsertBB) {
   if (!ModuleLevel && MetadataList.hasFwdRefs())
     return error("Invalid metadata: fwd refs into function blocks");
 
@@ -1150,7 +1152,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
     if (Expected<unsigned> MaybeCode =
             Stream.readRecord(Entry.ID, Record, &Blob)) {
       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
-                                       Blob, NextMetadataNo))
+                                       Blob, NextMetadataNo, ConstExprInsertBB))
         return Err;
     } else
       return MaybeCode.takeError();
@@ -1191,7 +1193,8 @@ void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
   if (Expected<unsigned> MaybeCode =
           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
     if (Error Err =
-            parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
+            parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID,
+                             /* ConstExprInsertBB */ nullptr))
       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
                          Twine(toString(std::move(Err))));
   } else
@@ -1235,7 +1238,8 @@ void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
 
 Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
     SmallVectorImpl<uint64_t> &Record, unsigned Code,
-    PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
+    PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo,
+    BasicBlock *ConstExprInsertBB) {
 
   bool IsDistinct = false;
   auto getMD = [&](unsigned ID) -> Metadata * {
@@ -1389,8 +1393,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
     if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy())
       return error("Invalid record");
 
-    Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
-                                        /*ConstExprInsertBB*/ nullptr);
+    Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID, ConstExprInsertBB);
     if (!V)
       return error("Invalid value reference from metadata");
 
@@ -2479,8 +2482,9 @@ MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
     : Pimpl(std::make_unique<MetadataLoaderImpl>(
           Stream, TheModule, ValueList, std::move(Callbacks), IsImporting)) {}
 
-Error MetadataLoader::parseMetadata(bool ModuleLevel) {
-  return Pimpl->parseMetadata(ModuleLevel);
+Error MetadataLoader::parseMetadata(bool ModuleLevel,
+                                    BasicBlock *ConstExprInsertBB) {
+  return Pimpl->parseMetadata(ModuleLevel, ConstExprInsertBB);
 }
 
 bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }

diff  --git a/llvm/lib/Bitcode/Reader/MetadataLoader.h b/llvm/lib/Bitcode/Reader/MetadataLoader.h
index fbee7e49f8dff14..3bbe51b2f70b25d 100644
--- a/llvm/lib/Bitcode/Reader/MetadataLoader.h
+++ b/llvm/lib/Bitcode/Reader/MetadataLoader.h
@@ -19,6 +19,7 @@
 #include <memory>
 
 namespace llvm {
+class BasicBlock;
 class BitcodeReaderValueList;
 class BitstreamCursor;
 class DISubprogram;
@@ -47,7 +48,8 @@ struct MetadataLoaderCallbacks {
 class MetadataLoader {
   class MetadataLoaderImpl;
   std::unique_ptr<MetadataLoaderImpl> Pimpl;
-  Error parseMetadata(bool ModuleLevel);
+  Error parseMetadata(bool ModuleLevel,
+                      BasicBlock *ConstExprInsertBB = nullptr);
 
 public:
   ~MetadataLoader();
@@ -61,7 +63,9 @@ class MetadataLoader {
   Error parseModuleMetadata() { return parseMetadata(true); }
 
   // Parse a function metadata block
-  Error parseFunctionMetadata() { return parseMetadata(false); }
+  Error parseFunctionMetadata(BasicBlock *ConstExprInsertBB) {
+    return parseMetadata(false, ConstExprInsertBB);
+  }
 
   /// Set the mode to strip TBAA metadata on load.
   void setStripTBAA(bool StripTBAA = true);

diff  --git a/llvm/test/Bitcode/Inputs/constexpr-to-instr-metadata.bc b/llvm/test/Bitcode/Inputs/constexpr-to-instr-metadata.bc
new file mode 100644
index 000000000000000..ddee3bd4ea25b82
Binary files /dev/null and b/llvm/test/Bitcode/Inputs/constexpr-to-instr-metadata.bc 
diff er

diff  --git a/llvm/test/Bitcode/constexpr-to-instr-metadata.ll b/llvm/test/Bitcode/constexpr-to-instr-metadata.ll
new file mode 100644
index 000000000000000..78b5e30dd3154b5
--- /dev/null
+++ b/llvm/test/Bitcode/constexpr-to-instr-metadata.ll
@@ -0,0 +1,12 @@
+; RUN: llvm-dis -expand-constant-exprs < %S/Inputs/constexpr-to-instr-metadata.bc | FileCheck %s
+
+; CHECK-LABEL: define void @test() {
+; CHECK: %constexpr = ptrtoint ptr @g to i32
+; CHECK: %constexpr1 = zext i32 %constexpr to i64
+; CHECK: %constexpr2 = ptrtoint ptr @g to i64
+; CHECK: %constexpr3 = lshr i64 %constexpr2, 32
+; CHECK: %constexpr4 = trunc i64 %constexpr3 to i32
+; CHECK: %constexpr5 = zext i32 %constexpr4 to i64
+; CHECK: %constexpr6 = shl i64 %constexpr5, 32
+; CHECK: %constexpr7 = or i64 %constexpr1, %constexpr6
+; CHECK: call void @llvm.dbg.value(metadata i64 %constexpr7, metadata !4, metadata !DIExpression(DW_OP_LLVM_fragment, 64, 64)), !dbg !13


        


More information about the llvm-commits mailing list