)]}'
{
  "commit": "3fe6a5fe0cc31a8a565356298bcd32fd95903abc",
  "tree": "b18cf0e4cc92f414311a81f1be3a2b7ef11846a8",
  "parents": [
    "d3d84f5b9587afa0313a53c3f98c649eeda29821"
  ],
  "author": {
    "name": "Alon Zakai",
    "email": "azakai@google.com",
    "time": "Fri Aug 21 15:21:29 2026"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Fri Aug 21 15:21:29 2026"
  },
  "message": "ConstraintAnalysis: Use spans to prove things (#9025)\n\nWhen two constraints can be expressed as spans, see if one shows the\nother is true or not.\n\nLanding this requires improving something else, otherwise tests would\nregress: we \"got lucky\" before and did not notice that `x \u003e\u003d 0` was\nalways true when unsigned, so we carried that around, and after `x++`\nit turned into `x \u003e\u003d 1` which is no longer trivial. We do need that latter\nconstraint, so add the following rule: when `x++` and `x` does not\noverflow during that addition (as proven by some bound like `x \u003c 10`)\nthen we can add `x \u003e 0` (since it can no longer be 0 due to the `x++`).",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "a1516280deb549d1eaea3920d2a3b5ac20d2c941",
      "old_mode": 33188,
      "old_path": "src/ir/constraint.cpp",
      "new_id": "44009e02ec3f02473c46c705ba78b3a264af0e5c",
      "new_mode": 33188,
      "new_path": "src/ir/constraint.cpp"
    },
    {
      "type": "modify",
      "old_id": "c7814effea560f134cbd3f0d8a40c2d4e59b0799",
      "old_mode": 33188,
      "old_path": "src/ir/constraint.h",
      "new_id": "85280dcbd1e1b267af041d7b553562637f363e5f",
      "new_mode": 33188,
      "new_path": "src/ir/constraint.h"
    },
    {
      "type": "modify",
      "old_id": "36a52220125cdb376076c6b3dbbec13f2d1374fb",
      "old_mode": 33188,
      "old_path": "test/gtest/constraint.cpp",
      "new_id": "47039f1ac0bd21704d2b1ad1cfd0262be5e499e0",
      "new_mode": 33188,
      "new_path": "test/gtest/constraint.cpp"
    }
  ]
}
