Revision history for SPIRV-Tools v2020.5 2020-07-22 - Start SPIRV-Tools v2020.5 v2020.4 2020-07-22 - General - Changed variable names to be more descriptive (#3433) - Add support to GPU-AV instrumentation for Task and Mesh shaders (#3512) - Permit Simple and GLSL450 memory model in WEBGPU_0 (#3463) - Support SPV_KHR_terminate_invocation (#3568) - Optimizer - Preserving debug information in optimizations (#3389,#3420,#3425,#3356,#3459,#3444,#3492,#3451,#3497i,#3498,#3542) - Eliminate branches with condition of OpConstantNull (#3438) - Use structured order to unroll loops. (#3443) - Updated desc_sroa to support flattening structures (#3448) - Support OpCompositeExtract pattern in desc_sroa (#3456) - Fix ADCE pass bug for mulitple entries (#3470) - Sink pointer instructions in merge return (#3569) - Validator - Validate location assignments (#3308) - Fix reachability in the validator (#3541) - Reduce - Fuzz - Add support for OpSpecConstant* (#3373) - Add replace linear algebra instruction transformation (#3402) - Implement vector shuffle fuzzer pass (#3412) - Swap operands in OpBranchConditional (#3423) - Permute OpPhi instruction operands (#3421) - Add FuzzerPassAddCopyMemoryInstructions (#3391) - TransformationInvertComparisonOperator (#3475) - Add variables with workgroup storage class (#3485) - Add image sample unused components transformation (#3439) - TransformationReplaceParameterWithGlobal (#3434) - Support adding dead break from back-edge block (#3519) - Fuzzer pass to interchange zero-like constants (#3524) - Linker v2020.3 2020-05-27 - General - Prevent Effcee from installing things when building spirv-tools with testing enabled (#3256) - Update acorn version (#3294) - If SPIRV-Headers is in our tree, include it as subproject (#3299) - allow cross compiling for Windows Store, UWP, etc. (#3330) - Optimizer - Remove deprecated interfaces from instrument passes (#3361) - Preserve debug info in inline pass (#3349) - Handle more cases in dead member elim (#3289) - Preserve debug info in eliminate-dead-functions (#3251) - Fix Struct CFG analysis for single block loop (#3293) - Add tests for recently added command line option (#3297) - Consider sampled images as read-only storage (#3295) - Allow various validation options to be passed to spirv-opt (#3314) - Add debug information analysis (#3305) - Preserve debug info for wrap-opkill (#3331) - refactor inlining pass (#3328) - Add unrolling to performance passes (#3082) - Validator - Add validation support for ImageGatherBiasLodAMD (#3363) - Validate ShaderCallKHR memory scope (#3332) - Validate Buffer and BufferBlock apply only to struct types (#3259) - Reduce - increase default step limit (#3327) - Remove unused uniforms and similar (#3321) - Fuzz - Add support for StorageBuffer (#3348) - Add validator options (#3254) - Limit adding of new variables to 'basic' types (#3257) - Transformation to add OpConstantNull (#3273) - Handling of more fuzzing opportunities (#3277, #3280, #3281, #3290, #3292) - Respect rules for OpSampledImage (#3287) - Do not outline regions that produce pointer outputs (#3291) - Linker v2020.2 2020-03-26 - General: - Support extended instructions in the vscode language server - Make spvOpcodeString part of the public API (#3174) - Added guide to writing a spirv-fuzz fuzzer pass (#3190) - Add support for KHR_ray_{query,tracing} extensions (#3235) - Optimizer - Debug Printf support (#3215) - Add data structure for DebugScope, DebugDeclare in spirv-opt (#3183) - Fix identification of Vulkan images and buffers (#3253) - Validator - Add support for SPV_AMD_shader_image_load_store_lod (#3186) - Add validation rules for OpenCL.DebugInfo.100 extension (#3133) - Adding WebGPU specific Workgroup scope rule (#3204) - Disallow phis of images, samplers and sampled images (#3246) - Reduce - Fuzz - Fuzzer passes to add local and global variables (#3175) - Add fuzzer passes to add loads/stores (#3176) - Fuzzer pass to add function calls (#3178) - Fuzzer pass that adds access chains (#3182) - Fuzzer pass to add equation instructions (#3202) - Add swap commutable operands transformation (#3205) - Add fuzzer pass to permute function parameters (#3212) - Allow OpPhi operand to be replaced with a composite synonym (#3221) - Linker v2020.1 2020-02-03 - General: - Add support for SPV_KHR_non_semantic_info (#3110) - Support OpenCL.DebugInfo.100 extended instruction set (#3080) - Added support for Vulkan 1.2 - Add API function to better handle getting the necessary environment (#3142) - Clarify mapping of target env to SPIR-V version (#3150) - Implement constant folding for many transcendentals (#3166) - Optimizer - Change default version for CreatInstBindlessCheckPass to 2 (#3096, #3119) - Better handling of OpLine on merge blocks (#3130) - Use placeholder switch instead of placeholder loop in MergeReturn pass. (#3151) - Handle TimeAMD in AmdExtensionToKhrPass. (#3168) - Validator - Fix structured exit validation (#3141) - Reduce - Fuzz - Fuzzer pass to merge blocks (#3097) - Transformation to add a new function to a module (#3114) - Add fuzzer pass to perform module donation (#3117) - Fuzzer passes to create and branch to new dead blocks (#3135) - Fuzzer pass to add composite types (#3171) - Linker: - Remove names and decorations of imported symbols (#3081) v2019.5 2019-12-11 - General: - Export SPIRV-Tools targets on installation - SPIRV-Tools support for SPIR-V 1.5 (#2865) - Add WebGPU SPIR-V Assembler in JavaScript. (#2876) - Add Bazel build configuration. (#2891) - Add support for building with emscripten (#2948) - Update SPIR-V binary header test for SPIR-V 1.5 (#2967) - Add fuzzer for spirv-as call path (#2976) - Improved CMake install step. (#2963) - Add fuzzer for spirv-dis call path (#2977) - Ensure timestamp does not vary with timezone. (#2982) - Add a vscode extension for SPIR-V disassembly files (#2987) - Add iOS as a supported platform (#3001) - utils/vscode: Add SPIR-V language server support - Respect CMAKE_INSTALL_LIBDIR in installed CMake files (#3054) - Permit the debug instructions in WebGPU SPIR-V (#3063) - Add support for Fuchsia. (#3062) - Optimizer - Add descriptor array scalar replacement (#2742) - Add pass to wrap OpKill in a function call (#2790) - Fold FMix during constant folding. (#2818) - Add pass to replace AMD shader ballot extension (#2811) - Add pass to make Float32 operation relax precision (#2808) - Add pass to make relax precision operation Float16 (#2808) - Add pass to replace uses of 3 AMD extensions (#2814) - Fold Min, Max, and Clamp instructions. (#2836) - Better handling of OpKill in continues (#2842,#2922,#2933) - Enable OpTypeCooperativeMatrix specialization (#2927) - Support constant-folding UConvert and SConvert (#2960) - Update Offset to ConstOffset bitmask if operand is constant. (#3024) - Improve RegisterSizePasses (#3059) - Folding: perform add and sub on mismatched integer types (#3084) - Graphics robust access: use signed clamp (#3073) Fixes: - Instrument: Fix version 2 output record write for tess eval shaders. (#2782) - Instrument: Add support for Buffer Device Address extension (#2792) - Fix check for changed binary in API call. (#2798) - For WebGPU<->Vulkan optimization, set correct execution environment (#2834) - Handle OpConstantNull in copy-prop-arrays. (#2870) - Use OpReturn* in wrap-opkill (#2886) - Validator - Add generic builtin validation of target (#2843) - Extra resource interface validation (#2864) - Adding valilidation checks for OpEntryPoint duplicate names and execution mode (#2862) - Relaxed bitcast with pointers (#2878) - Validate physical storage buffer restrictions (#2930) - Add SPV_KHR_shader_clock validation (#2879, #3013) - Validate that selections are structured (#2962) - Disallow use of OpCompositeExtract/OpCompositeInsert with no indices (#2980) - Check that derivatives operate on 32-bit values (#2983) - Validate array stride does not cause overlap (#3028) - Validate nested constructs (#3068) Fixes: - Fix validation of constant matrices (#2794) - Update "remquor" validation - Only allow previously declared forward refs in structs (#2920) - Reduce - Remove relaxed precision decorations (#2797) - Reduce/fuzz: improve command line args (#2932) - Improve remove unref instr pass (#2945) Fixes: - Fuzz - Fix add-dead-break and add-dead-continue passes to respect dominance (#2838) - Add fuzzer pass to copy objects (#2853) - Add fuzzer pass to replace ids with synonyms (#2857) - Allow validation during spirv-fuzz replay (#2873) - Employ the "swarm testing" idea in spirv-fuzz (#2890) - reduce/fuzz: improve command line args (#2932) - option to convert shader into a form that renders red (#2934) - Add fuzzer pass to change selection controls (#2944) - add transformation and pass to construct composites (#2941) - Add fuzzer pass to change loop controls (#2949) - Add fuzzer pass to change function controls (#2951) - Add fuzzer pass to add NoContraction decorations (#2950) - Add missing functionality for matrix composites (#2974) - Fuzzer pass to adjust memory access operands (#2968) - Transformation to extract from a composite object (#2991) - Vector shuffle transformation (#3015) - Improve debugging facilities (#3074) - Function outlining fuzzer pass (#3078) v2019.4 2019-08-08 - General: - Memory model support for SPIR-V 1.4 - Add new spirv-fuzz tool - Add option for base branch in check_code_format.sh - Removed MarkV and Stats code. (#2576) - Instrument: Add version 2 of record formats (#2630) - Linker: Better type comparison for OpTypeArray and OpTypeForwardPointer (#2580) - Optimizer - Bindless Validation: Instrument descriptor-based loads and stores (#2583) - Better folding for OpSpecConstantOp (#2585, #2614) - Add in individual flags for Vulkan <-> WebGPU passes (#2615) - Handle nested breaks from switches. (#2624) - Optimizer: Handle array type with OpSpecConstantOp length (#2652) - Perform merge return with single return in loop. (#2714) - Add --preserve-bindings and --preserve-spec-constants (#2693) - Remove Common Uniform Elimination Pass (#2731) - Allow ray tracing shaders in inst bindle check pass. (#2733) - Add pass to inject code for robust-buffer-access semantics (#2771) - Treat access chain indexes as signed in SROA (#2776) - Handle RelaxedPrecision in SROA (#2788) - Add descriptor array scalar replacement (#2742) Fixes: - Handle decorations better in some optimizations (#2716) - Change the order branches are simplified in dead branch elim (#2728) - Fix bug in merge return (#2734) - SSA rewriter: Don't use trivial phis (#2757) - Record correct dominators in merge return (#2760) - Process OpDecorateId in ADCE (#2761) - Fix check for unreachable blocks in merge-return (#2762) - Handle out-of-bounds scalar replacements. (#2767) - Don't move debug or decorations when folding (#2772) - Protect against out-of-bounds references when folding OpCompositeExtract (#2774) - Validator - Validate loop merge (#2579) - Validate construct exits (#2459) - Validate OpenCL memory and addressing model environment rules (#2589) - Validate OpenCL environment rules for OpTypeImage (#2606) - Allow breaks to switch merge from nested construct (#2604) - Validate OpenCL environment rules for OpImageWrite (#2619) - Allow arrays of out per-primitive builtins for mesh shaders (#2617) - Validate OpenCL rules for ImageRead and OpImageSampleExplicitLod (#2643) - Add validation for SPV_EXT_fragment_shader_interlock (#2650) - Add builtin validation for SPV_NV_shader_sm_builtins (#2656) - Add validation for Subgroup builtins (#2637) - Validate variable initializer type (#2668) - Disallow stores to UBOs (#2651)A - Validate Volatile memory semantics bit (#2672) - Basic validation for Component decorations (#2679) - Validate that in OpenGL env block variables have Binding (#2685) - Validate usage of 8- and 16-bit types with only storage capabilities (#2704) - Add validation for SPV_EXT_demote_to_helper_invocation (#2707) - Extra small storage validation (#2732) - For Vulkan, disallow structures containing opaque types (#2546) - Validate storage class OpenCL environment rules for atomics (#2750) - Update OpControlBarriers rules for WebGPU (#2769) - Update OpMemoryBarriers rules for WebGPU (#2775) - Update WebGPU validation rules of OpAtomic*s (#2777) Fixes: - Disallow merge targeting block with OpLoopMerge (#2610) - Update vloadn and vstoren validation to match the OpenCL Extended Instruction Set Specification (#2599) - Update memory scope rules for WebGPU (#2725) - Allow LOD ops in compute shaders with derivative group execution modes (#2752) - Reduce Fixes: v2019.3 2019-05-14 - General: - Require Python 3 since Python 2 will out of service soon. - Add a continuous test that does memory checks using the address sanitizer. - Fix the build files so the SPIRV_USE_SANITIZER=address build works. - Packaging top of tree build artifacts again. - Added support for SPIR-V 1.4. (#2550) - Optimizer - Remove duplicates from list of interface IDs in OpEntryPoint instruction (#2449) - Bindless Validation: Descriptor Initialization Check (#2419) - Add option to validate after each pass (#2462) - Add legalization pass to fix mismatched pointer (#2430, #2535) - Add error messages when the input contains unknown instructions. (#2487) - Add pass to convert from WebGPU Spir-V to Vulkan Spir-V and back. (#2495) Fixes: - #2412: Dead memeber elimination should not change input and output variables. - #2405: Fix OpDot folding of half float vectors. - #2391: Dead branch elim should not fold away back edges. - #2441: Removing decorations when doing constant propagation. - #2455: Maintain inst to block mapping in merge return. - #2453: Fix merge return in the face of breaks. - #2456: Handle dead infinite loops in DCE. - #2458: Handle variable pointer in some optimizations. - #2452: Fix dead branch elimination to handle unreachable blocks better. - #2528: Fix undefined bit shift in sroa. - #2539: Change implementation of post order CFG traversal. - Validator - Add validation of storage classes for WebGPU (#2446) - Add validation for ExecutionMode in WebGPU (#2443) - Implement WebGPU specific CFG validation (#2386) - Allow NonWritable to target struct members. (#2420) - Allow storage type mismatch for parameter in relaxed addressing mode. - Allow non memory objects as parameter in relaxed addressing mode. - Disallow nested Blocks and buffer blocks (#2410). - Add validation for SPV_NV_cooperative_matrix (#2404) - Add --strip-atomic-counter-memory (#2413) - Check OpSampledImage is only passed into valid instructions (#2467) - Handle function decls in Structured CFG analysis (#2474) - Validate that OpUnreacahble is not statically reachable (#2473) - Add pass to generate needed initializers for WebGPU (#2481) - Allow images without format for OpenCL. (#2470) - Remove unreachable block validation (#2525) - Reduce runtime of array layout checks (#2534) - Add validation specific to OpExecutionModeId (#2536) - Validate sign of int types. (#2549) - VK_KHR_uniform_buffer_standard_layout validation (#2562) Fixes: - #2439: Add missing DepthGreater case to Fragment only check. - #2168: Disallow BufferBlock on StorageBuffer variables for Vulkan. - #2408: Restrict and Aliased decorations cannot be applied to the same id. - #2447: Improve function call parameter check. - Reduce - Add Pass to remove unreferenced blocks. (#2398) - Allows passing options to the validator. (#2401) - Improve reducer algorithm and other changes (#2472) - Add Pass to remove selections (#2485) - Add passes to simplify branches (#2507) Fixes: - #2478: fix loop to selection pass for loops with combined header/continue block v2019.2 2019-02-20 - General: - Support SPV_EXT_physical_storage_buffer - A number of memory leak have been fixed. - Removed use of deprecated Google test macro: - Changed the BUILD.gn to only build tests in Chromium. - Optimizer - Upgrade memory model improvments for modf and frexp. - Add a new pass to move loads closer to their uses: code sinking. - Invalidating the type manager now invalidates the constnat manager. - Expand instrumentation pass for bindless bounds checking to runtime-sized descriptor arrays. - Add a new pass that removes members from structs that are not used: dead member elimination. Fixes: - #2292: Remove undefined behaviour when folding bit shifts. - #2294: Fixes for instrumentation code. - #2293: Fix overflow when folding -INT_MIN. - #2374: Don't merge unreachable blocks when merging blocks. - Validator - Support SPV_KHR_no_integer_wrap and related decorations. - Validate Vulkan rules for OpTypeRuntimeArray. - Validate NonWritable decoration. - Many WebGPU specific validation rules were added. - Validate variable pointer related function call rules. - Better error messages. Fixes: - #2307: Check forwards references in OpTypeArray. - #2315, #2303: Fixed the layout check for relaxed layout. - #1628: Emit an error when an OpSwitch target is not an OpLabel. - Reduce - Added more documentation for spirv-reduce. - Add ability to remove OpPhi instructions. - Add ability to merge two basic blocks. - Add ability to remove unused functions and unused basic blocks. Fixes: 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 placeholder 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 . 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