)]}'
{
  "commit": "7ee3a40e652b3649d175758f72d7af98b9450a68",
  "tree": "a5de315ace53c50cf8ec1dbca8f3b89839472636",
  "parents": [
    "a57d091747bbb2fe480db516384afeb84835d1de"
  ],
  "author": {
    "name": "Romaric Jodin",
    "email": "rjodin@chromium.org",
    "time": "Tue Sep 15 13:09:56 2026"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Sep 15 13:09:56 2026"
  },
  "message": "Add -hack-atomic-flag-barrier option (#1652)\n\nUnder the SPIR-V and Vulkan memory model specifications, OpAtomic*\ninstructions with acquire/release semantics already establish\nhappens-before ordering for regular memory accesses across threads.\nHowever, some drivers (e.g. under the GLSL450 memory model) fail to\nproperly enforce this ordering for atomic_flag operations without\nexplicit memory barriers.\n\nTo work around such driver issues, add a new compiler option\n-hack-atomic-flag-barrier:\n- In replaceAtomicFlagClear: emit an OpMemoryBarrier with Release\n  semantics immediately prior to OpAtomicStore when release ordering\n  is requested (memory_order_release, memory_order_seq_cst, or default).\n- In replaceAtomicFlagTestAndSet:\n  - Emit an OpMemoryBarrier with Release semantics immediately prior\n    to OpAtomicExchange when release ordering is requested\n    (memory_order_release, memory_order_acq_rel, memory_order_seq_cst,\n    or default).\n  - Emit an OpMemoryBarrier with Acquire semantics immediately after\n    OpAtomicExchange when acquire ordering is requested\n    (memory_order_acquire, memory_order_acq_rel, memory_order_seq_cst,\n    or default).\n- Do not emit OpMemoryBarrier when memory_order_relaxed is specified,\n  as Vulkan SPIR-V forbids OpMemoryBarrier with semantics 0 (None).",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "4a486a2e4655b56442032dac46af68b6cabc2822",
      "old_mode": 33188,
      "old_path": "include/clspv/Option.h",
      "new_id": "6bda2ba060f2e1beb461d7a0e403fa0ba04695d4",
      "new_mode": 33188,
      "new_path": "include/clspv/Option.h"
    },
    {
      "type": "modify",
      "old_id": "eeb604335fd87823c8fa1d0dd9f43a50d6c64f25",
      "old_mode": 33188,
      "old_path": "lib/Option.cpp",
      "new_id": "3b3f947317ff660d956e27360a88e5ec02e13ecf",
      "new_mode": 33188,
      "new_path": "lib/Option.cpp"
    },
    {
      "type": "modify",
      "old_id": "3c4549c5ac5374cd6a5f08816e084732d88591ce",
      "old_mode": 33188,
      "old_path": "lib/ReplaceOpenCLBuiltinPass.cpp",
      "new_id": "2902cc3c9f3c81e26a3bf164d3c124cf565ba893",
      "new_mode": 33188,
      "new_path": "lib/ReplaceOpenCLBuiltinPass.cpp"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "c6fc6b431b722f1a62aece6dcc47e7e5bb8f8c05",
      "new_mode": 33188,
      "new_path": "test/AtomicBuiltins/atomic_flag_hack_atomic_flag_barrier.cl"
    }
  ]
}
