[msan] Eliminate non-deterministic behavior in the pass (#89831)

Almost NFC, instrumentation is as correct as it was before.

We need InstrumentationList grouped by origin instruction,
so we used stable_sort. However these objects already grouped
because we never interleave sequences of `insertShadowCheck`
of different instrunction.

Pointer sort has artifact that it was deppendent on allocator behavior,
so we could inserted checks in a different order.

There is no test, as I failed to reproduce this with `opt`. My guess
is that for reproducer we need to increase fragmentation in the
allocator.
This commit is contained in:
Vitaly Buka 2024-04-23 16:19:47 -07:00 committed by GitHub
parent 688c10d236
commit 4f4ebee10e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -152,6 +152,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DepthFirstIterator.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
@ -1464,19 +1465,21 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
}
void materializeChecks() {
llvm::stable_sort(InstrumentationList,
[](const ShadowOriginAndInsertPoint &L,
const ShadowOriginAndInsertPoint &R) {
return L.OrigIns < R.OrigIns;
});
#ifndef NDEBUG
// For assert below.
SmallPtrSet<Instruction *, 16> Done;
#endif
for (auto I = InstrumentationList.begin();
I != InstrumentationList.end();) {
auto J =
std::find_if(I + 1, InstrumentationList.end(),
[L = I->OrigIns](const ShadowOriginAndInsertPoint &R) {
return L != R.OrigIns;
});
auto OrigIns = I->OrigIns;
// Checks are grouped by the original instruction. We call all
// `insertShadowCheck` for an instruction at once.
assert(Done.insert(OrigIns).second);
auto J = std::find_if(I + 1, InstrumentationList.end(),
[OrigIns](const ShadowOriginAndInsertPoint &R) {
return OrigIns != R.OrigIns;
});
// Process all checks of instruction at once.
materializeInstructionChecks(ArrayRef<ShadowOriginAndInsertPoint>(I, J));
I = J;