mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-13 23:25:06 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214570 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -179,10 +179,10 @@ class BitcodeReader : public GVMaterializer {
|
||||
/// stream.
|
||||
DenseMap<Function*, uint64_t> DeferredFunctionInfo;
|
||||
|
||||
/// BlockAddrFwdRefs - These are blockaddr references to basic blocks. These
|
||||
/// are resolved lazily when functions are loaded.
|
||||
typedef std::pair<unsigned, GlobalVariable*> BlockAddrRefTy;
|
||||
DenseMap<Function*, std::vector<BlockAddrRefTy> > BlockAddrFwdRefs;
|
||||
/// These are basic blocks forward-referenced by block addresses. They are
|
||||
/// inserted lazily into functions when they're loaded.
|
||||
typedef std::pair<unsigned, BasicBlock *> BasicBlockRefTy;
|
||||
DenseMap<Function *, std::vector<BasicBlockRefTy>> BasicBlockFwdRefs;
|
||||
|
||||
/// UseRelativeIDs - Indicates that we are using a new encoding for
|
||||
/// instruction operands where most operands in the current
|
||||
|
Reference in New Issue
Block a user