[clang] [ConstantInitBuilder] Use ptradd for self references (PR #222272)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 9 02:05:45 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
Author: Nikita Popov (nikic)
<details>
<summary>Changes</summary>
Instead of producing a typed GEP, directly produce the canonical ptradd form with a byte offset. This makes the implementation slightly simpler.
---
Full diff: https://github.com/llvm/llvm-project/pull/222272.diff
2 Files Affected:
- (modified) clang/include/clang/CodeGen/ConstantInitBuilder.h (+3-11)
- (modified) clang/lib/CodeGen/ConstantInitBuilder.cpp (+5-29)
``````````diff
diff --git a/clang/include/clang/CodeGen/ConstantInitBuilder.h b/clang/include/clang/CodeGen/ConstantInitBuilder.h
index 28d4764b6d60b..4e624321cb313 100644
--- a/clang/include/clang/CodeGen/ConstantInitBuilder.h
+++ b/clang/include/clang/CodeGen/ConstantInitBuilder.h
@@ -54,9 +54,10 @@ class CodeGenModule;
class ConstantInitBuilderBase {
struct SelfReference {
llvm::GlobalVariable *Dummy;
- llvm::SmallVector<llvm::Constant*, 4> Indices;
+ CharUnits Offset;
- SelfReference(llvm::GlobalVariable *dummy) : Dummy(dummy) {}
+ SelfReference(llvm::GlobalVariable *Dummy, CharUnits Offset)
+ : Dummy(Dummy), Offset(Offset) {}
};
CodeGenModule &CGM;
llvm::SmallVector<llvm::Constant*, 16> Buffer;
@@ -320,20 +321,11 @@ class ConstantAggregateBuilderBase {
/// type can differ from the type of the actual element.
llvm::Constant *getAddrOfPosition(llvm::Type *type, size_t position);
- llvm::ArrayRef<llvm::Constant*> getGEPIndicesToCurrentPosition(
- llvm::SmallVectorImpl<llvm::Constant*> &indices) {
- getGEPIndicesTo(indices, Builder.Buffer.size());
- return indices;
- }
-
protected:
llvm::Constant *finishArray(llvm::Type *eltTy);
llvm::Constant *finishStruct(llvm::StructType *structTy);
private:
- void getGEPIndicesTo(llvm::SmallVectorImpl<llvm::Constant*> &indices,
- size_t position) const;
-
llvm::Constant *getRelativeOffset(llvm::IntegerType *offsetType,
llvm::Constant *target);
diff --git a/clang/lib/CodeGen/ConstantInitBuilder.cpp b/clang/lib/CodeGen/ConstantInitBuilder.cpp
index 7b3e7aea0f647..014bc78150f52 100644
--- a/clang/lib/CodeGen/ConstantInitBuilder.cpp
+++ b/clang/lib/CodeGen/ConstantInitBuilder.cpp
@@ -94,9 +94,8 @@ void ConstantInitBuilderBase::setGlobalInitializer(llvm::GlobalVariable *GV,
void ConstantInitBuilderBase::resolveSelfReferences(llvm::GlobalVariable *GV) {
for (auto &entry : SelfReferences) {
- llvm::Constant *resolvedReference =
- llvm::ConstantExpr::getInBoundsGetElementPtr(
- GV->getValueType(), GV, entry.Indices);
+ llvm::Constant *resolvedReference = llvm::ConstantExpr::getInBoundsPtrAdd(
+ GV, llvm::ConstantInt::get(CGM.SizeTy, entry.Offset.getQuantity()));
auto dummy = entry.Dummy;
dummy->replaceAllUsesWith(resolvedReference);
dummy->eraseFromParent();
@@ -158,9 +157,8 @@ ConstantAggregateBuilderBase::getAddrOfPosition(llvm::Type *type,
auto dummy = new llvm::GlobalVariable(Builder.CGM.getModule(), type, true,
llvm::GlobalVariable::PrivateLinkage,
nullptr, "");
- Builder.SelfReferences.emplace_back(dummy);
- auto &entry = Builder.SelfReferences.back();
- getGEPIndicesTo(entry.Indices, position + Begin);
+ Builder.SelfReferences.emplace_back(dummy,
+ getOffsetFromGlobalTo(position + Begin));
return dummy;
}
@@ -172,32 +170,10 @@ ConstantAggregateBuilderBase::getAddrOfCurrentPosition(llvm::Type *type) {
new llvm::GlobalVariable(Builder.CGM.getModule(), type, true,
llvm::GlobalVariable::PrivateLinkage,
nullptr, "");
- Builder.SelfReferences.emplace_back(dummy);
- auto &entry = Builder.SelfReferences.back();
- (void) getGEPIndicesToCurrentPosition(entry.Indices);
+ Builder.SelfReferences.emplace_back(dummy, getNextOffsetFromGlobal());
return dummy;
}
-void ConstantAggregateBuilderBase::getGEPIndicesTo(
- llvm::SmallVectorImpl<llvm::Constant*> &indices,
- size_t position) const {
- // Recurse on the parent builder if present.
- if (Parent) {
- Parent->getGEPIndicesTo(indices, Begin);
-
- // Otherwise, add an index to drill into the first level of pointer.
- } else {
- assert(indices.empty());
- indices.push_back(llvm::ConstantInt::get(Builder.CGM.Int32Ty, 0));
- }
-
- assert(position >= Begin);
- // We have to use i32 here because struct GEPs demand i32 indices.
- // It's rather unlikely to matter in practice.
- indices.push_back(llvm::ConstantInt::get(Builder.CGM.Int32Ty,
- position - Begin));
-}
-
ConstantAggregateBuilderBase::PlaceholderPosition
ConstantAggregateBuilderBase::addPlaceholderWithSize(llvm::Type *type) {
// Bring the offset up to the last field.
``````````
</details>
https://github.com/llvm/llvm-project/pull/222272
More information about the cfe-commits
mailing list