[PATCH] D13618: [Extension] Optimizing const member objects.
Richard Smith via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 2 17:18:27 PST 2015
rsmith added a subscriber: rsmith.
================
Comment at: lib/CodeGen/CGDecl.cpp:933
@@ +932,3 @@
+ ASTContext &Ctx = getContext();
+ auto &OffsetsInfo = InvariantOffsets.FindAndConstruct(Record).second;
+ OffsetsType &Args = OffsetsInfo.Offsets;
----------------
Instead of tracking a separate `Computed` flag, use `InvariantOffsets.count(Record)` here, and insert the value below.
================
Comment at: lib/CodeGen/CGDecl.cpp:943-959
@@ -950,2 +942,19 @@
+
+ // Trace through fields collecting offsets of writeonce candidates.
+ for (const auto *Field : Record->fields()) {
+ assert(dyn_cast<FieldDecl>(Field) && "Field decls only.");
+ QualType FieldType = Field->getType();
+ if (FieldType.isWriteOnce(Ctx)) {
+ CharUnits WidthChars = Ctx.getTypeSizeInChars(FieldType);
+ uint64_t Width = WidthChars.getQuantity();
+ Args.push_back(llvm::ConstantInt::get(Int64Ty, Width)); // Size
+
+ uint64_t Offset = Ctx.getFieldOffset(Field);
+ Args.push_back(llvm::ConstantInt::get(Int64Ty, Offset)); // Offset
+ } else if (const CXXRecordDecl *RecField =
+ Ctx.getBaseElementType(FieldType)->getAsCXXRecordDecl()) {
+ auto &FieldArgs = ComputeInvariantOffsets(RecField);
+ Args.insert(Args.end(), FieldArgs.begin(), FieldArgs.end());
}
}
+
----------------
It'd be good to also handle the case of a `const` field of class type that contains a `mutable` member -- in that case, all members other than the `mutable` member can be marked as invariant.
================
Comment at: lib/CodeGen/CGDecl.cpp:956-957
@@ -950,1 +955,4 @@
+ Ctx.getBaseElementType(FieldType)->getAsCXXRecordDecl()) {
+ auto &FieldArgs = ComputeInvariantOffsets(RecField);
+ Args.insert(Args.end(), FieldArgs.begin(), FieldArgs.end());
}
----------------
The recursive call to `ComputeInvariatOffsets` here invalidates your `Args` reference (`DenseMap` insertions invalidate all iterators and references to map elements).
http://reviews.llvm.org/D13618
More information about the cfe-commits
mailing list