aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Pointer.cpp
diff options
context:
space:
mode:
authorTimm Baeder <tbaeder@redhat.com>2025-09-17 09:27:07 +0200
committerGitHub <noreply@github.com>2025-09-17 09:27:07 +0200
commit2155f17d39f3969ef841c85ef1102a214ab22b30 (patch)
tree137b4249d4455dbf5c10bff6349303137a384f66 /clang/lib/AST/ByteCode/Pointer.cpp
parent5829652a6def4031853104b43ee6dfd331162352 (diff)
downloadllvm-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.cpp60
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;