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. 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