{"action":"created","comment":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/72650143","id":72650143,"diff_hunk":"@@ -0,0 +1,571 @@\n+// Copyright (c) 2016 Google Inc.\n+//\n+// Permission is hereby granted, free of charge, to any person obtaining a\n+// copy of this software and/or associated documentation files (the\n+// \"Materials\"), to deal in the Materials without restriction, including\n+// without limitation the rights to use, copy, modify, merge, publish,\n+// distribute, sublicense, and/or sell copies of the Materials, and to\n+// permit persons to whom the Materials are furnished to do so, subject to\n+// the following conditions:\n+//\n+// The above copyright notice and this permission notice shall be included\n+// in all copies or substantial portions of the Materials.\n+//\n+// MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS\n+// KHRONOS STANDARDS. THE UNMODIFIED, NORMATIVE VERSIONS OF KHRONOS\n+// SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT\n+//    https://www.khronos.org/registry/\n+//\n+// THE MATERIALS ARE PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n+// MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n+\n+#include <gtest/gtest.h>\n+\n+#include \"opt/def_use_manager.h\"\n+#include \"opt/libspirv.hpp\"\n+#include \"pass_utils.h\"\n+\n+namespace {\n+\n+using namespace spvtools;\n+using spvtools::opt::analysis::DefUseManager;\n+\n+// Disassembles the given |inst| and returns the disassembly.\n+std::string DisassembleInst(ir::Instruction* inst) {\n+  SpvTools tools(SPV_ENV_UNIVERSAL_1_1);\n+\n+  std::vector<uint32_t> binary;\n+  // We need this to generate the necessary header in the binary.\n+  tools.Assemble(\"\", &binary);\n+  inst->ToBinary(&binary, /* skip_nop = */ false);\n+\n+  std::string text;\n+  tools.Disassemble(binary, &text);\n+  while (text.back() == '\\n') text.pop_back();\n+  return text;\n+}\n+\n+// A struct for holding expected id defs and uses.\n+struct InstDefUse {\n+  using IdInstPair = std::pair<uint32_t, const char*>;\n+  using IdInstsPair = std::pair<uint32_t, std::vector<const char*>>;\n+\n+  // Ids and their corresponding def instructions.\n+  std::vector<IdInstPair> defs;\n+  // Ids and their corresponding use instructions.\n+  std::vector<IdInstsPair> uses;\n+};\n+\n+// Checks that the |actual_defs| and |actual_uses| are in accord with\n+// |expected_defs_uses|.\n+void CheckDefUse(const InstDefUse& expected_defs_uses,\n+                 const DefUseManager::IdToDefMap& actual_defs,\n+                 const DefUseManager::IdToUseMap& actual_uses) {\n+  // Check defs.\n+  EXPECT_EQ(expected_defs_uses.defs.size(), actual_defs.size());\n+  for (uint32_t i = 0; i < expected_defs_uses.defs.size(); ++i) {\n+    const auto id = expected_defs_uses.defs[i].first;\n+    const auto expected_def = expected_defs_uses.defs[i].second;\n+    ASSERT_EQ(1u, actual_defs.count(id));\n+    EXPECT_EQ(expected_def, DisassembleInst(actual_defs.at(id)));\n+  }\n+\n+  // Check uses.\n+  EXPECT_EQ(expected_defs_uses.uses.size(), actual_uses.size());\n+  for (uint32_t i = 0; i < expected_defs_uses.uses.size(); ++i) {\n+    const auto id = expected_defs_uses.uses[i].first;\n+    const auto& expected_uses = expected_defs_uses.uses[i].second;\n+\n+    ASSERT_EQ(1u, actual_uses.count(id));\n+    const auto& uses = actual_uses.at(id);\n+\n+    EXPECT_EQ(expected_uses.size(), uses.size());\n+    auto it = uses.cbegin();\n+    for (const auto expected_use : expected_uses) {\n+      EXPECT_EQ(expected_use, DisassembleInst(it->first));\n+      ++it;\n+    }\n+  }\n+}\n+\n+struct ParseDefUseCase {\n+  const char* text;\n+  InstDefUse du;\n+};\n+\n+using ParseDefUseTest = ::testing::TestWithParam<ParseDefUseCase>;\n+\n+TEST_P(ParseDefUseTest, Case) {\n+  const auto& tc = GetParam();\n+\n+  // Build module.\n+  const std::vector<const char*> text = {tc.text};\n+  std::unique_ptr<ir::Module> module =\n+      SpvTools(SPV_ENV_UNIVERSAL_1_1).BuildModule(JoinAllInsts(text));\n+  ASSERT_NE(nullptr, module);\n+\n+  // Analyze def and use.\n+  opt::analysis::DefUseManager manager;\n+  manager.AnalyzeDefUse(module.get());\n+\n+  CheckDefUse(tc.du, manager.id_to_defs(), manager.id_to_uses());\n+}\n+\n+// clang-format off\n+INSTANTIATE_TEST_CASE_P(\n+    TestCase, ParseDefUseTest,\n+    ::testing::ValuesIn(std::vector<ParseDefUseCase>{\n+        {\"\", {{}, {}}},                              // no instruction\n+        {\"OpMemoryModel Logical GLSL450\", {{}, {}}}, // no def and use\n+        { // single def, no use\n+          \"%1 = OpString \\\"wow\\\"\",\n+          {\n+            {{1, \"%1 = OpString \\\"wow\\\"\"}},\n+            {}\n+          }\n+        },\n+        { // multiple def, no use\n+          \"%1 = OpString \\\"hello\\\" \"\n+          \"%2 = OpString \\\"world\\\" \"\n+          \"%3 = OpTypeVoid\",\n+          {\n+            {\n+              {1, \"%1 = OpString \\\"hello\\\"\"},\n+              {2, \"%2 = OpString \\\"world\\\"\"},\n+              {3, \"%3 = OpTypeVoid\"},\n+            },\n+            {}\n+          }\n+        },\n+        { // single use, no def\n+          \"OpTypeForwardPointer %1 Input\",\n+          {\n+            {},\n+            {\n+              {1, {\"OpTypeForwardPointer %1 Input\"}},\n+            }\n+          }\n+        },\n+        { // multiple use, no def\n+          \"OpEntryPoint Fragment %1 \\\"main\\\" \"\n+          \"OpTypeForwardPointer %2 Input \"\n+          \"OpTypeForwardPointer %3 Output\",\n+          {\n+            {},\n+            {\n+              {1, {\"OpEntryPoint Fragment %1 \\\"main\\\"\"}},\n+              {2, {\"OpTypeForwardPointer %2 Input\"}},\n+              {3, {\"OpTypeForwardPointer %3 Output\"}},\n+            }\n+          }\n+        },\n+        { // multiple def, multiple use\n+          \"%1 = OpTypeBool \"\n+          \"%2 = OpTypeVector %1 3 \"\n+          \"%3 = OpTypeMatrix %2 3\",\n+          {\n+            {\n+              {1, \"%1 = OpTypeBool\"},\n+              {2, \"%2 = OpTypeVector %1 3\"},\n+              {3, \"%3 = OpTypeMatrix %2 3\"},\n+            },\n+            {\n+              {1, {\"%2 = OpTypeVector %1 3\"}},\n+              {2, {\"%3 = OpTypeMatrix %2 3\"}},\n+            }\n+          }\n+        },\n+        { // multiple use of the same id\n+          \"%1 = OpTypeBool \"\n+          \"%2 = OpTypeVector %1 2 \"\n+          \"%3 = OpTypeVector %1 3 \"\n+          \"%4 = OpTypeVector %1 4\",\n+          {\n+            {\n+              {1, \"%1 = OpTypeBool\"},\n+              {2, \"%2 = OpTypeVector %1 2\"},\n+              {3, \"%3 = OpTypeVector %1 3\"},\n+              {4, \"%4 = OpTypeVector %1 4\"},\n+            },\n+            {\n+              {1,\n+                {\n+                  \"%2 = OpTypeVector %1 2\",\n+                  \"%3 = OpTypeVector %1 3\",\n+                  \"%4 = OpTypeVector %1 4\",\n+                }\n+              },\n+            }\n+          }\n+        },\n+        { // labels\n+          \"%2 = OpFunction %1 None %3 \"\n+\n+          \"%4 = OpLabel \"\n+          \"OpBranchConditional %5 %6 %7 \"\n+\n+          \"%6 = OpLabel \"\n+          \"OpBranch %7 \"\n+\n+          \"%7 = OpLabel \"\n+          \"OpReturn \"\n+\n+          \"OpFunctionEnd\",\n+          {\n+            {\n+              {2, \"%2 = OpFunction %1 None %3\"},\n+              {4, \"%4 = OpLabel\"},\n+              {6, \"%6 = OpLabel\"},\n+              {7, \"%7 = OpLabel\"},\n+            },\n+            {\n+              {1, {\"%2 = OpFunction %1 None %3\"}},\n+              {3, {\"%2 = OpFunction %1 None %3\"}},\n+              {5, {\"OpBranchConditional %5 %6 %7\"}},\n+              {6, {\"OpBranchConditional %5 %6 %7\"}},\n+              {7,\n+                {\n+                  \"OpBranchConditional %5 %6 %7\",\n+                  \"OpBranch %7\",\n+                }\n+              },\n+            }\n+          }\n+        },\n+        { // cross function\n+          \"%1 = OpTypeBool \"\n+\n+          \"%2 = OpFunction %1 None %3 \"\n+\n+          \"%4 = OpLabel \"\n+          \"%5 = OpVariable %1 Function \"\n+          \"%6 = OpFunctionCall %1 %2 %5 \"\n+          \"OpReturnValue %6 \"\n+\n+          \"OpFunctionEnd\",\n+          {\n+            {\n+              {1, \"%1 = OpTypeBool\"},\n+              {2, \"%2 = OpFunction %1 None %3\"},\n+              {4, \"%4 = OpLabel\"},\n+              {5, \"%5 = OpVariable %1 Function\"},\n+              {6, \"%6 = OpFunctionCall %1 %2 %5\"},\n+            },\n+            {\n+              {1,\n+                {\n+                  \"%2 = OpFunction %1 None %3\",\n+                  \"%5 = OpVariable %1 Function\",\n+                  \"%6 = OpFunctionCall %1 %2 %5\",\n+                }\n+              },\n+              {2, {\"%6 = OpFunctionCall %1 %2 %5\"}},\n+              {5, {\"%6 = OpFunctionCall %1 %2 %5\"}},\n+              {3, {\"%2 = OpFunction %1 None %3\"}},\n+              {6, {\"OpReturnValue %6\"}},\n+            }\n+          }\n+        },\n+        { // selection merge and loop merge\n+          \"%2 = OpFunction %1 None %3 \"\n+\n+          \"%4 = OpLabel \"\n+          \"OpLoopMerge %5 %4 None \"\n+          \"OpBranch %6 \"\n+\n+          \"%5 = OpLabel \"\n+          \"OpReturn \"\n+\n+          \"%6 = OpLabel \"\n+          \"OpSelectionMerge %7 None \"\n+          \"OpBranchConditional %8 %9 %7 \"\n+\n+          \"%7 = OpLabel \"\n+          \"OpReturn \"\n+\n+          \"%9 = OpLabel \"\n+          \"OpReturn \"\n+\n+          \"OpFunctionEnd\",\n+          {\n+            {\n+              {2, \"%2 = OpFunction %1 None %3\"},\n+              {4, \"%4 = OpLabel\"},\n+              {5, \"%5 = OpLabel\"},\n+              {6, \"%6 = OpLabel\"},\n+              {7, \"%7 = OpLabel\"},\n+              {9, \"%9 = OpLabel\"},\n+            },\n+            {\n+              {1, {\"%2 = OpFunction %1 None %3\"}},\n+              {3, {\"%2 = OpFunction %1 None %3\"}},\n+              {4, {\"OpLoopMerge %5 %4 None\"}},\n+              {5, {\"OpLoopMerge %5 %4 None\"}},\n+              {6, {\"OpBranch %6\"}},\n+              {7,\n+                {\n+                  \"OpSelectionMerge %7 None\",\n+                  \"OpBranchConditional %8 %9 %7\",\n+                }\n+              },\n+              {8, {\"OpBranchConditional %8 %9 %7\"}},\n+              {9, {\"OpBranchConditional %8 %9 %7\"}},\n+            }\n+          }","path":"test/opt/test_def_use.cpp","position":321,"original_position":319,"commit_id":"853ec6a0449760a7f6e14f918c255239f500142b","original_commit_id":"b9e34d38ae332955992aa65b1ec93dddef2e4df3","user":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"body":"Done.","created_at":"2016-07-28T15:57:59Z","updated_at":"2016-07-28T15:57:59Z","html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282#discussion_r72650143","pull_request_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282","_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/72650143"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282#discussion_r72650143"},"pull_request":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282"}}},"pull_request":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282","id":79102611,"html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282","diff_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282.diff","patch_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282.patch","issue_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/282","number":282,"state":"open","locked":false,"title":"Optimization: Add def use analysis","user":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-07-27T21:39:23Z","updated_at":"2016-07-28T15:57:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9e09c5b44a4cc440c455c52a39e92516b52c2c0a","assignee":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"assignees":[{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false}],"milestone":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/milestones/1","html_url":"https://github.com/KhronosGroup/SPIRV-Tools/milestones/SPIR-V%20optimization","labels_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/milestones/1/labels","id":1908267,"number":1,"title":"SPIR-V optimization","description":"","creator":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"open_issues":4,"closed_issues":4,"state":"open","created_at":"2016-07-27T22:04:04Z","updated_at":"2016-07-27T22:07:13Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282/commits","review_comments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282/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/282/comments","statuses_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/853ec6a0449760a7f6e14f918c255239f500142b","head":{"label":"antiagainst:defuse","ref":"defuse","sha":"853ec6a0449760a7f6e14f918c255239f500142b","user":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"repo":{"id":46284705,"name":"SPIRV-Tools","full_name":"antiagainst/SPIRV-Tools","owner":{"login":"antiagainst","id":487928,"avatar_url":"https://avatars.githubusercontent.com/u/487928?v=3","gravatar_id":"","url":"https://api.github.com/users/antiagainst","html_url":"https://github.com/antiagainst","followers_url":"https://api.github.com/users/antiagainst/followers","following_url":"https://api.github.com/users/antiagainst/following{/other_user}","gists_url":"https://api.github.com/users/antiagainst/gists{/gist_id}","starred_url":"https://api.github.com/users/antiagainst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/antiagainst/subscriptions","organizations_url":"https://api.github.com/users/antiagainst/orgs","repos_url":"https://api.github.com/users/antiagainst/repos","events_url":"https://api.github.com/users/antiagainst/events{/privacy}","received_events_url":"https://api.github.com/users/antiagainst/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/antiagainst/SPIRV-Tools","description":"","fork":true,"url":"https://api.github.com/repos/antiagainst/SPIRV-Tools","forks_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/forks","keys_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/teams","hooks_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/hooks","issue_events_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/issues/events{/number}","events_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/events","assignees_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/assignees{/user}","branches_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/branches{/branch}","tags_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/tags","blobs_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/statuses/{sha}","languages_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/languages","stargazers_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/stargazers","contributors_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/contributors","subscribers_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/subscribers","subscription_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/subscription","commits_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/contents/{+path}","compare_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/merges","archive_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/downloads","issues_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/issues{/number}","pulls_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/pulls{/number}","milestones_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/milestones{/number}","notifications_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/labels{/name}","releases_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/releases{/id}","deployments_url":"https://api.github.com/repos/antiagainst/SPIRV-Tools/deployments","created_at":"2015-11-16T15:47:34Z","updated_at":"2016-01-26T23:12:38Z","pushed_at":"2016-07-28T15:57:47Z","git_url":"git://github.com/antiagainst/SPIRV-Tools.git","ssh_url":"git@github.com:antiagainst/SPIRV-Tools.git","clone_url":"https://github.com/antiagainst/SPIRV-Tools.git","svn_url":"https://github.com/antiagainst/SPIRV-Tools","homepage":null,"size":1966,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"KhronosGroup:master","ref":"master","sha":"d503d75cc3f1c9d81e7a7bf97a33a1b5b8e8863f","user":{"login":"KhronosGroup","id":1608701,"avatar_url":"https://avatars.githubusercontent.com/u/1608701?v=3","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://avatars.githubusercontent.com/u/1608701?v=3","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":"","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":"2016-07-26T07:18:53Z","pushed_at":"2016-07-28T15:57:47Z","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":2449,"stargazers_count":130,"watchers_count":130,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":31,"mirror_url":null,"open_issues_count":22,"forks":31,"open_issues":22,"watchers":130,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/282"},"issue":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/282"},"comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/282/comments"},"review_comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/282/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/282/commits"},"statuses":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/853ec6a0449760a7f6e14f918c255239f500142b"}}}}
{"actor":{"display_login":"antiagainst"}}