Skip to content

Commit

Permalink
Deduplicate constant data tables
Browse files Browse the repository at this point in the history
A constant data is assigned to different variables several times, then
we will create multiple globalVariables, which causes the constant data
is repeated in the .rodata section with different names.
Like this:
.rodata (size = 1344 bytes)
    __unnamed_3 (offset = 0  size = 448 hash = 0xB186021131D03E38)
     (offset = 0  size = 0 hash = 0x071E967D705FB008)
          0:3F1FE7C0 3F0B1A4C 3F53F141 00000000 BE095BFF BF71E3A8 3F745048 00000000
         32:3EC6833C BEDE978D 3F1520B0 00000000 3DF8572A BE45729B 3E693F29 00000000
         ...
    __unnamed_2 (offset = 448  size = 448 hash = 0xB186021131D03E38)
        448:3F1FE7C0 3F0B1A4C 3F53F141 00000000 BE095BFF BF71E3A8 3F745048 00000000
        480:3EC6833C BEDE978D 3F1520B0 00000000 3DF8572A BE45729B 3E693F29 00000000
        ...
    __unnamed_1 (offset = 896  size = 448 hash = 0xB186021131D03E38)
        896:3F1FE7C0 3F0B1A4C 3F53F141 00000000 BE095BFF BF71E3A8 3F745048 00000000
        928:3EC6833C BEDE978D 3F1520B0 00000000 3DF8572A BE45729B 3E693F29 00000000
        ...

For the globalVariable that the initialization values are the same, we
should treat them as the same variable.
  • Loading branch information
AMD-dwang committed Nov 28, 2023
1 parent 8d38dd6 commit f646e54
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 4 deletions.
16 changes: 12 additions & 4 deletions llpc/lower/llpcSpirvLowerConstImmediateStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ PreservedAnalyses SpirvLowerConstImmediateStore::run(Module &module, ModuleAnaly
// Process "alloca" instructions to see if they can be optimized to a read-only global
// variable.
bool changed = false;
m_allocToGlobals.clear();
for (auto &func : module.functions()) {
if (!func.empty()) {
if (processAllocaInsts(&func))
Expand Down Expand Up @@ -222,10 +223,17 @@ bool SpirvLowerConstImmediateStore::tryProcessAlloca(AllocaInst *allocaInst) {
}

// Step 3: Create the global variable and replace the alloca
auto global = new GlobalVariable(*m_module, allocatedTy,
true, // isConstant
GlobalValue::InternalLinkage, initializer, "", nullptr, GlobalValue::NotThreadLocal,
SPIRAS_Constant);
GlobalVariable *global = nullptr;
auto iter = m_allocToGlobals.find(initializer);
if (iter == m_allocToGlobals.end()) {
global = new GlobalVariable(*m_module, allocatedTy,
true, // isConstant
GlobalValue::InternalLinkage, initializer, "", nullptr, GlobalValue::NotThreadLocal,
SPIRAS_Constant);
m_allocToGlobals[initializer] = global;
} else {
global = iter->second;
}
global->takeName(allocaInst);

for (Use &use : llvm::make_early_inc_range(allocaInst->uses()))
Expand Down
2 changes: 2 additions & 0 deletions llpc/lower/llpcSpirvLowerConstImmediateStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ class SpirvLowerConstImmediateStore : public SpirvLower, public llvm::PassInfoMi
private:
bool processAllocaInsts(llvm::Function *func);
bool tryProcessAlloca(llvm::AllocaInst *allocaInst);

llvm::DenseMap<llvm::Value *, llvm::GlobalVariable *> m_allocToGlobals;
};

} // namespace Llpc

0 comments on commit f646e54

Please sign in to comment.