{"action":"created","comment":{"url":"https://api.github.com/repos/oracle/graal/pulls/comments/212958502","pull_request_review_id":149660005,"id":212958502,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxMjk1ODUwMg==","diff_hunk":"@@ -98,4 +120,41 @@ public LocationIdentity getLocationIdentity() {\n     public void lower(LoweringTool tool) {\n         tool.getLowerer().lower(this, tool);\n     }\n+\n+    @Override\n+    public void virtualize(VirtualizerTool tool) {\n+        ValueNode alias = tool.getAlias(object);\n+        if (Options.VirtualCAS.getValue(tool.getOptions()) &&\n+                        alias instanceof VirtualInstanceNode &&\n+                        offset.isConstant()) {\n+\n+            VirtualInstanceNode obj = (VirtualInstanceNode) alias;\n+\n+            int index = resolveFieldIndex(obj);\n+\n+            if (index >= 0) {\n+\n+                ValueNode read = tool.getEntry(obj, index);\n+\n+                LogicNode equalsNode = CompareNode.createCompareNode(EQ, expected, read, tool.getConstantReflectionProvider(), NodeView.DEFAULT);\n+\n+                FixedGuardNode guardNode = new FixedGuardNode(equalsNode, DeoptimizationReason.Aliasing, DeoptimizationAction.InvalidateRecompile);","path":"compiler/src/org.graalvm.compiler.nodes/src/org/graalvm/compiler/nodes/java/UnsafeCompareAndSwapNode.java","position":75,"original_position":75,"commit_id":"77d0b9d196c9c7e33bb453e780f8d4c64d93e556","original_commit_id":"77d0b9d196c9c7e33bb453e780f8d4c64d93e556","user":{"login":"gilles-duboscq","id":341830,"node_id":"MDQ6VXNlcjM0MTgzMA==","avatar_url":"https://avatars3.githubusercontent.com/u/341830?v=4","gravatar_id":"","url":"https://api.github.com/users/gilles-duboscq","html_url":"https://github.com/gilles-duboscq","followers_url":"https://api.github.com/users/gilles-duboscq/followers","following_url":"https://api.github.com/users/gilles-duboscq/following{/other_user}","gists_url":"https://api.github.com/users/gilles-duboscq/gists{/gist_id}","starred_url":"https://api.github.com/users/gilles-duboscq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilles-duboscq/subscriptions","organizations_url":"https://api.github.com/users/gilles-duboscq/orgs","repos_url":"https://api.github.com/users/gilles-duboscq/repos","events_url":"https://api.github.com/users/gilles-duboscq/events{/privacy}","received_events_url":"https://api.github.com/users/gilles-duboscq/received_events","type":"User","site_admin":false},"body":"A deopt without any alternative is a bit dangerous performance-wise: it might lead to deopt-loops. In particular here the \"action\" is `InvalidateRecompile` which is quite costly considering that the recompilation will lead to exactly the same code.\r\n\r\nWhat about just using `ConditionalNodes`?\r\n```java\r\nConditionalNode fieldValue = ConditionalNode.create(equalsNode, newValue, read);\r\nConditionalNode result = ConditionalNode.create(equalsNode);\r\n//...\r\ntool.setVirtualEntry(obj, index, fieldValue);\r\n//...\r\ntool.replaceWith(result);\r\n```\r\nIn the \"simple\" cases it will immediately fold away and in more complex cases where equality can't be statically proven, performance should still be OK.","created_at":"2018-08-27T12:36:23Z","updated_at":"2018-08-27T12:47:31Z","html_url":"https://github.com/oracle/graal/pull/636#discussion_r212958502","pull_request_url":"https://api.github.com/repos/oracle/graal/pulls/636","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/oracle/graal/pulls/comments/212958502"},"html":{"href":"https://github.com/oracle/graal/pull/636#discussion_r212958502"},"pull_request":{"href":"https://api.github.com/repos/oracle/graal/pulls/636"}}},"pull_request":{"url":"https://api.github.com/repos/oracle/graal/pulls/636","id":210860714,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEwODYwNzE0","html_url":"https://github.com/oracle/graal/pull/636","diff_url":"https://github.com/oracle/graal/pull/636.diff","patch_url":"https://github.com/oracle/graal/pull/636.patch","issue_url":"https://api.github.com/repos/oracle/graal/issues/636","number":636,"state":"open","locked":false,"title":"[wip] virtualize unsafe compare and swap calls","user":{"login":"fwbrasil","id":831175,"node_id":"MDQ6VXNlcjgzMTE3NQ==","avatar_url":"https://avatars0.githubusercontent.com/u/831175?v=4","gravatar_id":"","url":"https://api.github.com/users/fwbrasil","html_url":"https://github.com/fwbrasil","followers_url":"https://api.github.com/users/fwbrasil/followers","following_url":"https://api.github.com/users/fwbrasil/following{/other_user}","gists_url":"https://api.github.com/users/fwbrasil/gists{/gist_id}","starred_url":"https://api.github.com/users/fwbrasil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fwbrasil/subscriptions","organizations_url":"https://api.github.com/users/fwbrasil/orgs","repos_url":"https://api.github.com/users/fwbrasil/repos","events_url":"https://api.github.com/users/fwbrasil/events{/privacy}","received_events_url":"https://api.github.com/users/fwbrasil/received_events","type":"User","site_admin":false},"body":"# Work in progress\r\n\r\nI'm creating this PR in case you'd be interested in giving early feedback. The optimization works but there are some open questions and it's missing unit tests. I've tested it with a large Scala microservice here at Twitter and results are good since the `Future` implementation is based on CAS operations.\r\n\r\n## Problem\r\n\r\nCompare and swap calls using `Unsafe` are currently always lowered to an atomic operation. That's unnecessary when the CAS mutates a field of an instance that is virtual. It introduces some performance overhead and prevents other optimizations.\r\n\r\nLet's take this JMH benchmark class as an example:\r\n\r\n```java\r\npublic class VirtualCASBench {\r\n\r\n  public static final long valueOffset = UnsafeUtil.fieldOffset(TestClass.class, \"value\");\r\n\r\n  private static class TestClass {\r\n    public volatile int value;\r\n\r\n    public TestClass(int value) {\r\n      this.value = value;\r\n    }\r\n  }\r\n\r\n  @Benchmark\r\n  public boolean testUnsafe() {\r\n    TestClass t = new TestClass(0);\r\n    return UnsafeUtil.unsafe.compareAndSwapInt(t, valueOffset, 0, 1);\r\n  }\r\n\r\n  @Benchmark\r\n  public boolean testIfElse() {\r\n    TestClass t = new TestClass(0);\r\n    synchronized (t) {\r\n      if (t.value != 0)\r\n        return false;\r\n      else {\r\n        t.value = 1;\r\n        return true;\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\nThe if/else version has much better performance than the version using the unsafe compare and swap:\r\n\r\n![image](https://user-images.githubusercontent.com/831175/44609860-4d6df500-a7ae-11e8-9d56-87e2458e4fa0.png)\r\n\r\nIt is optimized before lowering to a graph that returns a constant:\r\n\r\n![image](https://user-images.githubusercontent.com/831175/44609869-65457900-a7ae-11e8-934d-8cbdf1050f47.png)\r\n\r\nThat's expected since the instance doesn't escape and constant folding can determine that the CAS will always return true. The same doesn't happen with the unsafe version since the compare and swap node is opaque to constant folding:\r\n\r\n![image](https://user-images.githubusercontent.com/831175/44609904-87d79200-a7ae-11e8-9450-6f17b61144c5.png)\r\n\r\n## Solution\r\n\r\nWhen an object is virtualized, compare and swap can be replaced by a guard and the new value can be set using the `VirtualizerTool`. I've implemented an initial version of such optimization and the benchmark results are promising:\r\n\r\n![image](https://user-images.githubusercontent.com/831175/44609913-945bea80-a7ae-11e8-9e7f-ba129c1abbd8.png)\r\n\r\nWith the CAS virtualization, the unsafe compare and swap benchmark is also optimized to a constant:\r\n\r\n![image](https://user-images.githubusercontent.com/831175/44609921-a3db3380-a7ae-11e8-991e-a4519dce5a34.png)\r\n\r\n## Notes and questions\r\n\r\n1. I've used a guard that will trigger deoptimization in case the current value doesn't match the expected value. It assumes that users won't write code that will makes a CAS operation fail since the object doesn't escape and can't be used concurrently.\r\n\r\n2. I couldn't link the guard node to the predecessor using the `VirtualizerTool`, so I set it in `UnsafeCompareAndSwapNode.virtualize`. I'm not sure if that could be problematic since it seems that all effects should be done through the tool during virtualization.\r\n\r\n3. The optimization is applied only when the field can be resolved. If the user uses a dynamic or invalid offset, it won't be applied.\r\n\r\n4. I've added an option to enable the optimization. Should it be enabled by default?","created_at":"2018-08-24T22:12:57Z","updated_at":"2018-08-27T12:47:31Z","closed_at":null,"merged_at":null,"merge_commit_sha":"7a4b8596f87d93c2c7b582c9d17a112aa9ba3119","assignee":{"login":"gilles-duboscq","id":341830,"node_id":"MDQ6VXNlcjM0MTgzMA==","avatar_url":"https://avatars3.githubusercontent.com/u/341830?v=4","gravatar_id":"","url":"https://api.github.com/users/gilles-duboscq","html_url":"https://github.com/gilles-duboscq","followers_url":"https://api.github.com/users/gilles-duboscq/followers","following_url":"https://api.github.com/users/gilles-duboscq/following{/other_user}","gists_url":"https://api.github.com/users/gilles-duboscq/gists{/gist_id}","starred_url":"https://api.github.com/users/gilles-duboscq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilles-duboscq/subscriptions","organizations_url":"https://api.github.com/users/gilles-duboscq/orgs","repos_url":"https://api.github.com/users/gilles-duboscq/repos","events_url":"https://api.github.com/users/gilles-duboscq/events{/privacy}","received_events_url":"https://api.github.com/users/gilles-duboscq/received_events","type":"User","site_admin":false},"assignees":[{"login":"gilles-duboscq","id":341830,"node_id":"MDQ6VXNlcjM0MTgzMA==","avatar_url":"https://avatars3.githubusercontent.com/u/341830?v=4","gravatar_id":"","url":"https://api.github.com/users/gilles-duboscq","html_url":"https://github.com/gilles-duboscq","followers_url":"https://api.github.com/users/gilles-duboscq/followers","following_url":"https://api.github.com/users/gilles-duboscq/following{/other_user}","gists_url":"https://api.github.com/users/gilles-duboscq/gists{/gist_id}","starred_url":"https://api.github.com/users/gilles-duboscq/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gilles-duboscq/subscriptions","organizations_url":"https://api.github.com/users/gilles-duboscq/orgs","repos_url":"https://api.github.com/users/gilles-duboscq/repos","events_url":"https://api.github.com/users/gilles-duboscq/events{/privacy}","received_events_url":"https://api.github.com/users/gilles-duboscq/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":319809836,"node_id":"MDU6TGFiZWwzMTk4MDk4MzY=","url":"https://api.github.com/repos/oracle/graal/labels/oca-signed","name":"oca-signed","color":"bfe5bf","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/oracle/graal/pulls/636/commits","review_comments_url":"https://api.github.com/repos/oracle/graal/pulls/636/comments","review_comment_url":"https://api.github.com/repos/oracle/graal/pulls/comments{/number}","comments_url":"https://api.github.com/repos/oracle/graal/issues/636/comments","statuses_url":"https://api.github.com/repos/oracle/graal/statuses/77d0b9d196c9c7e33bb453e780f8d4c64d93e556","head":{"label":"fwbrasil:cas-elimination","ref":"cas-elimination","sha":"77d0b9d196c9c7e33bb453e780f8d4c64d93e556","user":{"login":"fwbrasil","id":831175,"node_id":"MDQ6VXNlcjgzMTE3NQ==","avatar_url":"https://avatars0.githubusercontent.com/u/831175?v=4","gravatar_id":"","url":"https://api.github.com/users/fwbrasil","html_url":"https://github.com/fwbrasil","followers_url":"https://api.github.com/users/fwbrasil/followers","following_url":"https://api.github.com/users/fwbrasil/following{/other_user}","gists_url":"https://api.github.com/users/fwbrasil/gists{/gist_id}","starred_url":"https://api.github.com/users/fwbrasil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fwbrasil/subscriptions","organizations_url":"https://api.github.com/users/fwbrasil/orgs","repos_url":"https://api.github.com/users/fwbrasil/repos","events_url":"https://api.github.com/users/fwbrasil/events{/privacy}","received_events_url":"https://api.github.com/users/fwbrasil/received_events","type":"User","site_admin":false},"repo":{"id":131645956,"node_id":"MDEwOlJlcG9zaXRvcnkxMzE2NDU5NTY=","name":"graal","full_name":"fwbrasil/graal","owner":{"login":"fwbrasil","id":831175,"node_id":"MDQ6VXNlcjgzMTE3NQ==","avatar_url":"https://avatars0.githubusercontent.com/u/831175?v=4","gravatar_id":"","url":"https://api.github.com/users/fwbrasil","html_url":"https://github.com/fwbrasil","followers_url":"https://api.github.com/users/fwbrasil/followers","following_url":"https://api.github.com/users/fwbrasil/following{/other_user}","gists_url":"https://api.github.com/users/fwbrasil/gists{/gist_id}","starred_url":"https://api.github.com/users/fwbrasil/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fwbrasil/subscriptions","organizations_url":"https://api.github.com/users/fwbrasil/orgs","repos_url":"https://api.github.com/users/fwbrasil/repos","events_url":"https://api.github.com/users/fwbrasil/events{/privacy}","received_events_url":"https://api.github.com/users/fwbrasil/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fwbrasil/graal","description":"GraalVM: Run Programs Faster Anywhere :rocket:","fork":true,"url":"https://api.github.com/repos/fwbrasil/graal","forks_url":"https://api.github.com/repos/fwbrasil/graal/forks","keys_url":"https://api.github.com/repos/fwbrasil/graal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fwbrasil/graal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fwbrasil/graal/teams","hooks_url":"https://api.github.com/repos/fwbrasil/graal/hooks","issue_events_url":"https://api.github.com/repos/fwbrasil/graal/issues/events{/number}","events_url":"https://api.github.com/repos/fwbrasil/graal/events","assignees_url":"https://api.github.com/repos/fwbrasil/graal/assignees{/user}","branches_url":"https://api.github.com/repos/fwbrasil/graal/branches{/branch}","tags_url":"https://api.github.com/repos/fwbrasil/graal/tags","blobs_url":"https://api.github.com/repos/fwbrasil/graal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fwbrasil/graal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fwbrasil/graal/git/refs{/sha}","trees_url":"https://api.github.com/repos/fwbrasil/graal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fwbrasil/graal/statuses/{sha}","languages_url":"https://api.github.com/repos/fwbrasil/graal/languages","stargazers_url":"https://api.github.com/repos/fwbrasil/graal/stargazers","contributors_url":"https://api.github.com/repos/fwbrasil/graal/contributors","subscribers_url":"https://api.github.com/repos/fwbrasil/graal/subscribers","subscription_url":"https://api.github.com/repos/fwbrasil/graal/subscription","commits_url":"https://api.github.com/repos/fwbrasil/graal/commits{/sha}","git_commits_url":"https://api.github.com/repos/fwbrasil/graal/git/commits{/sha}","comments_url":"https://api.github.com/repos/fwbrasil/graal/comments{/number}","issue_comment_url":"https://api.github.com/repos/fwbrasil/graal/issues/comments{/number}","contents_url":"https://api.github.com/repos/fwbrasil/graal/contents/{+path}","compare_url":"https://api.github.com/repos/fwbrasil/graal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fwbrasil/graal/merges","archive_url":"https://api.github.com/repos/fwbrasil/graal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fwbrasil/graal/downloads","issues_url":"https://api.github.com/repos/fwbrasil/graal/issues{/number}","pulls_url":"https://api.github.com/repos/fwbrasil/graal/pulls{/number}","milestones_url":"https://api.github.com/repos/fwbrasil/graal/milestones{/number}","notifications_url":"https://api.github.com/repos/fwbrasil/graal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fwbrasil/graal/labels{/name}","releases_url":"https://api.github.com/repos/fwbrasil/graal/releases{/id}","deployments_url":"https://api.github.com/repos/fwbrasil/graal/deployments","created_at":"2018-04-30T20:58:51Z","updated_at":"2018-08-25T01:37:37Z","pushed_at":"2018-08-25T01:37:33Z","git_url":"git://github.com/fwbrasil/graal.git","ssh_url":"git@github.com:fwbrasil/graal.git","clone_url":"https://github.com/fwbrasil/graal.git","svn_url":"https://github.com/fwbrasil/graal","homepage":"https://www.graalvm.org","size":268317,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"oracle:master","ref":"master","sha":"9e2a5c512871727b89573da286169290c4373c69","user":{"login":"oracle","id":4430336,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ0MzAzMzY=","avatar_url":"https://avatars1.githubusercontent.com/u/4430336?v=4","gravatar_id":"","url":"https://api.github.com/users/oracle","html_url":"https://github.com/oracle","followers_url":"https://api.github.com/users/oracle/followers","following_url":"https://api.github.com/users/oracle/following{/other_user}","gists_url":"https://api.github.com/users/oracle/gists{/gist_id}","starred_url":"https://api.github.com/users/oracle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oracle/subscriptions","organizations_url":"https://api.github.com/users/oracle/orgs","repos_url":"https://api.github.com/users/oracle/repos","events_url":"https://api.github.com/users/oracle/events{/privacy}","received_events_url":"https://api.github.com/users/oracle/received_events","type":"Organization","site_admin":false},"repo":{"id":49662222,"node_id":"MDEwOlJlcG9zaXRvcnk0OTY2MjIyMg==","name":"graal","full_name":"oracle/graal","owner":{"login":"oracle","id":4430336,"node_id":"MDEyOk9yZ2FuaXphdGlvbjQ0MzAzMzY=","avatar_url":"https://avatars1.githubusercontent.com/u/4430336?v=4","gravatar_id":"","url":"https://api.github.com/users/oracle","html_url":"https://github.com/oracle","followers_url":"https://api.github.com/users/oracle/followers","following_url":"https://api.github.com/users/oracle/following{/other_user}","gists_url":"https://api.github.com/users/oracle/gists{/gist_id}","starred_url":"https://api.github.com/users/oracle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/oracle/subscriptions","organizations_url":"https://api.github.com/users/oracle/orgs","repos_url":"https://api.github.com/users/oracle/repos","events_url":"https://api.github.com/users/oracle/events{/privacy}","received_events_url":"https://api.github.com/users/oracle/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/oracle/graal","description":"GraalVM: Run Programs Faster Anywhere :rocket:","fork":false,"url":"https://api.github.com/repos/oracle/graal","forks_url":"https://api.github.com/repos/oracle/graal/forks","keys_url":"https://api.github.com/repos/oracle/graal/keys{/key_id}","collaborators_url":"https://api.github.com/repos/oracle/graal/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/oracle/graal/teams","hooks_url":"https://api.github.com/repos/oracle/graal/hooks","issue_events_url":"https://api.github.com/repos/oracle/graal/issues/events{/number}","events_url":"https://api.github.com/repos/oracle/graal/events","assignees_url":"https://api.github.com/repos/oracle/graal/assignees{/user}","branches_url":"https://api.github.com/repos/oracle/graal/branches{/branch}","tags_url":"https://api.github.com/repos/oracle/graal/tags","blobs_url":"https://api.github.com/repos/oracle/graal/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/oracle/graal/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/oracle/graal/git/refs{/sha}","trees_url":"https://api.github.com/repos/oracle/graal/git/trees{/sha}","statuses_url":"https://api.github.com/repos/oracle/graal/statuses/{sha}","languages_url":"https://api.github.com/repos/oracle/graal/languages","stargazers_url":"https://api.github.com/repos/oracle/graal/stargazers","contributors_url":"https://api.github.com/repos/oracle/graal/contributors","subscribers_url":"https://api.github.com/repos/oracle/graal/subscribers","subscription_url":"https://api.github.com/repos/oracle/graal/subscription","commits_url":"https://api.github.com/repos/oracle/graal/commits{/sha}","git_commits_url":"https://api.github.com/repos/oracle/graal/git/commits{/sha}","comments_url":"https://api.github.com/repos/oracle/graal/comments{/number}","issue_comment_url":"https://api.github.com/repos/oracle/graal/issues/comments{/number}","contents_url":"https://api.github.com/repos/oracle/graal/contents/{+path}","compare_url":"https://api.github.com/repos/oracle/graal/compare/{base}...{head}","merges_url":"https://api.github.com/repos/oracle/graal/merges","archive_url":"https://api.github.com/repos/oracle/graal/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/oracle/graal/downloads","issues_url":"https://api.github.com/repos/oracle/graal/issues{/number}","pulls_url":"https://api.github.com/repos/oracle/graal/pulls{/number}","milestones_url":"https://api.github.com/repos/oracle/graal/milestones{/number}","notifications_url":"https://api.github.com/repos/oracle/graal/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/oracle/graal/labels{/name}","releases_url":"https://api.github.com/repos/oracle/graal/releases{/id}","deployments_url":"https://api.github.com/repos/oracle/graal/deployments","created_at":"2016-01-14T17:11:35Z","updated_at":"2018-08-27T11:57:10Z","pushed_at":"2018-08-27T08:09:43Z","git_url":"git://github.com/oracle/graal.git","ssh_url":"git@github.com:oracle/graal.git","clone_url":"https://github.com/oracle/graal.git","svn_url":"https://github.com/oracle/graal","homepage":"https://www.graalvm.org","size":382942,"stargazers_count":6073,"watchers_count":6073,"language":"Java","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":346,"mirror_url":null,"archived":false,"open_issues_count":153,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":346,"open_issues":153,"watchers":6073,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/oracle/graal/pulls/636"},"html":{"href":"https://github.com/oracle/graal/pull/636"},"issue":{"href":"https://api.github.com/repos/oracle/graal/issues/636"},"comments":{"href":"https://api.github.com/repos/oracle/graal/issues/636/comments"},"review_comments":{"href":"https://api.github.com/repos/oracle/graal/pulls/636/comments"},"review_comment":{"href":"https://api.github.com/repos/oracle/graal/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/oracle/graal/pulls/636/commits"},"statuses":{"href":"https://api.github.com/repos/oracle/graal/statuses/77d0b9d196c9c7e33bb453e780f8d4c64d93e556"}},"author_association":"NONE"}}
{"actor":{"display_login":"gilles-duboscq"}}