)]}'
{
  "commit": "bf35249a7c752836741b1cab43a312f87916fcb0",
  "tree": "b845d1b0c592f526ec7fe37d7936840b5ac117bd",
  "parents": [
    "93380a9126e76b71fa208e62c31c7914084c0e37"
  ],
  "author": {
    "name": "Ian Lance Taylor",
    "email": "iant@golang.org",
    "time": "Wed Mar 10 19:38:21 2021 -0800"
  },
  "committer": {
    "name": "Ian Lance Taylor",
    "email": "iant@golang.org",
    "time": "Thu Mar 11 23:47:20 2021 +0000"
  },
  "message": "compiler: create temporaries for heap variables\n\nThe compiler generally doesn\u0027t create a temporary for an expression\nthat is a variable, because it\u0027s normally valid to simply reload the\nvalue from the variable.  However, if the variable is in the heap,\nthen loading the value is a pointer indirection.  The process of\ncreating GCC IR can cause the variable load and the pointer\nindirection to be split, such that the second evaluation only does the\npointer indirection.  If there are conditionals in between the two\nuses, this can cause the second use to load the pointer from an\nuninitialized register.\n\nAvoid this by introducing a new Expression method that returns whether\nit is safe to evaluate an expression multiple times, and use it\neverywhere.\n\nThe test case is https://golang.org/cl/300789.\n\nFixes golang/go#44383\n\nChange-Id: Ice2a18153457daa024ddbf0a9935f7863fe6818e\nReviewed-on: https://go-review.googlesource.com/c/gofrontend/+/300809\nTrust: Ian Lance Taylor \u003ciant@golang.org\u003e\nReviewed-by: Than McIntosh \u003cthanm@google.com\u003e\nReviewed-by: Cherry Zhang \u003ccherryyz@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "17b4cfd2c197343ffce51843206f3d586d5e998b",
      "old_mode": 33188,
      "old_path": "go/expressions.cc",
      "new_id": "101cbe7ac316688eeb572c286cf25e67afaa01f4",
      "new_mode": 33188,
      "new_path": "go/expressions.cc"
    },
    {
      "type": "modify",
      "old_id": "712f6870211088f4fd275a560a1776285fdc01b8",
      "old_mode": 33188,
      "old_path": "go/expressions.h",
      "new_id": "e3747cc65d767e73ea7981c7b4fc3d7bc3c435e0",
      "new_mode": 33188,
      "new_path": "go/expressions.h"
    },
    {
      "type": "modify",
      "old_id": "9d4150eff7ca600df7961a62a22555e8f1a00e40",
      "old_mode": 33188,
      "old_path": "go/gogo.cc",
      "new_id": "93b54fd8c118e722e897f5e94160592e14079f44",
      "new_mode": 33188,
      "new_path": "go/gogo.cc"
    },
    {
      "type": "modify",
      "old_id": "da0e0843a735eab5272a8b6155cdf6ece44eec84",
      "old_mode": 33188,
      "old_path": "go/statements.cc",
      "new_id": "7ad7339bda8711d3dee4edb04bc980c89ab26b47",
      "new_mode": 33188,
      "new_path": "go/statements.cc"
    },
    {
      "type": "modify",
      "old_id": "ac1f0a1eff999c7f6de9fe19e9b2fd33b82f9aff",
      "old_mode": 33188,
      "old_path": "go/wb.cc",
      "new_id": "104c5db0b9bc6d3152ed9ef610b3e85c2106733c",
      "new_mode": 33188,
      "new_path": "go/wb.cc"
    }
  ]
}
