[clang] [CIR] Emit trailing-zero array constants as a compact split (PR #205918)

Erich Keane via cfe-commits cfe-commits at lists.llvm.org
Mon Jun 29 06:22:45 PDT 2026


================
@@ -1163,6 +1163,27 @@ emitArrayConstant(CIRGenModule &cgm, mlir::Type desiredType,
 
   const unsigned trailingZeroes = arrayBound - nonzeroLength;
 
+  // If we have a significant block of trailing zeros and a common scalar
+  // (integer or floating-point) element type, prefer a single ConstArrayAttr
+  // of the desired array type with a `trailingZerosNum` hint instead of
+  // synthesizing a packed anonymous record around a `[N x t] zeroinitializer`
+  // tail. This keeps the array's type in agreement with what the enclosing
+  // record layout expects.  The element-type guard must stay in sync with the
+  // CIR-to-LLVM split predicate (shouldSplitTrailingZeros): pointer/bool arrays
+  // are not split there, so emitting the hint for them would just materialize
+  // the whole tail.  Those keep the anonymous-record path below.
+  if (trailingZeroes >= 8 && commonElementType &&
----------------
erichkeane wrote:

Don't change this/make this change at all.  We should be able to fix this independently (and I'd asked to do this only at the CIR level).

See https://github.com/llvm/llvm-project/pull/206137 which removes all of this anyway.

https://github.com/llvm/llvm-project/pull/205918


More information about the cfe-commits mailing list