mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
Use pragmas to work around MSVC x86_32 debug miscompile bug
Halide users reported this here: https://llvm.org/pr46176 I reported the issue to MSVC here: https://developercommunity.visualstudio.com/content/problem/1179643/msvc-copies-overaligned-non-trivially-copyable-par.html This codepath is apparently not covered by LLVM's unit tests, so I added coverage in a unit test. If we want to support this configuration going forward, it means that is in general not safe to pass a SmallVector<T, N> by value if alignof(T) is greater than 4. This doesn't appear to come up often because passing a SmallVector by value is inefficient and not idiomatic: it copies the inline storage. In this case, the SmallVector<LLT,4> is captured by value by a lambda, and the lambda is passed by value into std::function, and that's how we hit the bug. Differential Revision: https://reviews.llvm.org/D87475
This commit is contained in:
parent
710443d7ab
commit
e88b0fafb4
@ -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;
|
||||
|
@ -406,3 +406,13 @@ TEST(LegalizerInfoTest, MMOAlignment) {
|
||||
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});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user