{"record":{"id":"73b8eaab7983f649","repo":"jax-ml/jax","slug":"empty-array","errorCode":null,"errorMessage":"Empty array","messagePattern":"Empty array","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/experimental/mosaic/gpu/utils.py","lineNumber":130,"sourceCode":"      desc, llvm.ConstantOp(i64, ir.IntegerAttr.get(i64, 0)).result, [2]\n  ).result\n  if rank > 0:\n    for i, s in enumerate(memref_ty.shape):\n      desc = llvm.InsertValueOp(\n          desc, llvm.ConstantOp(i64, ir.IntegerAttr.get(i64, s)).result, [3, i]\n      ).result\n    for i, s in enumerate(strides):\n      desc = llvm.InsertValueOp(\n          desc, llvm.ConstantOp(i64, ir.IntegerAttr.get(i64, s)).result, [4, i]\n      ).result\n  result = builtin.unrealized_conversion_cast([memref_ty], [desc])\n  assert isinstance(result, ir.Value)\n  return result\n\n\ndef pack_array(values):\n  if not values:\n    raise ValueError(\"Empty array\")\n  elem_ty = values[0].type\n  i64 = ir.IntegerType.get_signless(64)\n  ptr_ty = ir.Type.parse(\"!llvm.ptr\")\n  arr_ptr = llvm.alloca(ptr_ty, c(len(values), i64), elem_ty)\n  for i, v in enumerate(values):\n    elem_ptr = getelementptr(arr_ptr, [i], elem_ty)\n    llvm.store(v, elem_ptr)\n  return arr_ptr\n\n\ndef get_contiguous_strides(xs):\n  strides_ret = []\n  stride = 1\n  for x in xs[::-1]:\n    strides_ret.append(stride)\n    stride *= x\n  return strides_ret[::-1]\n","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/experimental/mosaic/gpu/utils.py#L112-L148","documentation":"Raised by pack_array, which packs a list of SSA values into a stack-allocated LLVM array (used e.g. to fill TMA descriptors). An empty list has no element type to allocate for, so it's rejected immediately rather than producing an ambiguous alloca.","triggerScenarios":"Calling utils.pack_array([]) — in practice via init_tma_desc with an empty tensor of box dimensions, e.g. a TMA descriptor for a 0-rank/empty tensor shape.","commonSituations":"Building TMA descriptors from dynamically-sized tensors that can be empty at trace time (e.g. 0-sized dimension), or computing box dims that degenerate to an empty list.","solutions":["Guard callers: skip pack_array/init_tma_desc when the values list is empty","Ensure tensor shapes fed into TMA descriptor creation are non-empty","Pass at least one value (e.g. a zero constant) if the API requires a placeholder"],"exampleFix":"# before\nvals = compute_dims(t)  # t has 0-sized dim -> []\npacked = utils.pack_array(vals)\n# after\nif not vals:\n  return None  # or raise a clearer upstream error\npacked = utils.pack_array(vals)","handlingStrategy":"validation","validationCode":"if not values:\n    raise ValueError('cannot build TMA descriptor from empty dimensions')\npacked = utils.pack_array(values)","typeGuard":"def is_packable(values):\n    return len(values) > 0","tryCatchPattern":null,"preventionTips":["Validate tensor shapes are non-empty before init_tma_desc","Skip TMA descriptor creation for degenerate/empty tensors"],"tags":["gpu","mosaic","tma","empty-array","argument-validation"],"backgroundTag":"empty-argument-validation","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}