{"action":"created","comment":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/76118204","id":76118204,"diff_hunk":"@@ -0,0 +1,693 @@\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 \"passes.h\"\n+\n+#include <initializer_list>\n+#include <memory>\n+#include <tuple>\n+#include <unordered_map>\n+\n+#include \"constant_value.h\"\n+#include \"make_unique.h\"\n+\n+namespace spvtools {\n+namespace opt {\n+\n+namespace {\n+// The core operate function to get spec operation result with the given opcode\n+// and operands in 32 bit words. This function returns the result in 32 bit\n+// word.\n+uint32_t OperateWords(SpvOp opcode,\n+                      const std::vector<uint32_t>& operand_words) {\n+  switch (opcode) {\n+    // Arthimetics\n+    case SpvOp::SpvOpSNegate:\n+      // TODO(qining): refer to grammar for such asserts.\n+      assert(operand_words.size() == 1u);\n+      return -static_cast<int32_t>(operand_words.front());\n+    case SpvOp::SpvOpNot:\n+      assert(operand_words.size() == 1u);\n+      return ~operand_words.front();\n+    case SpvOp::SpvOpIAdd:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() + operand_words.back();\n+    case SpvOp::SpvOpISub:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() - operand_words.back();\n+    case SpvOp::SpvOpIMul:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() * operand_words.back();\n+    case SpvOp::SpvOpUDiv:\n+      assert(operand_words.size() == 2u);\n+      assert(operand_words.back() != 0);\n+      return operand_words.front() / operand_words.back();\n+    case SpvOp::SpvOpSDiv:\n+      assert(operand_words.size() == 2u);\n+      assert(operand_words.back() != 0u);\n+      return (static_cast<int32_t>(operand_words.front())) /\n+             (static_cast<int32_t>(operand_words.back()));\n+    case SpvOp::SpvOpSRem: {\n+      assert(operand_words.size() == 2u);\n+      assert(operand_words.back() != 0u);\n+      int32_t a = static_cast<int32_t>(operand_words.front());\n+      int32_t b = static_cast<int32_t>(operand_words.back());\n+      return a % b;\n+    }\n+    case SpvOp::SpvOpSMod: {\n+      assert(operand_words.size() == 2u);\n+      assert(operand_words.back() != 0u);\n+      int32_t rem = OperateWords(SpvOp::SpvOpSRem, operand_words);\n+      int32_t b = static_cast<int32_t>(operand_words.back());\n+      return (rem + b) % b;\n+    }\n+    case SpvOp::SpvOpUMod:\n+      assert(operand_words.size() == 2u);\n+      assert(operand_words.back() != 0u);\n+      return (operand_words.front() % operand_words.back());\n+\n+    // Shifting\n+    case SpvOp::SpvOpShiftRightLogical: {\n+      assert(operand_words.size() == 2u);\n+      uint32_t a = operand_words.front();\n+      uint32_t b = operand_words.back();\n+      uint32_t mask = (1u << b) - 1u;\n+      return (a >> b) & mask;\n+    }\n+    case SpvOp::SpvOpShiftRightArithmetic:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<int32_t>(operand_words.front())) >>\n+             operand_words.back();\n+    case SpvOp::SpvOpShiftLeftLogical:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() << operand_words.back();\n+\n+    // Bitwise operations\n+    case SpvOp::SpvOpBitwiseOr:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() | operand_words.back();\n+    case SpvOp::SpvOpBitwiseAnd:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() & operand_words.back();\n+    case SpvOp::SpvOpBitwiseXor:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() ^ operand_words.back();\n+\n+    // Logical\n+    case SpvOp::SpvOpLogicalEqual:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<bool>(operand_words.front())) ==\n+             (static_cast<bool>(operand_words.back()));\n+    case SpvOp::SpvOpLogicalNotEqual:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<bool>(operand_words.front())) !=\n+             (static_cast<bool>(operand_words.back()));\n+    case SpvOp::SpvOpLogicalOr:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<bool>(operand_words.front())) ||\n+             (static_cast<bool>(operand_words.back()));\n+    case SpvOp::SpvOpLogicalAnd:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<bool>(operand_words.front())) &&\n+             (static_cast<bool>(operand_words.back()));\n+    case SpvOp::SpvOpLogicalNot:\n+      assert(operand_words.size() == 1u);\n+      return !static_cast<bool>(operand_words.front());\n+    case SpvOp::SpvOpSelect:\n+      assert(operand_words.size() == 3u);\n+      return (static_cast<bool>(operand_words.front())) ? operand_words.at(1)\n+                                                        : operand_words.at(2);\n+\n+    // Comparison\n+    case SpvOp::SpvOpIEqual:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() == operand_words.back();\n+    case SpvOp::SpvOpINotEqual:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() != operand_words.back();\n+    case SpvOp::SpvOpULessThan:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() < operand_words.back();\n+    case SpvOp::SpvOpSLessThan:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<int32_t>(operand_words.front())) <\n+             (static_cast<int32_t>(operand_words.back()));\n+    case SpvOp::SpvOpUGreaterThan:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() > operand_words.back();\n+    case SpvOp::SpvOpSGreaterThan:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<int32_t>(operand_words.front())) >\n+             (static_cast<int32_t>(operand_words.back()));\n+    case SpvOp::SpvOpULessThanEqual:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() <= operand_words.back();\n+    case SpvOp::SpvOpSLessThanEqual:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<int32_t>(operand_words.front())) <=\n+             (static_cast<int32_t>(operand_words.back()));\n+    case SpvOp::SpvOpUGreaterThanEqual:\n+      assert(operand_words.size() == 2u);\n+      return operand_words.front() >= operand_words.back();\n+    case SpvOp::SpvOpSGreaterThanEqual:\n+      assert(operand_words.size() == 2u);\n+      return (static_cast<int32_t>(operand_words.front())) >=\n+             (static_cast<int32_t>(operand_words.back()));\n+    default:\n+      assert(false && \"Unsupported operation for OpSpecConstantOp instruction\");\n+      return 0u;\n+  }\n+}\n+\n+// A wrapper function of the OperateWords() for constants of scalar type. This\n+// function extracts the operand values as 32 bit words and pass them to the\n+// OperateWords() then return the operation result in 32 bit word. Scalar\n+// constants with longer than 32-bit width are not accepted in this function.\n+uint32_t OperateScalars(SpvOp opcode,\n+                        const std::vector<analysis::Const*>& operands) {\n+  std::vector<uint32_t> operand_values_in_raw_words;\n+  for (analysis::Const* operand : operands) {\n+    if (analysis::ScalarConst* scalar = operand->AsScalarConst()) {\n+      const auto& scalar_words = scalar->words();\n+      assert(scalar_words.size() == 1 &&\n+             \"Scalar constants with longer than 32-bit width are not allowed \"\n+             \"in OperateScalars()\");\n+      operand_values_in_raw_words.push_back(scalar_words.front());\n+    } else if (operand->AsNullConst()) {\n+      operand_values_in_raw_words.push_back(0u);\n+    } else {\n+      assert(false &&\n+             \"OperateScalars() only accepts ScalarConst or NullConst type of \"\n+             \"constant\");\n+    }\n+  }\n+  return OperateWords(opcode, operand_values_in_raw_words);\n+}\n+\n+// A wrapper function of the OperateWords() for constants of vector type. This\n+// function iterates through the given vector type constant operands and\n+// calculates the result for each element of the result vector to return.\n+// Vectors with longer than 32-bit scalar components are not accepted in this\n+// function.\n+std::vector<uint32_t> OperateVectors(\n+    SpvOp opcode, uint32_t num_dims,\n+    const std::vector<analysis::Const*>& operands) {\n+  std::vector<uint32_t> result;\n+  for (uint32_t d = 0; d < num_dims; d++) {\n+    std::vector<uint32_t> operand_values_for_one_dimension;\n+    for (analysis::Const* operand : operands) {\n+      if (analysis::VectorConst* vector_operand = operand->AsVectorConst()) {\n+        if (const analysis::ScalarConst* scalar_component =\n+                vector_operand->GetComponent(d)->AsScalarConst()) {\n+          const auto& scalar_words = scalar_component->words();\n+          assert(\n+              scalar_words.size() == 1 &&\n+              \"Vector components with longer than 32-bit width are not allowed \"\n+              \"in OperateVectors()\");\n+          operand_values_for_one_dimension.push_back(scalar_words.front());\n+        } else if (operand->AsNullConst()) {\n+          operand_values_for_one_dimension.push_back(0u);\n+        } else {\n+          assert(false &&\n+                 \"VectorConst should only has ScalarConst or NullConst as \"\n+                 \"components\");\n+        }\n+      } else if (operand->AsNullConst()) {\n+        operand_values_for_one_dimension.push_back(0u);\n+      } else {\n+        assert(false &&\n+               \"OperateVectors() only accepts VectorConst or NullConst type of \"\n+               \"constant\");\n+      }\n+    }\n+    result.push_back(OperateWords(opcode, operand_values_for_one_dimension));\n+  }\n+  return result;\n+}\n+}  // anonymous namespace\n+\n+bool FoldSpecConstantOpAndCompositePass::ProcessImpl(ir::Module* module) {\n+  bool modified = false;\n+  auto inst_iter = module->types_values_begin();\n+  // In case the types, constants, global variabls secion is empty, do nothing.\n+  if (inst_iter == module->types_values_end()) return modified;\n+\n+  do {","path":"source/opt/fold_spec_const_op_composite.cpp","position":258,"original_position":258,"commit_id":"d42fbcdc98a30d7a8f128ce4819c30b9303d308a","original_commit_id":"d42fbcdc98a30d7a8f128ce4819c30b9303d308a","user":{"login":"dneto0","id":13054574,"avatar_url":"https://avatars.githubusercontent.com/u/13054574?v=3","gravatar_id":"","url":"https://api.github.com/users/dneto0","html_url":"https://github.com/dneto0","followers_url":"https://api.github.com/users/dneto0/followers","following_url":"https://api.github.com/users/dneto0/following{/other_user}","gists_url":"https://api.github.com/users/dneto0/gists{/gist_id}","starred_url":"https://api.github.com/users/dneto0/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dneto0/subscriptions","organizations_url":"https://api.github.com/users/dneto0/orgs","repos_url":"https://api.github.com/users/dneto0/repos","events_url":"https://api.github.com/users/dneto0/events{/privacy}","received_events_url":"https://api.github.com/users/dneto0/received_events","type":"User","site_admin":false},"body":"Probably worth saying that you always need to re-evaluate the end iterator since you are modifying the list of instructions in this section of the module as you go along.","created_at":"2016-08-24T19:02:11Z","updated_at":"2016-08-24T19:02:11Z","html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324#discussion_r76118204","pull_request_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324","_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/comments/76118204"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324#discussion_r76118204"},"pull_request":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324"}}},"pull_request":{"url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324","id":80814023,"html_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324","diff_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324.diff","patch_url":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324.patch","issue_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/324","number":324,"state":"open","locked":false,"title":"Fold spec constants to front-end constants","user":{"login":"Qining","id":2983685,"avatar_url":"https://avatars.githubusercontent.com/u/2983685?v=3","gravatar_id":"","url":"https://api.github.com/users/Qining","html_url":"https://github.com/Qining","followers_url":"https://api.github.com/users/Qining/followers","following_url":"https://api.github.com/users/Qining/following{/other_user}","gists_url":"https://api.github.com/users/Qining/gists{/gist_id}","starred_url":"https://api.github.com/users/Qining/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qining/subscriptions","organizations_url":"https://api.github.com/users/Qining/orgs","repos_url":"https://api.github.com/users/Qining/repos","events_url":"https://api.github.com/users/Qining/events{/privacy}","received_events_url":"https://api.github.com/users/Qining/received_events","type":"User","site_admin":false},"body":"For the spec constants defined by OpSpecConstantOp and\r\nOpSpecContantComposite, if all of their operands are constants with\r\ndetermined values (front-end constants), get the correct values of\r\nthe spec constants and re-define them as front-end constants.\r\n\r\nIn short, this pass replaces all the spec constants with front-end\r\nconstants when possible.\r\n\r\nNote that this pass does not unify front-end constants. This means it is\r\npossible to have multiple constants defined with same value, due to new\r\nadded constant instructions.","created_at":"2016-08-10T15:22:28Z","updated_at":"2016-08-24T19:02:11Z","closed_at":null,"merged_at":null,"merge_commit_sha":"04b9d817fadf1ca73a1aaa9841e0539bdd9963de","assignee":null,"assignees":[],"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":3,"closed_issues":12,"state":"open","created_at":"2016-07-27T22:04:04Z","updated_at":"2016-08-18T03:14:08Z","due_on":null,"closed_at":null},"commits_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324/commits","review_comments_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324/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/324/comments","statuses_url":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/d42fbcdc98a30d7a8f128ce4819c30b9303d308a","head":{"label":"Qining:fold-specconstant-op-and-composite","ref":"fold-specconstant-op-and-composite","sha":"d42fbcdc98a30d7a8f128ce4819c30b9303d308a","user":{"login":"Qining","id":2983685,"avatar_url":"https://avatars.githubusercontent.com/u/2983685?v=3","gravatar_id":"","url":"https://api.github.com/users/Qining","html_url":"https://github.com/Qining","followers_url":"https://api.github.com/users/Qining/followers","following_url":"https://api.github.com/users/Qining/following{/other_user}","gists_url":"https://api.github.com/users/Qining/gists{/gist_id}","starred_url":"https://api.github.com/users/Qining/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qining/subscriptions","organizations_url":"https://api.github.com/users/Qining/orgs","repos_url":"https://api.github.com/users/Qining/repos","events_url":"https://api.github.com/users/Qining/events{/privacy}","received_events_url":"https://api.github.com/users/Qining/received_events","type":"User","site_admin":false},"repo":{"id":50677710,"name":"SPIRV-Tools","full_name":"Qining/SPIRV-Tools","owner":{"login":"Qining","id":2983685,"avatar_url":"https://avatars.githubusercontent.com/u/2983685?v=3","gravatar_id":"","url":"https://api.github.com/users/Qining","html_url":"https://github.com/Qining","followers_url":"https://api.github.com/users/Qining/followers","following_url":"https://api.github.com/users/Qining/following{/other_user}","gists_url":"https://api.github.com/users/Qining/gists{/gist_id}","starred_url":"https://api.github.com/users/Qining/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Qining/subscriptions","organizations_url":"https://api.github.com/users/Qining/orgs","repos_url":"https://api.github.com/users/Qining/repos","events_url":"https://api.github.com/users/Qining/events{/privacy}","received_events_url":"https://api.github.com/users/Qining/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Qining/SPIRV-Tools","description":"","fork":true,"url":"https://api.github.com/repos/Qining/SPIRV-Tools","forks_url":"https://api.github.com/repos/Qining/SPIRV-Tools/forks","keys_url":"https://api.github.com/repos/Qining/SPIRV-Tools/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Qining/SPIRV-Tools/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Qining/SPIRV-Tools/teams","hooks_url":"https://api.github.com/repos/Qining/SPIRV-Tools/hooks","issue_events_url":"https://api.github.com/repos/Qining/SPIRV-Tools/issues/events{/number}","events_url":"https://api.github.com/repos/Qining/SPIRV-Tools/events","assignees_url":"https://api.github.com/repos/Qining/SPIRV-Tools/assignees{/user}","branches_url":"https://api.github.com/repos/Qining/SPIRV-Tools/branches{/branch}","tags_url":"https://api.github.com/repos/Qining/SPIRV-Tools/tags","blobs_url":"https://api.github.com/repos/Qining/SPIRV-Tools/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Qining/SPIRV-Tools/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Qining/SPIRV-Tools/git/refs{/sha}","trees_url":"https://api.github.com/repos/Qining/SPIRV-Tools/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Qining/SPIRV-Tools/statuses/{sha}","languages_url":"https://api.github.com/repos/Qining/SPIRV-Tools/languages","stargazers_url":"https://api.github.com/repos/Qining/SPIRV-Tools/stargazers","contributors_url":"https://api.github.com/repos/Qining/SPIRV-Tools/contributors","subscribers_url":"https://api.github.com/repos/Qining/SPIRV-Tools/subscribers","subscription_url":"https://api.github.com/repos/Qining/SPIRV-Tools/subscription","commits_url":"https://api.github.com/repos/Qining/SPIRV-Tools/commits{/sha}","git_commits_url":"https://api.github.com/repos/Qining/SPIRV-Tools/git/commits{/sha}","comments_url":"https://api.github.com/repos/Qining/SPIRV-Tools/comments{/number}","issue_comment_url":"https://api.github.com/repos/Qining/SPIRV-Tools/issues/comments{/number}","contents_url":"https://api.github.com/repos/Qining/SPIRV-Tools/contents/{+path}","compare_url":"https://api.github.com/repos/Qining/SPIRV-Tools/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Qining/SPIRV-Tools/merges","archive_url":"https://api.github.com/repos/Qining/SPIRV-Tools/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Qining/SPIRV-Tools/downloads","issues_url":"https://api.github.com/repos/Qining/SPIRV-Tools/issues{/number}","pulls_url":"https://api.github.com/repos/Qining/SPIRV-Tools/pulls{/number}","milestones_url":"https://api.github.com/repos/Qining/SPIRV-Tools/milestones{/number}","notifications_url":"https://api.github.com/repos/Qining/SPIRV-Tools/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Qining/SPIRV-Tools/labels{/name}","releases_url":"https://api.github.com/repos/Qining/SPIRV-Tools/releases{/id}","deployments_url":"https://api.github.com/repos/Qining/SPIRV-Tools/deployments","created_at":"2016-01-29T17:10:36Z","updated_at":"2016-01-29T17:10:37Z","pushed_at":"2016-08-24T16:52:00Z","git_url":"git://github.com/Qining/SPIRV-Tools.git","ssh_url":"git@github.com:Qining/SPIRV-Tools.git","clone_url":"https://github.com/Qining/SPIRV-Tools.git","svn_url":"https://github.com/Qining/SPIRV-Tools","homepage":null,"size":2139,"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":"e96a881b0bb7e42251566e12b8788134c9917aaf","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-08-24T03:36:29Z","pushed_at":"2016-08-24T16:52:00Z","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":2684,"stargazers_count":133,"watchers_count":133,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":32,"mirror_url":null,"open_issues_count":23,"forks":32,"open_issues":23,"watchers":133,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324"},"html":{"href":"https://github.com/KhronosGroup/SPIRV-Tools/pull/324"},"issue":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/324"},"comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/issues/324/comments"},"review_comments":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/pulls/324/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/324/commits"},"statuses":{"href":"https://api.github.com/repos/KhronosGroup/SPIRV-Tools/statuses/d42fbcdc98a30d7a8f128ce4819c30b9303d308a"}}}}
{"actor":{"display_login":"dneto0"}}