================ @@ -658,10 +693,38 @@ void CIRGenFunction::emitNullabilityCheck(LValue lhs, mlir::Value rhs, /// elements void CIRGenFunction::emitDestroy(Address addr, QualType type, Destroyer *destroyer) { - if (getContext().getAsArrayType(type)) - cgm.errorNYI("emitDestroy: array type"); + const ArrayType *arrayType = getContext().getAsArrayType(type); + if (!arrayType) + return destroyer(*this, addr, type); + + mlir::Value length = emitArrayLength(arrayType, type, addr); + + CharUnits elementAlign = addr.getAlignment().alignmentOfArrayElement( + getContext().getTypeSizeInChars(type)); + + // Normally we have to check whether the array is zero-length. + bool checkZeroLength = true; + + // But if the array length is constant, we can suppress that. + auto constantCount = dyn_cast<cir::ConstantOp>(length.getDefiningOp()); + if (constantCount) { + auto constIntAttr = mlir::dyn_cast<cir::IntAttr>(constantCount.getValue()); + // ...and if it's constant zero, we can just skip the entire thing. + if (constIntAttr && constIntAttr.getUInt() == 0) + return; + checkZeroLength = false; + } else { + cgm.errorNYI("emitDestroy: variable length array"); + return; + } + + mlir::Value begin = addr.getPointer(); + mlir::Value end; // This will be used for future non-constant counts. + emitArrayDestroy(begin, end, type, elementAlign, destroyer, checkZeroLength); - return destroyer(*this, addr, type); + // If the array destroy didn't use the length op, we can erase it. + if (constantCount.use_empty()) ---------------- mmha wrote:
I think we can simplify the control flow a little if you invert the condition up there. Something like: ```c++ if(!constantCount) { assert(!cir::MissingFeature::vlas()); cgm.errorNYI("emitDestroy: variable length array"); } auto constIntAttr = mlir::dyn_cast<cir::IntAttr>(constantCount.getValue()); // ...and if it's constant zero, we can just skip the entire thing. if (constIntAttr && constIntAttr.getUInt() == 0) return; checkZeroLength = false; mlir::Value begin = addr.getPointer(); mlir::Value end; // This will be used for future non-constant counts. emitArrayDestroy(begin, end, type, elementAlign, destroyer, checkZeroLength); if (constantCount.use_empty()) constantCount.erase(); ``` https://github.com/llvm/llvm-project/pull/150499 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits