From 00f20ace9a5f60497f0fe3b8cc59a9d8ad9b4c03 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 1 Aug 2014 21:51:52 +0000 Subject: BitcodeReader: Change mechanics of BlockAddress forward references, NFC Now that we can reliably handle forward references to `BlockAddress` (r214563), change the mechanics to simplify predicting use-list order. Previously, we created dummy `GlobalVariable`s to represent block addresses. After every function was materialized, we'd go through any forward references to its blocks and RAUW them with a proper `BlockAddress` constant. This causes some (potentially a lot of) unnecessary use-list churn, since any constant expression that it's a part of will need to be rematerialized as well. Instead, pre-construct a `BasicBlock` immediately -- without attaching it to its (empty) `Function` -- and use that to construct a `BlockAddress`. This constant will not have to be regenerated. When the function body is parsed, hook this pre-constructed basic block up in the right place using `BasicBlock::insertInto()`. Both before and after this change, the IR is temporarily in an invalid state that gets resolved when `materializeForwardReferencedFunctions()` gets called. This is a prep commit that's part of PR5680, but the only functionality change is the reduction of churn in the constant pool. llvm-svn: 214570 --- llvm/lib/Bitcode/Reader/BitcodeReader.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.h') diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.h b/llvm/lib/Bitcode/Reader/BitcodeReader.h index 341e134..a25ab37 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.h +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.h @@ -179,10 +179,10 @@ class BitcodeReader : public GVMaterializer { /// stream. DenseMap DeferredFunctionInfo; - /// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These - /// are resolved lazily when functions are loaded. - typedef std::pair BlockAddrRefTy; - DenseMap > BlockAddrFwdRefs; + /// These are basic blocks forward-referenced by block addresses. They are + /// inserted lazily into functions when they're loaded. + typedef std::pair BasicBlockRefTy; + DenseMap> BasicBlockFwdRefs; /// UseRelativeIDs - Indicates that we are using a new encoding for /// instruction operands where most operands in the current -- cgit v1.1