{"action":"created","comment":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/184808042","pull_request_review_id":116084848,"id":184808042,"diff_hunk":"@@ -0,0 +1,509 @@\n+// Copyright (c) 2018 Google LLC.\n+//\n+// Licensed under the Apache License, Version 2.0 (the \"License\");\n+// you may not use this file except in compliance with the License.\n+// You may obtain a copy of the License at\n+//\n+//     http://www.apache.org/licenses/LICENSE-2.0\n+//\n+// Unless required by applicable law or agreed to in writing, software\n+// distributed under the License is distributed on an \"AS IS\" BASIS,\n+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+// See the License for the specific language governing permissions and\n+// limitations under the License.\n+\n+#include \"opt/loop_fission.h\"\n+#include \"opt/register_pressure.h\"\n+\n+// Implement loop fission with an optional parameter to split only\n+// if the register pressure in a given loop meets a certain criteria. This is\n+// controlled via the constructors of LoopFissionPass.\n+//\n+// 1 - Build a list of loops to be split, these are top level loops (loops\n+// without child loops themselves) which meet the register pressure criteria, as\n+// determined by the ShouldSplitLoop method of LoopFissionPass.\n+//\n+// 2 - For each loop in the list, group each instruction into a set of related\n+// instructions by traversing each instructions users and operands recursively.\n+// We stop if we encounter an instruction we have seen before or an instruction\n+// which we don't consider relevent (i.e OpLoopMerge). We then group these\n+// groups into two different sets, one for the first loop and one for the\n+// second.\n+//\n+// 3 - We then run CanPerformSplit to check that it would be legal to split a\n+// loop using those two sets. We check that we haven't altered the relative\n+// order load/stores appear in the binary and that we aren't breaking any\n+// dependency between load/stores by splitting them into two loops. We also\n+// check that none of the OpBranch instructions are dependent on a load as we\n+// leave control flow structure intact and move only instructions in the body so\n+// we want to avoid any loads with side affects or aliasing.\n+//\n+// 4 - We then split the loop by calling SplitLoop. This function clones the\n+// loop and attaches it to the preheader and connects the new loops merge block\n+// to the current loop header block. We then use the two sets built in step 2 to\n+// remove instructions from each loop. If an instruction appears in the first\n+// set it is removed from the second loop and vice versa.\n+//\n+// 5 - If the multiple split passes flag is set we check if each of the loops\n+// still meet the register pressure criteria. If they do then we add them to the\n+// list of loops to be split (created in step one) to allow for loops to be\n+// split multiple times.\n+//\n+\n+namespace spvtools {\n+namespace opt {\n+\n+class LoopFissionImpl {\n+ public:\n+  LoopFissionImpl(ir::IRContext* context, ir::Loop* loop)\n+      : context_(context), loop_(loop), load_used_in_condition_(false) {}\n+\n+  // Group each instruction in the loop into sets of instructions related by\n+  // their usedef chains. An instruction which uses another will appear in the\n+  // same set. Then merge those sets into just two sets. Returns false if there\n+  // was one or less sets created.\n+  bool GroupInstructionsByUseDef();\n+\n+  // Check if the sets built by GroupInstructionsByUseDef violate any data\n+  // dependence rules.\n+  bool CanPerformSplit();\n+\n+  // Split the loop and return a pointer to the new loop.\n+  ir::Loop* SplitLoop();\n+\n+  // Checks if |inst| is safe to move. We can only move instructions which don't\n+  // have any side effects and OpLoads and OpStores.\n+  bool MovableInstruction(const ir::Instruction& inst) const;\n+\n+ private:\n+  // Traverse the def use chain of |inst| and add the users and uses of |inst|\n+  // which are in the same loop to the |returned_set|.\n+  void TraverseUseDef(ir::Instruction* inst,\n+                      std::set<ir::Instruction*>* returned_set,\n+                      bool ignore_phi_users = false, bool report_loads = false);\n+\n+  // We group the instructions in the block into two different groups, the\n+  // instructions to be kept in the original loop and the ones to be cloned into\n+  // the new loop. As the cloned loop is attached to the preheader it will be\n+  // the first loop and the second loop will be the original.\n+  std::set<ir::Instruction*> first_loop_instructions_;\n+  std::set<ir::Instruction*> second_loop_instructions_;\n+\n+  // We need a set of all the instructions to be seen so we can break any\n+  // recursion and also so we can ignore certain instructions by preemptively\n+  // adding them to this set.\n+  std::set<ir::Instruction*> seen_instructions_;\n+\n+  // A map of instructions to their relative position in the function.\n+  std::map<ir::Instruction*, size_t> instruction_order_;\n+\n+  ir::IRContext* context_;\n+\n+  ir::Loop* loop_;\n+\n+  // This is set to true by TraverseUseDef when traversing the instructions\n+  // related to the loop condition and any if conditions should any of those\n+  // instructions be a load.\n+  bool load_used_in_condition_;\n+};\n+\n+bool LoopFissionImpl::MovableInstruction(const ir::Instruction& inst) const {\n+  return inst.opcode() == SpvOp::SpvOpLoad ||\n+         inst.opcode() == SpvOp::SpvOpStore ||\n+         inst.opcode() == SpvOp::SpvOpSelectionMerge ||\n+         inst.opcode() == SpvOp::SpvOpPhi || inst.IsOpcodeCodeMotionSafe();","path":"source/opt/loop_fission.cpp","position":114,"original_position":114,"commit_id":"6ffc9cf59bf86acb81c38e73115b3cf1bba53fcc","original_commit_id":"070797aac92f6e397becdc61d89d4e87fa6fb7e6","user":{"login":"davors72","id":3385116,"avatar_url":"https://avatars0.githubusercontent.com/u/3385116?v=4","gravatar_id":"","url":"https://api.github.com/users/davors72","html_url":"https://github.com/davors72","followers_url":"https://api.github.com/users/davors72/followers","following_url":"https://api.github.com/users/davors72/following{/other_user}","gists_url":"https://api.github.com/users/davors72/gists{/gist_id}","starred_url":"https://api.github.com/users/davors72/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davors72/subscriptions","organizations_url":"https://api.github.com/users/davors72/orgs","repos_url":"https://api.github.com/users/davors72/repos","events_url":"https://api.github.com/users/davors72/events{/privacy}","received_events_url":"https://api.github.com/users/davors72/received_events","type":"User","site_admin":false},"body":"This function is just to white list instructions which don't have side effects, we do the data dependence checks after. The IsOpcodeCodeMotionSafe provides a list of instructions which that pass considered to be safe to move so I reused it and added the above exceptions for the instructions not included as the list was mostly the same","created_at":"2018-04-27T21:11:39Z","updated_at":"2018-04-27T21:11:39Z","html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519#discussion_r184808042","pull_request_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/184808042"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519#discussion_r184808042"},"pull_request":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519"}},"in_reply_to_id":184758414},"pull_request":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519","id":183545444,"html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519","diff_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519.diff","patch_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519.patch","issue_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/1519","number":1519,"state":"open","locked":false,"title":"Support for loop fission.","user":{"login":"davors72","id":3385116,"avatar_url":"https://avatars0.githubusercontent.com/u/3385116?v=4","gravatar_id":"","url":"https://api.github.com/users/davors72","html_url":"https://github.com/davors72","followers_url":"https://api.github.com/users/davors72/followers","following_url":"https://api.github.com/users/davors72/following{/other_user}","gists_url":"https://api.github.com/users/davors72/gists{/gist_id}","starred_url":"https://api.github.com/users/davors72/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davors72/subscriptions","organizations_url":"https://api.github.com/users/davors72/orgs","repos_url":"https://api.github.com/users/davors72/repos","events_url":"https://api.github.com/users/davors72/events{/privacy}","received_events_url":"https://api.github.com/users/davors72/received_events","type":"User","site_admin":false},"body":"Pass to split loops when the loop exceeds a certain register pressure threshold. Threshold can be provided by the user as an integer value for total number of registers or a custom functor. Loops will check if they would violate any data dependency rules by splitting and will leave control flow intact for dead code elimination to remove afterwards.  ","created_at":"2018-04-23T20:17:28Z","updated_at":"2018-04-27T21:11:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9fb6ae66290fc8e097890171ac45ad49bdc661b6","assignee":null,"assignees":[],"requested_reviewers":[{"login":"s-perron","id":31666470,"avatar_url":"https://avatars1.githubusercontent.com/u/31666470?v=4","gravatar_id":"","url":"https://api.github.com/users/s-perron","html_url":"https://github.com/s-perron","followers_url":"https://api.github.com/users/s-perron/followers","following_url":"https://api.github.com/users/s-perron/following{/other_user}","gists_url":"https://api.github.com/users/s-perron/gists{/gist_id}","starred_url":"https://api.github.com/users/s-perron/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/s-perron/subscriptions","organizations_url":"https://api.github.com/users/s-perron/orgs","repos_url":"https://api.github.com/users/s-perron/repos","events_url":"https://api.github.com/users/s-perron/events{/privacy}","received_events_url":"https://api.github.com/users/s-perron/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519/commits","review_comments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519/comments","review_comment_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments{/number}","comments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/1519/comments","statuses_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/6ffc9cf59bf86acb81c38e73115b3cf1bba53fcc","head":{"label":"codeplaysoftware:loop_fission_release","ref":"loop_fission_release","sha":"6ffc9cf59bf86acb81c38e73115b3cf1bba53fcc","user":{"login":"codeplaysoftware","id":7440916,"avatar_url":"https://avatars0.githubusercontent.com/u/7440916?v=4","gravatar_id":"","url":"https://api.github.com/users/codeplaysoftware","html_url":"https://github.com/codeplaysoftware","followers_url":"https://api.github.com/users/codeplaysoftware/followers","following_url":"https://api.github.com/users/codeplaysoftware/following{/other_user}","gists_url":"https://api.github.com/users/codeplaysoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/codeplaysoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codeplaysoftware/subscriptions","organizations_url":"https://api.github.com/users/codeplaysoftware/orgs","repos_url":"https://api.github.com/users/codeplaysoftware/repos","events_url":"https://api.github.com/users/codeplaysoftware/events{/privacy}","received_events_url":"https://api.github.com/users/codeplaysoftware/received_events","type":"Organization","site_admin":false},"repo":{"id":110717765,"name":"SPIRV-Tools","full_name":"codeplaysoftware/SPIRV-Tools","owner":{"login":"codeplaysoftware","id":7440916,"avatar_url":"https://avatars0.githubusercontent.com/u/7440916?v=4","gravatar_id":"","url":"https://api.github.com/users/codeplaysoftware","html_url":"https://github.com/codeplaysoftware","followers_url":"https://api.github.com/users/codeplaysoftware/followers","following_url":"https://api.github.com/users/codeplaysoftware/following{/other_user}","gists_url":"https://api.github.com/users/codeplaysoftware/gists{/gist_id}","starred_url":"https://api.github.com/users/codeplaysoftware/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codeplaysoftware/subscriptions","organizations_url":"https://api.github.com/users/codeplaysoftware/orgs","repos_url":"https://api.github.com/users/codeplaysoftware/repos","events_url":"https://api.github.com/users/codeplaysoftware/events{/privacy}","received_events_url":"https://api.github.com/users/codeplaysoftware/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/codeplaysoftware/SPIRV-Tools","description":null,"fork":true,"url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools","forks_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/forks","keys_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/teams","hooks_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/hooks","issue_events_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/issues/events{/number}","events_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/events","assignees_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/assignees{/user}","branches_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/branches{/branch}","tags_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/tags","blobs_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/statuses/{sha}","languages_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/languages","stargazers_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/stargazers","contributors_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/contributors","subscribers_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/subscribers","subscription_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/subscription","commits_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/contents/{+path}","compare_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/merges","archive_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/downloads","issues_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/issues{/number}","pulls_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/pulls{/number}","milestones_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/milestones{/number}","notifications_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/labels{/name}","releases_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/releases{/id}","deployments_url":"https://api.github.com/repos/codeplaysoftware/SPIRV-Tools/deployments","created_at":"2017-11-14T16:45:53Z","updated_at":"2018-03-30T08:07:40Z","pushed_at":"2018-04-27T21:05:53Z","git_url":"git://github.com/codeplaysoftware/SPIRV-Tools.git","ssh_url":"git@github.com:codeplaysoftware/SPIRV-Tools.git","clone_url":"https://github.com/codeplaysoftware/SPIRV-Tools.git","svn_url":"https://github.com/codeplaysoftware/SPIRV-Tools","homepage":null,"size":8582,"stargazers_count":2,"watchers_count":2,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":2,"default_branch":"testing_master"}},"base":{"label":"KhronosGroup:master","ref":"master","sha":"2c0ce872103d676bf8de5dc87a03ad2c32e215a2","user":{"login":"KhronosGroup","id":1608701,"avatar_url":"https://avatars3.githubusercontent.com/u/1608701?v=4","gravatar_id":"","url":"https://api.github.com/users/KhronosGroup","html_url":"https://github.com/KhronosGroup","followers_url":"https://api.github.com/users/KhronosGroup/followers","following_url":"https://api.github.com/users/KhronosGroup/following{/other_user}","gists_url":"https://api.github.com/users/KhronosGroup/gists{/gist_id}","starred_url":"https://api.github.com/users/KhronosGroup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KhronosGroup/subscriptions","organizations_url":"https://api.github.com/users/KhronosGroup/orgs","repos_url":"https://api.github.com/users/KhronosGroup/repos","events_url":"https://api.github.com/users/KhronosGroup/events{/privacy}","received_events_url":"https://api.github.com/users/KhronosGroup/received_events","type":"Organization","site_admin":false},"repo":{"id":45981801,"name":"SPIRV-Tools","full_name":"KhronosGroup/SPIRV-Tools","owner":{"login":"KhronosGroup","id":1608701,"avatar_url":"https://avatars3.githubusercontent.com/u/1608701?v=4","gravatar_id":"","url":"https://api.github.com/users/KhronosGroup","html_url":"https://github.com/KhronosGroup","followers_url":"https://api.github.com/users/KhronosGroup/followers","following_url":"https://api.github.com/users/KhronosGroup/following{/other_user}","gists_url":"https://api.github.com/users/KhronosGroup/gists{/gist_id}","starred_url":"https://api.github.com/users/KhronosGroup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/KhronosGroup/subscriptions","organizations_url":"https://api.github.com/users/KhronosGroup/orgs","repos_url":"https://api.github.com/users/KhronosGroup/repos","events_url":"https://api.github.com/users/KhronosGroup/events{/privacy}","received_events_url":"https://api.github.com/users/KhronosGroup/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/KhronosGroup/SPIRV-Tools","description":null,"fork":false,"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools","forks_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/forks","keys_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/teams","hooks_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/hooks","issue_events_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/events{/number}","events_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/events","assignees_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/assignees{/user}","branches_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/branches{/branch}","tags_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/tags","blobs_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/{sha}","languages_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/languages","stargazers_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/stargazers","contributors_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/contributors","subscribers_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/subscribers","subscription_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/subscription","commits_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/contents/{+path}","compare_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/merges","archive_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/downloads","issues_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues{/number}","pulls_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls{/number}","milestones_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/milestones{/number}","notifications_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/labels{/name}","releases_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/releases{/id}","deployments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/deployments","created_at":"2015-11-11T12:56:25Z","updated_at":"2018-04-27T17:25:15Z","pushed_at":"2018-04-27T21:05:54Z","git_url":"git://github.com/KhronosGroup/SPIRV-Tools.git","ssh_url":"git@github.com:KhronosGroup/SPIRV-Tools.git","clone_url":"https://github.com/KhronosGroup/SPIRV-Tools.git","svn_url":"https://github.com/KhronosGroup/SPIRV-Tools","homepage":null,"size":7348,"stargazers_count":287,"watchers_count":287,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":115,"mirror_url":null,"archived":false,"open_issues_count":185,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":115,"open_issues":185,"watchers":287,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/1519"},"issue":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/1519"},"comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/1519/comments"},"review_comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519/comments"},"review_comment":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/1519/commits"},"statuses":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/6ffc9cf59bf86acb81c38e73115b3cf1bba53fcc"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"davors72"}}