MSVC Backend Updates in Visual Studio 2019 version 16.9 Preview 3
In Visual Studio 2019 version 16.9 Preview 3 we have continued to improve the C++ backend with new features, new and improved optimizations, build throughput improvements, and better security. Here is a brief list of improvements for you to review.
- Address Sanitizer: The IDE integration for ASan-reported exceptions (vcasan.lib) now handles the complete collection of exceptions ASan can report. That vcasan lib is also found automatically, just like the other ASan libraries, when you throw /fsanitize=address. The compiler and linker also additionally will suggest emitting debug information if they detect you’re building with ASan but not emitting debug information. We’re excited to be able to share these user-model improvements in this latest preview! More details will be available in the upcoming full ASan documentation as 16.9 approaches the final release. Additional technical improvements include:
- Expanded RtlAllocateHeap support, fixed compatibility of RtlCreateHeap and RtlAllocateHeap interceptors with executable memory.
- Added ASan interceptor support for GlobalAlloc and LocalAlloc moveable memory.
- Updated handling of interception failures, added check for ASAN_WIN_CONTINUE_ON_INTERCEPTION_FAILURE environment variable to continue after interception failure.
- Updated error messages for shadow memory interleaving and interception failure to make problems and resolutions explicit.
- OpenMP targeting the LLVM runtime
- We’ve added the option to target the LLVM version of the OpenMP runtime. Target the new runtime by using the new CL switch /openmp:llvm instead of /openmp. In addition to all the OpenMP features supported with /openmp, /openmp:llvm adds support for the lastprivate clause on #pragma omp sections and unsigned index variables in parallel for loops. The /openmp:llvm switch is available only for the x64 target and is still experimental.
- Improved coroutine debugging support
- Maintain pre-coloring for arm64 (jump-threading)
- Fixed a code generation bug when compiling arm64 functions that return a large object with /O2. (linked customer feedback: Incorrect /O2 ARM64 function call codegen passing parameter, returning object (visualstudio.com))
- Swap order of loop fusion and vectorization
- Improved loop optimizer to apply loop fusion in many more cases.
- Remove unnecessary memory loads using the reg-mem variants of commutative x86 instructions
- Fix issue with /OPT:REF under LTCG
- Fixed an issue where a function referenced only by data (such as a vtable) could be incorrectly removed under /OPT:REF and LTCG in rare cases
- Incremental linking support for C++ Modules linkage
- Support for Intel Keylocker and User Interrupt instructions as well as intrinsic functions added in VC tools such as Compiler, MASM, and MSDIS
Do you want to experience the new improvements of the C++ backend? Please download the latest Visual Studio 2019 and give it a try! Any feedback is welcome. We can be reached via the comments below, Developer Community, email (email@example.com), and Twitter (@VisualC).
Could you reopen the bug? it’s still repro in 16.9 Preview 3
This issue will be fixed in 16.9 Preview 4.