| Revision history for SPIRV-Tools | 
 |  | 
 | v2019.2-dev 2019-01-07 | 
 |  - Start v2019.2-dev | 
 |  | 
 | v2019.1 2019-01-07 | 
 |  - General: | 
 |    - Created a new tool called spirv-reduce. | 
 |    - Add cmake option to turn off SPIRV_TIMER_ENABLED (#2103) | 
 |    - New optimization pass to update the memory model from GLSL450 to VulkanKHR. | 
 |    - Recognize OpTypeAccelerationStructureNV as a type instruction and ray tracing storage classes. | 
 |    - Fix GCC8 build. | 
 |    - Add --target-env flag to spirv-opt. | 
 |    - Add --webgpu-mode flag to run optimizations for webgpu. | 
 |    - The output disassembled line number stead of byte offset in validation errors. (#2091) | 
 |  - Optimizer | 
 |    - Added the instrumentation passes for bindless validation. | 
 |    - Added passes to help preserve OpLine information (#2027) | 
 |    - Add basic support for EXT_fragment_invocation_density (#2100) | 
 |    - Fix invalid OpPhi generated by merge-return. (#2172) | 
 |    - Constant and type manager have been turned into analysies. (#2251) | 
 |    Fixes: | 
 |    - #2018: Don't inline functions with a return in a structured CFG contstruct. | 
 |    - #2047: Fix bug in folding when volatile stores are present. | 
 |    - #2053: Fix check for when folding floating pointer values is allowed. | 
 |    - #2130: Don't inline recursive functions. | 
 |    - #2202: Handle multiple edges between two basic blocks in SSA-rewriter. | 
 |    - #2205: Don't unswitch a latch condition during loop unswitch. | 
 |    - #2245: Don't fold branch in loop unswitch.  Run dead branch elimination to fold them. | 
 |    - #2204: Fix eliminate common uniform to place OpPhi instructions correctly. | 
 |    - #2247: Fix type mismatches caused by scalar replacement. | 
 |    - #2248: Fix missing OpPhi after merge return. | 
 |    - #2211: After merge return, fix invalid continue target. | 
 |    - #2210: Fix loop invariant code motion to not place code between merge instruction and branch. | 
 |    - #2258: Handle CompositeInsert with no indices in VDCE. | 
 |    - #2261: Have replace load size handle extact with no index. | 
 |  - Validator | 
 |    - Changed the naming convention of outputing ids with names in diagnostic messages. | 
 |    - Added validation rules for UniformConstant variables in Vulkan. | 
 |    - #1949: Validate uniform variable type in Vulkan | 
 |    - Ensure for OpVariable that result type and storage class operand agree (#2052) | 
 |    - Validator: Support VK_EXT_scalar_block_layout | 
 |    - Added Vulkan memory model semantics validation | 
 |    - Added validation checkes spefic to WebGPU environment. | 
 |    - Add support for VK_EXT_Transform_feedback capabilities (#2088) | 
 |    - Add validation for OpArrayLength. (#2117) | 
 |    - Ensure that function parameter's type is not void (#2118) | 
 |    - Validate pointer variables (#2111) | 
 |    - Add check for QueueFamilyKHMR memory scope (#2144) | 
 |    - Validate PushConstants annotation and type (#2140) | 
 |    - Allow Float16/Int8 for Vulkan 1.0 (#2153) | 
 |    - Check binding annotations in resource variables (#2151, #2167) | 
 |    - Validate OpForwardPointer (#2156) | 
 |    - Validate operation for OpSpecConstantOp (#2260) | 
 |    Fixes: | 
 |    - #2049: Allow InstanceId for NV ray tracing | 
 |  - Reduce | 
 |    - Initial commit wit a few passes to reduce test cases. | 
 |    - Validation is run after each reduction step. | 
 |    Fixes: | 
 |  | 
 |  | 
 | v2018.6 2018-11-07 | 
 |  - General: | 
 |    - Added support for the Nvidia Turing and ray tracing extensions. | 
 |    - Make C++11 the CXX standard in CMakeLists.txt. | 
 |    - Enabled a parallel build for MSVC. | 
 |    - Enable pre-compiled headers for MSVC. | 
 |    - Added a code of conduct. | 
 |    - EFFCEE and RE2 are now required when build the tests. | 
 |  - Optimizer | 
 |    - Unrolling loops marked for unrolling in the legalization passes. | 
 |    - Improved the compile time of loop unrolling. | 
 |    - Changee merge-return to create a dummy loop around the function. | 
 |    - Small improvement to merge-blocks to allow it to merge more often. | 
 |    - Enforce an upper bound for the ids, and add option to set it. | 
 |    - #1966: Report error if there are unreachable block before running merge return | 
 |    Fixes: | 
 |    - #1917: Allow 0 (meaning unlimited) as a parameter to --scalar-replacement | 
 |    - #1915: Improve handling of group decorations. | 
 |    - #1942: Fix incorrect uses of the constant manager.  Avoids type mismatches in generated code. | 
 |    - #1997: Fix dead branch elimination when there is a loop in folded selection. | 
 |    - #1991: Fixes legality check in if-conversion. | 
 |    - #1987: Add nullptr check to array copy propagation. | 
 |    - #1984: Better handling of OpUnreachable in ADCE. | 
 |    - #1983: Run merge return on reachable functions only. | 
 |    - #1956: Handled atomic operations in ADCE. | 
 |    - #1963: Fold integer divisions by 0 to 0. | 
 |    - #2019: Handle MemberDecorateStringGOOGLE in ADCE and strip reflect. | 
 |  - Validator | 
 |    - Added validation for OpGroupNonUniformBallotBitCount. | 
 |    - Added validation for the Vulkan memory model. | 
 |    - Added support for VK_KHR_shader_atddomic_int64. | 
 |    - Added validation for execution modes. | 
 |    - Added validation for runtime array layouts. | 
 |    - Added validation for 8-bit storage. | 
 |    - Added validation of OpPhi instructions with pointer result type. | 
 |    - Added checks for the Vulkan memory model. | 
 |    - Validate MakeTexelAvailableKHR and MakeTexelVisibleKHR | 
 |    - Allow atomic function pointer for OpenCL. | 
 |    - FPRounding mode checks were implemented. | 
 |    - Added validation for the id bound with an option to set the max id bound. | 
 |    Fixes: | 
 |    - #1882: Improve the validation of decorations to reduce memory usage. | 
 |    - #1891: Fix an potential infinite loop in dead-branch-elimination. | 
 |    - #1405: Validate the storage class of boolean objects. | 
 |    - #1880: Identify arrays of type void as invalid. | 
 |    - #487: Validate OpImageTexelPointer. | 
 |    - #1922: Validate OpPhi instructions are at the start of a block correctly. | 
 |    - #1923: Validate function scope variable are at the start of the entry block. | 
 |  | 
 | v2018.5 2018-09-07 | 
 |  - General: | 
 |    - Support SPV_KHR_vulkan_memory_model | 
 |    - Update Dim capabilities, to match SPIR-V 1.3 Rev 4 | 
 |    - Automated build bots no run tests for the VS2013 case | 
 |    - Support Chromium GN build | 
 |    - Use Kokoro bots: | 
 |      - Disable Travis-CI bots | 
 |      - Disable AppVeyor VisualStudio Release builds. Keep VS 2017 Debug build | 
 |    - Don't check export symbols on OSX (Darwin): some installations don't have 'objdump' | 
 |    - Reorganize source files and namespaces | 
 |    - Fixes for ClangTidy, and whitespace (passes 'git cl presumit --all -uf') | 
 |    - Fix unused param compile warnings/errors when Effcee not present | 
 |    - Avoid including time headers when timer functionality is disabled | 
 |    - Avoid too-stringent warnings flags for Clang on Windows | 
 |    - Internal refactoring | 
 |    - Add hooks for automated fuzzing | 
 |    - Add testing of command line executables | 
 |    - #1688: Use binary mode on stdin; fixes "spirv-dis <foo.spv" on Windows | 
 |  - Optimizer | 
 |    - The optimizer validates the module before it begins | 
 |    - Add API to register passes by string name | 
 |    - Fold a vector shuffle feeding a vector shuffle | 
 |    - Add -combine-access-chains transform | 
 |    - Refactor how IRContext is handled by passes | 
 |    - Improve bookkeeping for instruction result type and result id | 
 |    - Fix over-duplication of decorations | 
 |    - Fix handling of exits from selections in dead-branch elimination, and dead code | 
 |      elimination. | 
 |    - Fix handling of certain kinds of flow control in merge-return | 
 |    Fixes: | 
 |    - #1721: Fix size bug when folding vector shuffles | 
 |    - #1722: Fix size infinite loop when folding vector shuffles | 
 |    - #1724: Fix finding a constant of a specific type | 
 |    - #1727: Dead branch elim: Reorder blocks if needed to satisfy dominance rule | 
 |    - #1729: Handle VariablePointers cases in various optimizations | 
 |    - #1731: Fix vector shuffle with literal id indicating undef value | 
 |    - #1736: Fix handling of decorations and phis in merge-return | 
 |    - #1787: Fix handling of decorations related to access chains | 
 |    - #1865: Avoid leaking memory for SPIR-V constant values | 
 |  - Validator | 
 |    - Improve error messages | 
 |    - Avoid platform-dependent traversal ordering, to ensure consistent messages | 
 |    - Use libspirv::Instruction where possible | 
 |    - Add option to skip all block layout checks | 
 |    - Validate all type IDs | 
 |    - Validate uses of OpFunction | 
 |    - Validate uses of OpTypeFunction | 
 |    - Disallow a struct containing its own type https://crbug.com/874372 | 
 |    - #1685: Vulkan permits non-monotonic offsets for block members | 
 |    - #1697: Enforce block layout rules even when using relaxed block layout option | 
 |    - #1719: Fix line number for vector shuffle valiation error | 
 |    - #1789: Avoid assertion failure when validating some functions | 
 |    - #1800: Fix validation of OpCopyMemorySized | 
 |    - #1822: Stop enforcing struct member offset montonicity | 
 |    - #1831: Disallow void members in structs | 
 |  | 
 | v2018.4 2018-07-08 | 
 |  - General: | 
 |    - Support SPV_KHR_8bit_storage | 
 |    - Add gclient and presubmit configurations | 
 |    - Enable Kokoro build bots (#1625) | 
 |    - Group tests into fewer executables, reduces load on CI | 
 |    - Port test script to Python 3 | 
 |    - Symbol export tests respect SPIRV_SKIP_TESTS | 
 |    - #1596: Operand lookup succeeds if enabled by a capability | 
 |    - #1624: Instruction lookup succeeds if enabled by a capability | 
 |    - Refactoring namespaces: | 
 |      - #1678: Change libspirv to spvtools | 
 |      - Code in source/utils moved into spvtools::utils | 
 |      - Code in source/comp moved into spvtools::comp | 
 |  - Optimizer: | 
 |    - Remove insert-extract-elim pass. Use simplification pass instead. | 
 |    - Preserve instruction-to-block mapping in most passes, to reduce runtime. | 
 |    - Small vector optimization for operands | 
 |    - Add pass to move Private variables to Function. Increase opportunity to optimize. | 
 |    - Fixes: | 
 |      #1120: Check static uses of entry point interfaces | 
 |      #1372: Avoid merging some structs, to preserve names for reflection | 
 |      #1577: Scalar replacement uses only undecorated types. | 
 |      #1578: Fix handling of forward-pointer types, and types embedding pointers | 
 |        to themselves. | 
 |      #1591: Inliner: Callee variable with initializer should have a store at the call site. | 
 |      #1634: Fix crash: Use type id in vector type lookup | 
 |      #1649: Fix assert in compact-ids pass | 
 |      Fix constant folder: ensure it uses the right type | 
 |      #1659: Folding rules added to IRContext. Avoids leak. | 
 |  - Validator | 
 |    - Add work-in-progress WebGPU environment. Disallows OpUndef | 
 |    - #670, #1581: Improve error messages; disassemble instruction | 
 |    - #491: Check structured switches | 
 |    - #937: Check layout rules for Block and BufferBlock in Uniform, StorageBuffer, PushConstant | 
 |    - #1281: Check invalid branches into structured constructs | 
 |    - #1522: Disallow array-of-arrays with DescriptorSets | 
 |    - #1577: Allow duplicate pointer types. | 
 |    - #1581: Better messages: output ID names along with numbers in more cases. | 
 |    - #1597: Check Vulkan 1.1 capabilities | 
 |    - #1618: Check invalid exit from structured case construct | 
 |    - #1622: Run IdPass before DataRulesPass | 
 |    - #1632: Reduce test time by artificially lowering limits in limit test | 
 |    - #1638: Block-decorated structs member order must respect offset order | 
 |    - #1657: Improve CFG validation diagnostics | 
 |    - Khronos SPIR-V #337: GLSL.std.450 Refract instruction Eta param can be any float scalar. | 
 |    - #1606: PushConstant Blocks follow storage-buffer layout rules | 
 |    - #1664: Check layout of StorageBuffer variables with Block decoration, using storage buffer | 
 |      rules | 
 |    - #1666: Layout validation should permit {vec3; float} packing | 
 |    - #1637, #1668: Layout validation uses RowMajor, ArrayStride, MatrixStride properly | 
 |  - Linker | 
 |    - Avoid buffer overrun when creating OpModuleProcessed | 
 |  | 
 | v2018.3 2018-05-25 | 
 |  - General: | 
 |    - Support SPV_EXT_descriptor_indexing | 
 |    - Support SPV_GOOGLE_decorate_string | 
 |    - Support SPV_GOOGLE_hlsl_functionality1 | 
 |    - Support SPV_NV_shader_subgroup_partitioned | 
 |    - Use "unified1" grammar from SPIRV-Headers | 
 |    - Simplify support for new extensions. Assembler, disassembler, and simple validation | 
 |      support is automatic if new tokens are introduced with appropriate extension | 
 |      attributes in the "unified1" SPIR-V core grammar. | 
 |    - Disassembler: Emit more digits on floating point, to reliably reproduce all | 
 |      significand bits.  (Use std::max_digits10 instead of std::digits10) | 
 |    - Fix compilation for old XCode versions: Explicit construction required for std::set. | 
 |  - Optimizer: | 
 |    - Add --strip-reflect | 
 |    - Add --time-report | 
 |    - Add --loop-fission | 
 |    - Add lop fusion. | 
 |    - Add loop peeling pass and internal utility. | 
 |    - Improve optimizer runtime. | 
 |    - Merge-return now works with structured control flow. | 
 |    - New (faster) SSA rewriter to convert local loads and stores to SSA IDs and phis. | 
 |      Can replace load/store elimination passes. | 
 |    - Fix instruction folding case: insertion that feeds and extract, when the extract | 
 |      remains. | 
 |    - Fold OpDot. | 
 |    - Fold OpFNegate. | 
 |    - Fold multply and divide of same value. | 
 |    - Fold FClamp feeding a compare. | 
 |    - Fold OpLoad feeding an extract, to reduce excessive copying. (#1547) | 
 |    - Fold Fmix feeding an extract. | 
 |    - Use simplification pass instead of insert-extract elimination. | 
 |    - Constant fold OpVectorTimesScalar. | 
 |    - Copy propagate arrays, in simple cases. | 
 |    - Aggressive dead code elimination: Can remove more instructions, e.g. derivatives. | 
 |    - Aggressive dead code elimination: Remove Workgroup variables that are written but not read. | 
 |    - Better handling of OpImageTexelPointer | 
 |    - Initial utilities for scalar evolution. | 
 |    - Add Vector dead code elimination. | 
 |    - Each pass can only run once. | 
 |    - Allow code hosting in if-conversion. | 
 |    - Add external interface for adding a PassToken, so external code can make their own | 
 |      passes. | 
 |    - Fixes: | 
 |      #1404: Don't optimize away the compute compute workgroup size constant. | 
 |      #1407: Remove a bad assertion | 
 |      #1456: Fix bug in SSA rewriter related to variables updated in loops. | 
 |      #1487: Fix long runtime in Dead insertion elimination: Don't revist select phi nodes. | 
 |      #1492: Aggressive dead code elimination can remove OpDecorateStringGOOGLE. | 
 |      #1527: Fix inlining of functions having OpKill and OpUnreachable. | 
 |      #1559: Fix assert failure in reduce-load-size pass. | 
 |      #1556: Aggressive dead code elimination: Fix handling of OpCopyMemory. | 
 |  - Validator: | 
 |    - Check Vulkan built-in variables | 
 |    - Check Vulkan-specific atomic result type rule. | 
 |    - Relax control barrier check for SPIR-V 1.3.  Fixes #1427 | 
 |    - Check OpPhi. | 
 |    - Check OpMemoryModel. | 
 |    - Stop checking sizes derived from spec-constants. | 
 |    - Re-enable checks for OpUConvert. | 
 |    - Vulkan: Fix check for PrimitiveId: Permit as Input in fragment shader. | 
 |    - Validate binary version for the given target environment. | 
 |    - Add tests for OpBranch checks. | 
 |    - Vulkan 1.1: Check scope for non-uniform subgroup operations. | 
 |    - Fix checks for SPV_AMD_gpu_shader_int16. | 
 |    - Fix logical layout check for OpDecorateId. | 
 |    - Fix checks for ViewportIndex & Layer for Vulkan and SPV_EXT_shader_viewport_index_layer. | 
 |    - Fixes: | 
 |      #1470: Vulkan: Don't restrict WorkgroupSize to Input storage class. | 
 |      #1469: Vulkan: Permit Subgroup memory scope for Vulkan 1.1. | 
 |      #1472: Per-vertex variable validation fixes. | 
 |      #1483: Valdiate barrier execution scopes for Vulkan 1.1. | 
 |  - Fixes: | 
 |    #898: Linker properly removes FuncParamAttr from imported symbols. | 
 |    #924, #1174: Fix handling of decoration groups in optimizer, linker. | 
 |  | 
 | v2018.2 2018-03-07 | 
 |  - General: | 
 |    - Support SPIR-V 1.3 and Vulkan 1.1. | 
 |      - Default target environment is now SPIR-V 1.3.  For command-line tools, | 
 |        use the --target-env option to override the default.  Examples: | 
 | 	  # Generate a SPIR-V 1.0 binary instead of SPIR-V 1.3 | 
 | 	  spirv-as --target-env spv1.0 a.spvasm -o a.spv | 
 | 	  spirv-as --target-env vulkan1.0 a.spvasm -o a.spv | 
 | 	  # Validate as Vulkan 1.0 | 
 | 	  spirv-val --target-env vulkan1.0 a.spv | 
 |    - Support SPV_GOOGLE_decorate_string and SPV_GOOGLE_hlsl_functionality1 | 
 |  - Fixes: | 
 |    - Fix Android.mk build. Compilation was failing due to missing definitions of | 
 |      SpvCapabilityFloat16ImageAMD and other enumerated values. | 
 |    - Optimizer: Avoid generating duplicate names when merging types. | 
 |    - #1375: Validator: SPV_AMD_gpu_shaer_half_float implicitly allows declaration | 
 |      of the 16-bit floating point type. | 
 |    - #1376: Optimizer: Avoid folding half-precision float. | 
 |  | 
 | v2018.1 2018-03-02 | 
 |  - General: | 
 |    - Support Visual Studio 2013 again. (Continue support for VS 2015 and VS 2017.) | 
 |    - Support building SPIRV-Tools as a shared library. | 
 |    - Improve the HLSL legalization optimization recipe. #1311 | 
 |  - Optimizer: | 
 |    - General speedups. | 
 |    - Remove generic dead code elimination functionality from transforms: | 
 |        --eliminate-local-single-block | 
 |        --eliminate-local-single-store | 
 |        --eliminate-local-multi-store | 
 |      To recover the previous behaviour, a recipe using those transforms should now | 
 |      also invoke the --eliminate-dead-code-aggressive transform. | 
 |    - Improve folding, including coverage for floating point, OpSelect, and arithmetic | 
 |      with non-trivial constant operands. | 
 |    - Add loop-invariant code motion pass. | 
 |    - Add loop-unrolling pass, for honouring unroll hits. | 
 |    - Add loop-unswitch pass. | 
 |    - Add instruction simplification pass. | 
 |    - Aggressive dead code elimination: Understands capability hierarchy when finding | 
 |      instructions it can eliminate (combinators). (PR #1268) | 
 |    - CCP can now fold floating point arithmetic. #1311 | 
 |  - Validator: | 
 |    - Validate barrier instructions. | 
 |    - Check Vulkan-specific rules for atomics. | 
 |    - Check Vulkan prohibition of Location or Component decorations on BuiltIn variables. | 
 |  - Linker: | 
 |    - Add --verify-ids option | 
 |    - Add option to allow a resulting module to be partially linked. | 
 |    - Handle OpModuleProcessed (instructions in SPIR-V layout section 7c) | 
 |  - Fixes: | 
 |    - #1265: Optimizer: Fix use-after free bug in if-conversion. (Fix object lifecycle bug | 
 |      in type manager.) | 
 |    - #1282: Fix new warnings found by GCC 8.0.1. | 
 |    - #1285: Optimizer: Fix random failures during inlining.  (Dangling references in DefUseManager) | 
 |    - #1295: Optimizer: Fix incorrect handling of Phi nodes in CCP. | 
 |    - #1300: Fix CCP: avoid bad CCP transitions and unsettled values. | 
 |    - #1304: Avoid static-duration variables of class type (with constructors). | 
 |    - #1323: Fix folding of an insert composite feeding a composite extract. | 
 |    - #1339: Fix CCP: Handle OpConstantNull boolean values as conditions. | 
 |    - #1341: DCEInst: Keep atomic instructions (and some others with side effects). | 
 |    - #1354: Don't fold integer division. | 
 |    - #1357: Support OpConstantNull in folding. | 
 |    - #1361: CCP: Fix handling of non-constant module-scope values | 
 |  | 
 | v2018.0 2018-02-02 | 
 |  - General | 
 |    - VisualStudio 2013 is no longer supported.  VisualStudio 2015 is supported. | 
 |    - Use "include/unified1" directory from SPIRV-Headers.  Requires recent SPIRV-Headers source. | 
 |  - Disassembler: spirv-dis adds --color option to force color disassembly. | 
 |  - Optimizer: | 
 |    - Add pass to eliminate dead insertions. | 
 |    - Aggressive dead code elimination now removes OpSwitch constructs. | 
 |    - Block merging occurs in more cases. | 
 |    - Add driver workaround transform: replace OpUnreachable with harmless branch to merge. | 
 |    - Improve instruction folding framework. | 
 |    - Add loop analysis. | 
 |    - Add scalar replacement of aggregates to size-optimization recipe. | 
 |    - Add pass to replace instructions invalid for a shader stage, with a harmless value. | 
 |      This changes the semantics of the program!  Not for general use! | 
 |    - Rearragne and add passes to performance-optimization recipe, to produce better results. | 
 |  - Validator: | 
 |    - Validate OpenCL extended instructions. | 
 |    - Shaders can't perform atomics on floats. | 
 |    - Validate memory semantics values in atomics. | 
 |    - Validate instruction-adjacency constraints, e.g. OpPhi predecessors, merge instructions | 
 |      immediately precede branches. | 
 |  - Fixes: | 
 |    - PR 1198: Optimizer: Fix CCP in presence of matrix constants. | 
 |    - #1199: Optimizer: Fix CCP: don't propagate spec constants. | 
 |    - #1203: Optimizer: Fix common uniform elim bug introduced by refactoring. | 
 |    - #1210: Optimizer: Aggressive dead code elimination: Fix 'break' identification. | 
 |    - #1212: Optimizer: Aggressive dead code elimination: Was skipping too many instructions. | 
 |    - #1214: Optimizer: Aggressive dead code elimination: Fix infinite loop. | 
 |    - #1228: Optimizer: Fix CCP: Handling of varying Phi nodes; was resulting in infinite loop. | 
 |    - #1245: Optimizer: Dead branch elimination: Avoid a null pointer dereference. | 
 |    - #1250: Optimizer: Dead branch elimination: Avoid spuriously reporting a change. | 
 |  | 
 | v2017.3 2018-01-12 | 
 |  - General: | 
 |    - Support DebugInfo extended instruction set, targeted at OpenCL environments. | 
 |      See the SPIR-V Registry. | 
 |    - Generate a SPIRV-Tools.pc file for pkg-config. | 
 |  - Optimizer: | 
 |    - Progress for legalization of code generated from HLSL (issue #1118): | 
 |      - Add --legalize-hlsl option to run transforms used to transform intermediate | 
 |        code generated by HLSL to SPIR-V for Vulkan compilers.  Those compilers | 
 |        normally run these transforms automatically.  This option is used for developing | 
 |        those transforms. | 
 |      - Add Private-to-Function variable conversion for modules with logical | 
 |        addressing. | 
 |    - Add --ccp: SSA Conditional Constant Propagation (CCP) | 
 |    - Add --print-all to show disassembly for each optimization pass. | 
 |    - Internal: Add loop descriptors and post-order tree iterator. | 
 |    - Generalized dead branch elimination | 
 |    - Aggressive dead code elimination (ADCE) now removes dead functions and | 
 |      module-scope variables. | 
 |    - Vector extract/insert elimination now optimizes through some cases of | 
 |      VectorShuffle, and GLSL.std.450 Mix extended instruction. | 
 |  - Validator: | 
 |    - Add validation for GLSL.std.450 extended instruction set. | 
 |    - Check out of bounds composite accesses, where that's statically computable. | 
 |      Fixes #1112. | 
 |    - Check upper bits of literal numbers that aren't a multiple of 32-bits wide. | 
 |    - More validation of primitive instructions | 
 |    - Add optional "relaxed" checking logical addressing mode to permit some | 
 |      cases of pointer-to-pointer.  Contributes to HLSL legalization (issue #1118). | 
 |  - Fixes: | 
 |    #1100: Validator: Image operand Sample can be used with OpImageSparseFetch, | 
 |      OpImageSparseRead. | 
 |    #1108: Remove duplicates transform was incorrectly removing non-duplicate | 
 |      decorations. | 
 |    #1111: Optimizer's type manager could reference deleted memory. | 
 |    #1112: Fix decoration equality check, e.g. it is now symmetric. | 
 |    #1129: Validator now disallows Dim=SupbassData for OpImageSparseRead. | 
 |    #1143: Fix CCP: Was generating incorrect code for loops. | 
 |    #1153: Fix CCP crash. | 
 |    #1154: Optimizer's internal instruction-to-block mappings were sometimes | 
 |        inconsistent. | 
 |    #1159: Fix CCP infinite loop. | 
 |    #1168: Fix dead branch elimination intermittently generating incorrect code. | 
 |        Fixes https://github.com/KhronosGroup/glslang/issues/1205 | 
 |    #1186: Fix validation of PackDouble2x32 and UnpackDouble2x32 | 
 |  | 
 | v2017.2 2017-12-15 | 
 |  - General: | 
 |    - Support OpenCL 1.2, 2.0 target environments, including embedded profiles | 
 |    - Add CONTRIBUTING.md | 
 |    - Fix exit status code for spirv-link | 
 |    - Disassember: Enable emitting ANSI colour codes to a string | 
 |    - Library avoids polluting global namespace.  The libraries can export C and C++ | 
 |      symbols starting with "spv", or in a C++ namespace.  Add a test for this. | 
 |    - Linux release builds include debug information, for easier profiling | 
 |    - Build bots no longer test VisualStudio 2013 | 
 |      - Testing dependency RE2 requires VisualStudio 2015 or later | 
 |    - Build bots check code formatting | 
 |  - Optimizer: | 
 |    - Add --skip-validation to spirv-opt | 
 |    - Add dominance tree analysis | 
 |    - Add generic value propagation engine | 
 |    - Add global redundancy elimination within a function | 
 |    - Add scalar replacement of function-scope variables of composite type | 
 |    - Aggressive dead code elimination: Remove empty loops | 
 |    - Killing an instruction notifies the IRContext | 
 |    - IRContext::KillInst deletes the instruction | 
 |    - Move CFG analysis to IRContext | 
 |    - Add constant manager | 
 |    - Fix: Don't consider derivative instructions as combinators. | 
 |    - Fix: Don't delete an instruction twice in local dead-code-elimination | 
 |    - Fix: Don't consider derivative instructions as combinators. | 
 |  - Validator: | 
 |    - Finish checking of image instructions (Section 3.32.10) | 
 |      - Check sparse image instructions | 
 |      - Check OpTypeImage, OpTypeSampleImage | 
 |    - Check composite instructions (Section 3.32.12) | 
 |    - Check atomic instructions (Section 3.32.18) | 
 |    - Check OpEmitStreamVertex, OpEndStreamPrimitive instructions | 
 |    - Re-enable validation of OpCopyObject | 
 |    - OpKill, image ImplicitLod and QueryLod instructions can only be used in Fragment | 
 |      shaders. | 
 |    - Fixes for image instruction validation: | 
 |      - Lod image operand only usable with ExplicitLod and OpImageFetch | 
 |      - ExplicitLod Lod image operand must be float scalar | 
 |      - OpImageFectch Lod image operand must be int scalar | 
 |      - OpImageGather component operand must be 32-bits (integer scalar) | 
 |      - OpImageQuerySizeLod Lod must be integer scalar | 
 |  - Fixes: | 
 |    #622: Remove names and decorations when inlining | 
 |    #989: Aggressive dead code elim: Don't optimize away live breaks from a loop | 
 |    #991: Fix validation of SPV_AMD_shader_ballot | 
 |    #1004: Use after free of an instruction, in remove-duplicates transform | 
 |    #1007: OpImageRead not required to return 4-component vector | 
 |    #1009: OpImageRead can return scalar int/float types | 
 |    #1011: OpImageWrite should allow scalar int/float texel types | 
 |    #1012: Fix validat Dref type check | 
 |    #1017: Load-store elimination considers variable initializations | 
 |    #1034: Fix Windows debug build: operator< should be a weak ordering | 
 |    #1083: Inlining: Set parent (function) for each inlined basic block. | 
 |    #1075: Aggressive dead code elimination: Was leaving dangling references to | 
 |      removed blocks. | 
 |  | 
 | v2017.1 2017-11-23 | 
 |  - Update README with details on the public_spirv_tools_dev@khronos.org mailing list. | 
 |  - General: | 
 |    - Automatically deploy built artifacts to GitHub Releases | 
 |    - Add a Linker (module combiner). Under development. | 
 |    - Add Android.mk for Android NDK builds. | 
 |    - Add the 'effcee' library as an optional dependency for use in tests. | 
 |      Eventually it will be a required dependency, once downstream projects have | 
 |      a chance to adjust.  Requires 're2' library. | 
 |    - Avoid static-duration variables of class type (with constructors). | 
 |    - Hack around bugs in gcc-4.8.1 template handling | 
 |    - Faster opcode lookup | 
 |  - Validator: | 
 |    - Recognize extensions listed on SPIR-V registry, | 
 |      through #25 SPV_AMD_shader_fragment_mask | 
 |    - Validator issues an info message when it sees an unrecognized extension. | 
 |    - Type check basic arithmetic operations | 
 |    - Type check carry/extended arithmetic operations | 
 |    - Type check vector arithmetic operations | 
 |    - Type check Relational and Logical instructions | 
 |    - Type check Bit instructions | 
 |    - Check type uniqueness rules | 
 |    - Check conversion instructions | 
 |    - Check image instructions | 
 |    - Check derivative instructions | 
 |    - Check OpVectorShuffle | 
 |    - Check OpBranchConditional | 
 |    - OpModuleProcessed is only allowed after debug names section and before annotations | 
 |      section. | 
 |    - Checks the right kind of return is called for each function (void or non-void). | 
 |    - Add option to relax type check when storing structs (--relax-store-struct) | 
 |  - Optimizer: | 
 |    - Refactoring internal representation of the module, including: | 
 |      - IRContext: owns a module and manages analyses | 
 |      - Instructions are owned by intrusive lists, and have unique IDs | 
 |      - BasicBlock owns its instruction list. | 
 |      - DefUseManager: change representation of uses, for faster processing | 
 |        on large modules. | 
 |    - Add high level recipes: -O, -Os, and -Oconfig | 
 |      Recipes for -O and -Os are under development. | 
 |    - Add eliminate-dead-function transform | 
 |    - Add strength reduction transform: For now, convert multiply by power of 2 | 
 |      to a bit shift. | 
 |    - Add CFG cleanup transform | 
 |    - Add removal of dead module-scope variables | 
 |    - Add merge-return transform for modules without structured control flow | 
 |    - Add redundancy elimination within a basic block (local value numbering) | 
 |    - Extract-insert elimination: | 
 |      - Recognize the case where the first instruction in the sequence is an | 
 |        OpCompositeConstruct or OpConstantComposite | 
 |      - Handle some cases of nested structs | 
 |    - Dead branch elimination now can eliminate entire selection constructs | 
 |      when all arms are dead. | 
 |  - Compressing codec: | 
 |    - Updated algorithm to 1.01, 1.02, 1.03 | 
 |    - Not built by default.  Use -DSPIRV_BUILD_COMPRESSION=ON to build. | 
 |    - Codec can be parameterized by a customized model. | 
 |  - Fixes: | 
 |    #728: Fix decoration of inlined functions | 
 |    #798: spirv-as should fail when given unrecognized long option | 
 |    #800: Inliner: Fix inlining function into header of multi-block loop | 
 |    #824: Eliminate-local-multi-store: Fix a crash | 
 |    #826: Elimiante-local-multi-store: Fix a crash | 
 |    #827: Fix crash when compact-ids transform runs before another transform. | 
 |    #834: Add Cmake option to build the compressing codec. Off by default. | 
 |    #911: Fix classification of Line and NoLine instructions | 
 |  | 
 | v2017.0 2017-09-01 | 
 |  - Update README to describe that assembler, disassembler, and binary parser support | 
 |    are based on grammar files from the SPIRV-Headers repository. | 
 |  | 
 | v2016.7 2017-09-01 | 
 |  - Add SPIR-V 1.2 | 
 |  - OpenCL 2.2 support is now based on SPIR-V 1.2 | 
 |  - Support AMD extensions in assembler, disassembler: | 
 |     SPV_AMD_gcn_shader | 
 |     SPV_AMD_shader_ballot | 
 |     SPV_AMD_shader_explicit_vertex_parameter | 
 |     SPV_AMD_shader_trinary_minmax | 
 |     SPV_AMD_gpu_shader_half_float | 
 |     SPV_AMD_texture_gather_bias_lod | 
 |     SPV_AMD_gpu_shader_int16 | 
 |  - Optimizer: Add support for: | 
 |    - Inline all function calls in entry points. | 
 |    - Flatten decoration groups.  Fixes #602 | 
 |    - Id compaction (minimize Id bound).  Fixes #624 | 
 |    - Eliminate redundant composite insert followed by extract | 
 |    - Simplify access chains to local variables | 
 |    - Eliminate local variables with a single store, if possible | 
 |    - Eliminate local variables with a several stores, if possible | 
 |    - Eliminate loads and stores in same block to local variables | 
 |    - Eliminate redundant insert/extract to composite values | 
 |    - Aggressive dead instruction elimination | 
 |    - Eliminate dead branches | 
 |    - Merge blocks when the second can only be preceded by the first | 
 |    - Eliminate ommon uniform loads | 
 |  - Assembler: Add option to preserve numeric ids. Fixes #625 | 
 |  - Add build target spirv-tools-vimsyntax to generate spvasm.vim, a SPIR-V | 
 |    assembly syntax file for Vim. | 
 |  - Version string: Allow overriding of wall clock timestamp with contents | 
 |    of environment variable SOURCE_DATE_EPOCH. | 
 |  - Validator implements relaxed rules for SPV_KHR_16bit_storage. | 
 |  - CMake installation rules use GNUInstallDirs.  For example, libraries | 
 |    will be installed into a lib64 directory if that's the norm for the | 
 |    current system. | 
 |  - Fixes: | 
 |    #500: Parameterize validator limit checks | 
 |    #508: Support compilation under CYGWIN | 
 |    #517: Fix validation when continue (or case) contstruct is also the head of a | 
 |      nested control construct. | 
 |    #551: If a merge block is reachable, it must be *strictly* dominated by its | 
 |      header. | 
 |    #548: Validator: Error when the reserved OpImageSparseSampleProj* opcodes | 
 |      are used. | 
 |    #611: spvtools::Optimizer was failing to save the module to the output | 
 |      binary vector when all passes succeded without changes. | 
 |    #629: The inline-entry-points-all optimization could generate invalidly | 
 |      structured code when the inlined function had early returns. | 
 |    #697: Optimizer's Instruction::ForEachInId method was skipping semantics-id | 
 |      and scope-id. | 
 |    #755: Inliner: Fix inlining of callee with single Return appearing before | 
 |      the end of the function. | 
 |    #776: Fix dead branch elimination in presence of complex but dead control | 
 |      flow. | 
 |    #781: SPV_KHR_variable_pointers allows duplicate pointer types | 
 |    #782: Inliner: Fix remapping of non-label forward references in callee | 
 |    #787: Inliner: Fix remapping of inlined entry block when called from | 
 |      single block loop. | 
 |    #790: Inliner: Fix remapping of inlined entry block when callee has | 
 |      multiple returns. | 
 |  | 
 | v2016.6 2016-12-13 | 
 |  - Published the C++ interface for assembling, disassembling, validation, and | 
 |    optimization. | 
 |  - Support SPV_KHR_shader_draw_parameters in assembler, disassembler, parser. | 
 |  - Validator: | 
 |    - Add validator API accepting raw binary words | 
 |    - Increased coverage: | 
 |      - Checks "Data rules" in Universal Validation Rules, section 2.16.1 | 
 |      - WIP: Universal Limits. | 
 |        - The minimum mandated upper bounds are checked. | 
 |        - TODO: Parameterize the validator to allow larger limits accepted by | 
 |          a more than minimally capable implementation. | 
 |    - OpSampledImage checks | 
 |    - OpConstantComposite checks | 
 |    - Id bound check | 
 |  - Disasssembler: | 
 |    - Generates friendly GLSL-based names for more builtin variables | 
 |    - Generates friendly names for numeric OpConstant values | 
 |    - Vendor tool info extracted from SPIR-V XML registry file. | 
 |  - Fixes issues: | 
 |    #429: Validator: Allow OpTypeForwardPointer and OpTypeStruct to reference | 
 |      undefined IDs | 
 |    #482: Validator: OpVariable initializer can be an ID of a module-scope variable | 
 |  | 
 | v2016.5 2016-09-16 | 
 |  - Support SPV_KHR_shader_ballot in assembler, disassembler, parser. | 
 |  - Disassembler: Generate friendly names for built-in variables. | 
 |  - Partial fixes: | 
 |    #359: Add Emacs helper for automatically diassembling/assembling a SPIR-V | 
 |      binary on file load/save. | 
 |  - Fixes: | 
 |    #414: Validator: Allow OpUndef for composite constants | 
 |    #415: Validator: Phi can use its own value in some cases. | 
 |  | 
 | v2016.4 2016-09-01 | 
 |  - Relicensed under Apache 2.0 | 
 |  - Add optimization passes (in API and spirv-opt command) | 
 |    - Fold spec constants defined with OpSpecConstantOp and | 
 |        OpSpecConstantComposite to normal constants with fixed value(s). | 
 |  - Fixes issues: | 
 |    #318: Relicensed under Apache 2.0 | 
 |  | 
 | v2016.3 2016-08-24 | 
 |  - Add target environment enums for OpenCL 2.1, OpenCL 2.2, | 
 |    OpenGL 4.0, OpenGL 4.1, OpenGL 4.2, OpenGL 4.3, OpenGL 4.5. | 
 |  - Add spirv-cfg, an experimental tool to dump the control flow graph | 
 |    as a GraphiViz "dot" graph | 
 |  - Add optimization pass: Eliminate dead constants. | 
 |  - Add spirv-lesspipe.sh filter utility | 
 |  - Fixes issues: | 
 |    #288: Check def-use dominance rules for OpPhi (variable,parent) operands | 
 |    #339: Allow OpUndef in types-constants-global-vars section, as required | 
 |      by SPIR-V 1.0 Rev7, 1.1 Rev 3. | 
 |    #340: Avoid race on mkdir during build | 
 |    #365: Relax PointSize, ClipDistance, CullDistance capability check in all | 
 |      environments not just Vulkan 1.0. | 
 |  | 
 | v2016.2 2016-08-05 | 
 |  - Validator is incomplete | 
 |    - Checks ID use block is dominated by definition block | 
 |  - Add optimization passes (in API and spirv-opt command) | 
 |    - Strip debug info instructions | 
 |    - Freeze spec constant to their default values | 
 |  - Allow INotEqual as operation for OpSpecConstantOp | 
 |  - Fixes bugs: | 
 |    #270: validator: crash when continue construct is unreachable | 
 |    #279: validator: infinite loop when analyzing some degenerate control | 
 |      flow graphs | 
 |    #286: validator: don't incorrectly generate def-use error for | 
 |          (variable,parent) parameters to OpPhi | 
 |    #290: disassembler: never generate bare % for an identifier | 
 |    #295: validator: def-use dominance check should ignore unreachable uses | 
 |    #276: validator: allow unreachable continue constructs | 
 |    #297: validator: allow an unreachable block to branch to a reachable | 
 |          merge block | 
 |  | 
 | v2016.1 2016-07-19 | 
 |  - Fix https://github.com/KhronosGroup/SPIRV-Tools/issues/261 | 
 |    Turn off ClipDistance and CullDistance capability checks for Vulkan. | 
 |  - The disassembler can emit friendly names based on debug info (OpName | 
 |    instructions), and will infer somewhat friendly names for most types. | 
 |    This is turned on by default for the spirv-dis command line tool. | 
 |  - Updated to support SPIR-V 1.1 rev 2 | 
 |    - Input StorageClass, Sampled1D capability, and SampledBuffer capability | 
 |      do not require Shader capability anymore. | 
 |  | 
 | v2016.0 2016-07-04 | 
 |  | 
 |  - Adds v<year>.<index> versioning, with "-dev" indicating | 
 |    work in progress.  The intent is to more easly report | 
 |    and summarize functionality when SPIRV-Tools is incorporated | 
 |    in downstream projects. | 
 |  | 
 |  - Summary of functionality (See the README.md for more): | 
 |    - Supports SPIR-V 1.1 Rev 1 | 
 |    - Supports SPIR-V 1.0 Rev 5 | 
 |    - Supports GLSL std450 extended instructions 1.0 Rev 3 | 
 |    - Supports OpenCL extended instructions 1.0 Rev 2 | 
 |    - Assembler, disassembler are complete | 
 |      - Supports floating point widths of 16, 32, 64 bits | 
 |      - Supports integer widths up to 64 bits | 
 |    - Validator is incomplete | 
 |      - Checks capability requirements in most cases | 
 |      - Checks module layout constraints | 
 |      - Checks ID use-definition ordering constraints, | 
 |        ignoring control flow | 
 |      - Checks some control flow graph rules | 
 |    - Optimizer is introduced, with few available transforms. | 
 |    - Supported on Linux, OSX, Android, Windows | 
 |  | 
 |  - Fixes bugs: | 
 |    - #143: OpenCL pow and pown arguments |