mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-11-30 20:39:07 +08:00
40 lines
1.7 KiB
Diff
40 lines
1.7 KiB
Diff
|
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});
|
||
|
+}
|
||
|
|