{"record":{"id":"890fc80f77a9fb52","repo":"jax-ml/jax","slug":"found-multiple-swizzletransformattr","errorCode":null,"errorMessage":"Found multiple SwizzleTransformAttr","messagePattern":"Found multiple SwizzleTransformAttr","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"jax/experimental/mosaic/gpu/dialect_lowering.py","lineNumber":973,"sourceCode":"    _: LoweringContext, op: mgpu.VectorConcatOp\n) -> Sequence[ir.Value]:\n  in_layouts = inference_utils.in_layouts(op)\n  out_layout, = inference_utils.out_layouts(op)\n  operands_fa = [\n      _fragmented_array_from_ir(opr, l)\n      for opr, l in zip(op.operands, in_layouts, strict=True)\n  ]\n  out = fa.concatenate(operands_fa, axis=op.dimension.value)\n  assert out.layout == layouts_lib.from_layout_attr(out_layout)\n  return [fragmented_array_to_ir(out, op.result.type)]\n\n\ndef swizzle_from_transforms_attr(attr: ir.ArrayAttr) -> mgpu.SwizzlingMode:\n  swizzle = None\n  for transform in attr:\n    if isinstance(transform, mgpu.SwizzleTransformAttr):\n      if swizzle is not None:\n        raise ValueError(\"Found multiple SwizzleTransformAttr\")\n      swizzle = mgpu.SwizzlingMode(mgpu.SwizzleTransformAttr(transform).swizzle)\n  return swizzle or mgpu.SwizzlingMode.kNoSwizzle\n\n\ndef memref_transforms_from_transforms_attr(\n    attr: ir.ArrayAttr,\n) -> tuple[lc.MemRefTransform, ...]:\n  gmem_transforms: list[lc.MemRefTransform] = []\n  for transform in attr:\n    if isinstance(transform, mgpu.TileTransformAttr):\n      tile_transform = lc.TileTransform(tuple(transform.tiling))\n      gmem_transforms.append(tile_transform)\n    elif not isinstance(transform, mgpu.SwizzleTransformAttr):\n      raise NotImplementedError(f\"Unsupported transform: {transform}\")\n  return tuple(gmem_transforms)\n\n\ndef tile_offset(","sourceCodeStart":955,"sourceCodeEnd":991,"githubUrl":"https://github.com/jax-ml/jax/blob/1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb/jax/experimental/mosaic/gpu/dialect_lowering.py#L955-L991","documentation":"A memref's in/out_transforms attribute contained more than one SwizzleTransformAttr; Mosaic allows at most one swizzle transform per memory operation.","triggerScenarios":"Attaching two SwizzleTransformAttr entries to the same load/store's transforms array attribute.","commonSituations":"Manually building transforms arrays or double-appending swizzle when constructing mgpu ops programmatically.","solutions":["Ensure exactly zero or one SwizzleTransformAttr in the transforms array","Build the attribute via helper code that deduplicates swizzle entries"],"exampleFix":"// before\ntransforms = [swizzle_128b, swizzle_128b, tile(8, 128)]\n// after\ntransforms = [swizzle_128b, tile(8, 128)]","handlingStrategy":"validation","validationCode":"swizzles = [t for t in transforms if isinstance(t, mgpu.SwizzleTransformAttr)]\nassert len(swizzles) <= 1, 'at most one swizzle transform allowed'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Deduplicate swizzle entries when building transforms arrays programmatically"],"tags":["jax","mosaic","gpu","swizzle","transforms"],"backgroundTag":"invalid-attribute-configuration","analyzedSha":"1e1c6a8fc06dfcd1247076ec5cae4640cea5d7bb","analyzedAt":"2026-08-27T09:53:25.647Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}