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 829e85f
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 4 deletions.
14 changes: 10 additions & 4 deletions llpc/lower/llpcSpirvLowerConstImmediateStore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,16 @@ 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);

std::unordered_map<llvm::Value *, llvm::GlobalVariable *> m_allocToGlobals;
};

} // namespace Llpc

0 comments on commit 829e85f

Please sign in to comment.