September 9th, 2026
heart1 reaction

MSVC Build Tools Preview updates – September 2026

Software Engineering Manager

The MSVC Build Tools Preview is updated regularly with the latest features and fixes from the MSVC development team. This post covers updates from the past month, currently targeting the v14.52 release. This encompasses changes across the compiler frontend, backend, linker, standard library, and related tools.

Although you can acquire the MSVC Build Tools Preview through either the Visual Studio 2026 Stable Channel or Insiders Channel, Insiders gets MSVC Preview updates more quickly (roughly weekly).

To check whether it is installed, make sure one or both of these components are selected in the Visual Studio Installer:

  1. MSVC Build Tools for x64/x86 (Preview)
  2. MSVC Build Tools for ARM64/ARM64EC (Preview)

Follow the instructions at https://aka.ms/msvc/preview to configure your IDE and command prompts to use the MSVC Build Tools Preview.

The version number printed by cl.exe and link.exe will be at least 19.52.36725 / 14.52.36725.

We appreciate your feedback. Please report issues through Visual Studio Developer Community so we can address them before the toolset moves out of preview.

C++ Conformance and Frontend

  • Brought the C4815 and C4816 warnings (zero-sized arrays and by-value parameters that are copied) to the C compiler.
  • Improved diagnostics for preprocessor constant expressions, including better reporting of malformed and nested conditions.
  • Improved the source text shown in several diagnostics so the reported expression better matches what you wrote.
  • Fixed rejection of valid constexpr void* variables.
  • Unified the behavior of type traits when their preconditions are not satisfied.
  • Added validation of the symbols entered into function parameter scopes, catching malformed declarations earlier.
  • Fixed a compiler crash when computing the size of a dependent type in some Qt code patterns.
  • Fixed an internal compiler error triggered by a name lookup on an imported using-declaration that names an overload set.
  • Fixed an internal compiler error involving constraint failures in tuple-like structured bindings.
  • Fixed a missing access check when taking the address of a static member.
  • Fixed overload resolution failures (C2672) when passing certain reference wrappers.
  • Fixed a rare race condition in cl.exe when releasing intermediate buffers.
  • Fixed a spurious C4739 warning reported against compiler-generated temporaries.

C++ Modules

  • Fixed argument-dependent lookup of an unresolved template-id across a module boundary.
  • Fixed instantiation of a defaulted function when the instantiation crosses module units.
  • Preserved macro whitespace when building and consuming header units, so stringized macros round-trip correctly.
  • Improved handling of types first defined in the global module fragment.

Code Generation and Optimization

ARM64 improvements:

  • Added support for the FEAT_CSSC common short sequence compression instructions.
  • Added intrinsics for FEAT_FAMINMAX (floating-point absolute minimum/maximum).
  • Implemented the FEAT_LUT LUTI4 lookup-table instructions, and added bf16 support for the LUTI2 and LUTI4 intrinsics.
  • Recognized copysign as an inline intrinsic.
  • Hoisted loop-invariant SVE all-true predicates out of loop bodies.
  • Modeled condition flags for SVE compares and the MATCH/NMATCH and WHILE instruction families, enabling more flag reuse.
  • Fused a NEON-to-SVE bridge of an undefined vector into a single instruction, and improved register allocation preferences for bridge moves.
  • Added support for __preserve_none and [[msvc::musttail]].
  • Improved extraction of a 32-bit float from the upper half of a two-element vector.
  • Added more NEON by-element multiply patterns and better indirect-addressing support in the instruction selector.
  • Fixed ARM64X coroutine tail calls when Control Flow Guard is enabled.
  • Fixed an internal compiler error when emitting debug information for an unused constant parameter.
  • Fixed lowering of guest-reference imports for ARM64EC under LTCG.

x64 and x86 improvements:

  • Broad APX improvements: additional NDD (new data destination) instruction patterns and tuning for memory operand forms, conversion of NDD INC/DEC and SUB sequences into shorter LEA forms, extended shift, compare, and conditional-move optimizations, APX awareness in the constant-propagation lattice, and APX-aware loop unrolling and strength-reduction cost models.
  • Added conditional-compare (CFCMOV) optimizations.
  • Preferred the shorter LEA encoding over ADD where it is profitable.
  • Added AVX2 and AVX-512 memchr implementations and updated the memcpy selection for AMD processors.
  • Removed a redundant register copy before broadcasting a scalar double to a vector.
  • Fixed selection of horizontal add for 128-bit 32-bit-float reductions.
  • Improved the accuracy of shift-result range tracking by modeling the hardware shift-count mask.
  • Improved combining of adjacent vector stores for two-element double vectors.
  • Fixed vector register zeroing after block initialization sequences.
  • Fixed AVX-512 upper-register usage to follow the enclosing function’s architecture rather than the module’s.
  • Fixed non-deterministic code generation for floating-point and vector zero constants.
  • Removed the deprecated AMX TMMULTF32PS instruction.
  • Added fixed-register constraints for RDPRU.
  • Stopped re-aligning EVEX-encoded instructions in a way that could change encodings.
  • Improved code size when compiling with /O1 and /Os by running additional pre-allocation optimizations and adjusting instruction costs for size.

