[clang] [CIR] Add support for copy elision (PR #157713)
Andy Kaylor via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 9 10:50:22 PDT 2025
================
@@ -44,16 +46,37 @@ CIRGenFunction::emitAutoVarAlloca(const VarDecl &d,
if (ty->isVariablyModifiedType())
cgm.errorNYI(d.getSourceRange(), "emitAutoVarDecl: variably modified type");
+ assert(!cir::MissingFeatures::openMP());
+
Address address = Address::invalid();
if (!ty->isConstantSizeType())
cgm.errorNYI(d.getSourceRange(), "emitAutoVarDecl: non-constant size type");
// A normal fixed sized variable becomes an alloca in the entry block,
- mlir::Type allocaTy = convertTypeForMem(ty);
- // Create the temp alloca and declare variable using it.
- address = createTempAlloca(allocaTy, alignment, loc, d.getName(),
- /*arraySize=*/nullptr, /*alloca=*/nullptr, ip);
- declare(address.getPointer(), &d, ty, getLoc(d.getSourceRange()), alignment);
+ // unless:
+ // - it's an NRVO variable.
+ // - we are compiling OpenMP and it's an OpenMP local variable.
+ if (nrvo) {
+ // The named return value optimization: allocate this variable in the
+ // return slot, so that we can elide the copy when returning this
+ // variable (C++0x [class.copy]p34).
+ address = returnValue;
+
+ if (const auto *rd = ty->getAsRecordDecl()) {
----------------
andykaylor wrote:
I made the change anyway to avoid any potential confusion between `RecordDecl` and `CXXRecordDecl`.
https://github.com/llvm/llvm-project/pull/157713
More information about the cfe-commits
mailing list