--- /dev/null
+diff --git a/llvm/lib/CodeGen/GlobalISel/LegalityPredicates.cpp b/llvm/lib/CodeGen/GlobalISel/LegalityPredicates.cpp
+--- a/llvm/lib/CodeGen/GlobalISel/LegalityPredicates.cpp
++++ b/llvm/lib/CodeGen/GlobalISel/LegalityPredicates.cpp
+@@ -10,6 +10,17 @@
+ //
+ //===----------------------------------------------------------------------===//
+
++// Disable optimizations to work around MSVC debug mode bug in 32-bit:
++// https://developercommunity.visualstudio.com/content/problem/1179643/msvc-copies-overaligned-non-trivially-copyable-par.html
++// FIXME: Remove this when the issue is closed.
++#if defined(_MSC_VER) && !defined(__clang__) && defined(_M_IX86)
++// We have to disable runtime checks in order to enable optimizations. This is
++// done for the entire file because the problem is actually observed in STL
++// template functions.
++#pragma runtime_checks("", off)
++#pragma optimize("gs", on)
++#endif
++
+ #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h"
+
+ using namespace llvm;
+diff --git a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+--- a/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
++++ b/llvm/unittests/CodeGen/GlobalISel/LegalizerInfoTest.cpp
+@@ -406,3 +406,13 @@
+ 32, 8, AtomicOrdering::NotAtomic }));
+ }
+ }
++
++// This code sequence doesn't do anything, but it covers a previously uncovered
++// codepath that used to crash in MSVC x86_32 debug mode.
++TEST(LegalizerInfoTest, MSVCDebugMiscompile) {
++ const LLT S1 = LLT::scalar(1);
++ const LLT P0 = LLT::pointer(0, 32);
++ LegalizerInfo LI;
++ auto Builder = LI.getActionDefinitionsBuilder(TargetOpcode::G_PTRTOINT);
++ (void)Builder.legalForCartesianProduct({S1}, {P0});
++}
+