diff options
author | Timm Baeder <tbaeder@redhat.com> | 2025-09-17 09:27:07 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-09-17 09:27:07 +0200 |
commit | 2155f17d39f3969ef841c85ef1102a214ab22b30 (patch) | |
tree | 137b4249d4455dbf5c10bff6349303137a384f66 /clang/lib/AST/ByteCode/Pointer.cpp | |
parent | 5829652a6def4031853104b43ee6dfd331162352 (diff) | |
download | llvm-2155f17d39f3969ef841c85ef1102a214ab22b30.zip llvm-2155f17d39f3969ef841c85ef1102a214ab22b30.tar.gz llvm-2155f17d39f3969ef841c85ef1102a214ab22b30.tar.bz2 |
[clang][bytecode] Optimize InitElem{,Pop} (#159084)
Try harder to avoid creating a new `Pointer` for the element.
Diffstat (limited to 'clang/lib/AST/ByteCode/Pointer.cpp')
-rw-r--r-- | clang/lib/AST/ByteCode/Pointer.cpp | 60 |
1 files changed, 34 insertions, 26 deletions
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp b/clang/lib/AST/ByteCode/Pointer.cpp index ef75b0d..81d4ce1 100644 --- a/clang/lib/AST/ByteCode/Pointer.cpp +++ b/clang/lib/AST/ByteCode/Pointer.cpp @@ -433,7 +433,8 @@ bool Pointer::isInitialized() const { if (!isBlockPointer()) return true; - if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) { + if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor) && + Offset == BS.Base) { const GlobalInlineDescriptor &GD = *reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData()); return GD.InitState == GlobalInitState::Initialized; @@ -461,7 +462,8 @@ bool Pointer::isElementInitialized(unsigned Index) const { if (isStatic() && BS.Base == 0) return true; - if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) { + if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor) && + Offset == BS.Base) { const GlobalInlineDescriptor &GD = *reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData()); return GD.InitState == GlobalInitState::Initialized; @@ -486,7 +488,8 @@ void Pointer::initialize() const { assert(BS.Pointee && "Cannot initialize null pointer"); - if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) { + if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor) && + Offset == BS.Base) { GlobalInlineDescriptor &GD = *reinterpret_cast<GlobalInlineDescriptor *>( asBlockPointer().Pointee->rawData()); GD.InitState = GlobalInitState::Initialized; @@ -496,35 +499,39 @@ void Pointer::initialize() const { const Descriptor *Desc = getFieldDesc(); assert(Desc); if (Desc->isPrimitiveArray()) { - // Primitive global arrays don't have an initmap. - if (isStatic() && BS.Base == 0) - return; + if (Desc->getNumElems() != 0) + initializeElement(getIndex()); + return; + } - // Nothing to do for these. - if (Desc->getNumElems() == 0) - return; + // Field has its bit in an inline descriptor. + assert(BS.Base != 0 && "Only composite fields can be initialised"); + getInlineDesc()->IsInitialized = true; +} - InitMapPtr &IM = getInitMap(); - if (!IM) - IM = - std::make_pair(false, std::make_shared<InitMap>(Desc->getNumElems())); +void Pointer::initializeElement(unsigned Index) const { + // Primitive global arrays don't have an initmap. + if (isStatic() && BS.Base == 0) + return; - assert(IM); + assert(Index < getFieldDesc()->getNumElems()); - // All initialized. - if (IM->first) - return; + InitMapPtr &IM = getInitMap(); + if (!IM) { + const Descriptor *Desc = getFieldDesc(); + IM = std::make_pair(false, std::make_shared<InitMap>(Desc->getNumElems())); + } - if (IM->second->initializeElement(getIndex())) { - IM->first = true; - IM->second.reset(); - } + assert(IM); + + // All initialized. + if (IM->first) return; - } - // Field has its bit in an inline descriptor. - assert(BS.Base != 0 && "Only composite fields can be initialised"); - getInlineDesc()->IsInitialized = true; + if (IM->second->initializeElement(Index)) { + IM->first = true; + IM->second.reset(); + } } void Pointer::initializeAllElements() const { @@ -547,7 +554,8 @@ bool Pointer::allElementsInitialized() const { if (isStatic() && BS.Base == 0) return true; - if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor)) { + if (isRoot() && BS.Base == sizeof(GlobalInlineDescriptor) && + Offset == BS.Base) { const GlobalInlineDescriptor &GD = *reinterpret_cast<const GlobalInlineDescriptor *>(block()->rawData()); return GD.InitState == GlobalInitState::Initialized; |