)]}'
{
  "commit": "691a130e0f14459d9358a71ffd52a01295e6200a",
  "tree": "6ba9746b4d5e8fde1a4b0edac2700f98fdbcb93f",
  "parents": [
    "7a186da65b3754509bff2d7bafcc28a095279320"
  ],
  "author": {
    "name": "Alexis Engelke",
    "email": "engelke@in.tum.de",
    "time": "Thu Apr 09 22:31:15 2026 +0200"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Thu Apr 09 20:31:15 2026 +0000"
  },
  "message": "[ADT] Refactor post order traversal (#191047)\n\nCurrently, po_iterator holds the traversal state. This makes copying\nand moving po_iterator fairly expensive and the code cannot be optimized\naway in several cases (most of it isn\u0027t even inlined in a default\nbuild).\n\nTherefore, refactor post-order traversal to hold the state in a wrapper\nclass with cheap iterators. Additionally, replace po_storage base class\nwith a CRTP implementation where users can provide their own storage.\n\nBenefits:\n\n- Performance in stage2-O3 improves by 0.19% instructions:u and even\n  more substantially in cycles/wall-time.\n\n- Users that use a custom storage/iteration limitation can do so in a\n  more clean way by subclassing PostIteratorTraversalBase. See e.g.\n  LoopBlocksTraversal.\n\n- For graphs with block numbers, reserving can now be implemented\n  reasonably easy (not done yet).\n\nImplications:\n\n- PostOrderTraversal::iterator is no longer a forward iterator. This\n  property was never really used, though.\n\n- PostOrderTraversal must be live while iterators are live. For typical\n  uses (for (X x : post_order(...))), this is no problem, but could end\n  up being problematic if the iterator is wrapped (e.g.\n  for (X x : make_filter_range(post_order(...), ...)) -- problematic,\n  because make_filter_range doesn\u0027t preserve the range but only the two\n  iterators, which become invalid as the for loop is entered). This is a\n  limitation of the way LLVM implements ranges.",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "c4998bb2285f7c1ac630e8068f4b78f6f2a2943f",
      "old_mode": 33188,
      "old_path": "clang/include/clang/Analysis/Analyses/PostOrderCFGView.h",
      "new_id": "f4a4e5237995aadb8616a18256ce9ef455c2a81b",
      "new_mode": 33188,
      "new_path": "clang/include/clang/Analysis/Analyses/PostOrderCFGView.h"
    },
    {
      "type": "modify",
      "old_id": "0c09c0f97ff68e3f1835ec1334661f34b77a2fd1",
      "old_mode": 33188,
      "old_path": "clang/lib/Analysis/PostOrderCFGView.cpp",
      "new_id": "324d64c25e0907c9fce328480125830fb889a4f9",
      "new_mode": 33188,
      "new_path": "clang/lib/Analysis/PostOrderCFGView.cpp"
    },
    {
      "type": "modify",
      "old_id": "1dfd259e58897de05bbf9be9de2400a73d86a2e9",
      "old_mode": 33188,
      "old_path": "llvm/include/llvm/ADT/PostOrderIterator.h",
      "new_id": "963706bb300b40f8d6123d742c95e595dd30af22",
      "new_mode": 33188,
      "new_path": "llvm/include/llvm/ADT/PostOrderIterator.h"
    },
    {
      "type": "modify",
      "old_id": "1ac8e68bfa2f1b1a03c1c209f7ad9f9df07e26f6",
      "old_mode": 33188,
      "old_path": "llvm/include/llvm/Analysis/LoopIterator.h",
      "new_id": "6d25b2fd8923ca6951f10a7ea591bfaaa82db8cc",
      "new_mode": 33188,
      "new_path": "llvm/include/llvm/Analysis/LoopIterator.h"
    },
    {
      "type": "modify",
      "old_id": "8e08a70e69cdd26cadcaf2f8be6d6c190e7a9362",
      "old_mode": 33188,
      "old_path": "llvm/lib/Analysis/LoopInfo.cpp",
      "new_id": "b459b12d47e8e182665b65399194d6fc565fb141",
      "new_mode": 33188,
      "new_path": "llvm/lib/Analysis/LoopInfo.cpp"
    },
    {
      "type": "modify",
      "old_id": "81dd68a519e76dca68303f50700a17a29daaec16",
      "old_mode": 33188,
      "old_path": "llvm/lib/CodeGen/MachineTraceMetrics.cpp",
      "new_id": "a477fa23406e36b2480e8a0ab012c292b847f736",
      "new_mode": 33188,
      "new_path": "llvm/lib/CodeGen/MachineTraceMetrics.cpp"
    },
    {
      "type": "modify",
      "old_id": "d541ead5ac22cb75b306ae56698ae53fd4329dd5",
      "old_mode": 33188,
      "old_path": "llvm/lib/Target/SPIRV/SPIRVUtils.h",
      "new_id": "f47c5ed9ba5f383f6b71eca5d1fe6bdef2286a0f",
      "new_mode": 33188,
      "new_path": "llvm/lib/Target/SPIRV/SPIRVUtils.h"
    },
    {
      "type": "modify",
      "old_id": "963d84675693abfceec85c5e27fcedf684678757",
      "old_mode": 33188,
      "old_path": "llvm/lib/Transforms/Vectorize/VPlanCFG.h",
      "new_id": "58e43a9d818096680b87afcd65cb0ffecc122758",
      "new_mode": 33188,
      "new_path": "llvm/lib/Transforms/Vectorize/VPlanCFG.h"
    },
    {
      "type": "modify",
      "old_id": "098d9975beabb29a698c6f9277797d2101f10a73",
      "old_mode": 33188,
      "old_path": "llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp",
      "new_id": "094eab7ca92469c8fa9de56495f1d707deb52ed4",
      "new_mode": 33188,
      "new_path": "llvm/lib/Transforms/Vectorize/VPlanTransforms.cpp"
    },
    {
      "type": "modify",
      "old_id": "5fdd5ea4204e0a25bc09d2814a110861af78edcb",
      "old_mode": 33188,
      "old_path": "llvm/lib/Transforms/Vectorize/VPlanUtils.h",
      "new_id": "2cab5967b42f7a9010c012553f20cabdac9a69ee",
      "new_mode": 33188,
      "new_path": "llvm/lib/Transforms/Vectorize/VPlanUtils.h"
    },
    {
      "type": "modify",
      "old_id": "11da6925bb1fb4155da11372692b0c761ff49854",
      "old_mode": 33188,
      "old_path": "llvm/unittests/ADT/PostOrderIteratorTest.cpp",
      "new_id": "f7f33809865c11ed7747f4660dbae88edef321bb",
      "new_mode": 33188,
      "new_path": "llvm/unittests/ADT/PostOrderIteratorTest.cpp"
    },
    {
      "type": "modify",
      "old_id": "017aa6dab705e41a20725d36f938ce2638f972fc",
      "old_mode": 33188,
      "old_path": "llvm/unittests/Transforms/Vectorize/VPlanTest.cpp",
      "new_id": "b378b746182583dd89bc58de9c43da967a3d8013",
      "new_mode": 33188,
      "new_path": "llvm/unittests/Transforms/Vectorize/VPlanTest.cpp"
    },
    {
      "type": "modify",
      "old_id": "dcb738c5494389efc25e3948a0cdaa9458b059d8",
      "old_mode": 33188,
      "old_path": "mlir/include/mlir/IR/Iterators.h",
      "new_id": "12e74d1770a438225a57b6256bedb110ed8a8886",
      "new_mode": 33188,
      "new_path": "mlir/include/mlir/IR/Iterators.h"
    }
  ]
}
