Revision history for SPIRV-Tools

v2018.3-dev 2018-04-06
 - 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)
 - Optimizer:
   - Add --strip-reflect
   - Add --time-report
   - 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.
   - Copy propagate arrays, in simple cases.
   - Better handling of OpImageTexelPointer
   - Add loop peeling internal utility.
   - Initial utilities for scalar evolution.
 - 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.
   - Stop checking sizes derived from spec-constants.
   - Re-enable checks for OpUConvert.
 - Fixes:
   #898: Linker properly removes FuncParamAttr from imported symbols.
   #924, #1174: Fix handling of decoration groups in optimizer, linker.
   #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.

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