Optimizer improvements:

  • Enabled a new aliased copy-propagation pass, which also recognizes memset and memcpy and hoists loop-invariant aliased loads.
  • Improved the pre-vectorizer’s loop unswitching to handle nested loops, unblocking vectorization in more cases.
  • Recognized sub-accumulate reduction patterns in the vectorizer.
  • Improved vectorization of phi nodes in the superword-level parallelism pass.
  • Improved inlining heuristics: penalized inlining cold code into hot code.
  • Extended min/max canonicalization through single-use address copies.
  • Folded mixed-signedness compare-branch diamonds into a single compare.
  • Enabled common-subexpression elimination for vector element extraction.
  • Enabled tail-call optimization for indirect calls to noexcept functions.
  • Restored elision of static constant arrays.
  • Improved conditional-expression optimization when the compared value comes from a phi, and allowed more conditional-expression forms on x64.
  • Added an overflow check to predicate reasoning, and avoided merging conditional expressions whose comparisons differ in signedness.
  • Extended copy propagation with extended-basic-block analysis.
  • Improved compile time by avoiding repeated exception-handling region scans and by bounding dead-use searches that could hang x86 LTCG links.
  • Fixed a shrink-wrapping bug where register restores were chained to the wrong block.
  • Fixed a stack overflow caused by unbounded recursion while processing structured exception handling.
  • Fixed an internal compiler error involving non-COMDAT segments.
  • Fixed a use-after-free and a use-before-def in the SSA optimizer.
  • Fixed scalar replacement of aggregates for certain multi-byte types.
  • Prevented cross-module Just My Code marker collisions under LTCG.
  • Preserved loop-invariant dominance in the loop unroller, and fixed range inference for mutable symbols.
  • Fixed an incorrect simplification of unsigned shift-right of a multiplication.

Debug Information

  • Continued work to support debug-information streams up to 4 GB, including a refactoring of the underlying buffer layer and a new public stream API.
  • Added debug-record support for alternate object names, so tools can report the originating object file more accurately.
  • Fixed the mapping from declarations to definitions in emitted debug information.
  • Reported debug thread-pool startup failures as a diagnostic instead of terminating.
  • Reduced allocations in type-record processing, improving throughput on large programs.
  • Fixed a DIA stack overflow on cyclic type-index references when reading corrupt PDBs.
  • Fixed cross-PDB type-index cache contamination in the PDB server (mspdbsrv.exe).
  • Fixed object counting while reading a library in the object reader.
  • Added a switch to emit type aliases into debug records for improved debugging.
  • Rejected an unsupported DIA write-back API parameter value.
  • Retired writing of the obsolete minimal/fastlink PDB format.

Linker and Assembler

  • Named the metadata item responsible for LNK2022 and LNK4227, making mismatched metadata far easier to diagnose.
  • Improved error reporting from the assembler.
  • Disabled early-exit epilog sharing for the newer unwind format, correcting unwind behavior.
  • Fixed a crash when incrementally relinking a resource-only DLL.
  • Fixed incremental relink tracking of weak external symbols.
  • Fixed an access violation while emitting symbols for a discarded duplicate COMDAT.
  • Fixed a null-dereference (previously reported as LNK1000) when linking a COMDAT section with no symbols; it now produces the diagnostic LNK1143.
  • Fixed a link.exe /dump crash on a malformed debug directory, and a dumpilk /symbols crash on valid incremental-link files.
  • Fixed an access violation in dumpbin /UNWINDINFO on an out-of-range register value.
  • Hardened parsing of malformed object files, libraries, and C++ module metadata across the linker and its dump tools.

Static Analysis

  • Replaced several ad-hoc groupings of analysis warnings with a tag-based system, making rule sets easier to author.
  • Added names and descriptions to code-analysis warnings so SARIF viewers can display them.
  • Fixed ATL and MFC headers to build cleanly under stricter conformance settings, including replacing throw() with noexcept in atlcom.h and removing an ill-formed cast.
  • Removed an invalid typename before an unqualified template-id in the concurrency headers.

AddressSanitizer

  • Fixed an ARM64 correctness issue involving page writes and instruction handling.
  • Improved runtime performance by removing duplicated quarantine work.

Standard Library

Tickets Fixed

The following tickets reported through Developer Community have been fixed in this update:

Try Out the MSVC Build Tools Preview!

Please try out the MSVC Build Tools Preview and let us know what you think! Installation instructions:

  1. Download Visual Studio 2026 Insiders for frequent updates, or download Visual Studio 2026 for less frequent updates.
  2. Install the Desktop development with C++ workload and make sure one or both of these MSVC components are checked (depending on your target build architecture):
    • MSVC Build Tools for x64/x86 (Preview)
    • MSVC Build Tools for ARM64/ARM64EC (Preview)
  3. Follow the instructions on https://aka.ms/msvc/preview on configuring your IDE & command prompts to use the MSVC Build Tools Preview.
  4. Share your feedback with us on Visual Studio Developer Community.

Category

Author

Eric Brumer
Software Engineering Manager

Software engineering manager on the Visual C++ compiler back-end team. I lead the machine-independent optimization team, as well as code generation security, including sanitizers.

0 comments