[llvm] [msan] Eliminate non-deterministic behavior in the pass (PR #89831)
Vitaly Buka via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 23 14:09:53 PDT 2024
https://github.com/vitalybuka created https://github.com/llvm/llvm-project/pull/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.
>From 27feff5be62af687a94d338131a9779e6cfc507c Mon Sep 17 00:00:00 2001
From: Vitaly Buka <vitalybuka at google.com>
Date: Tue, 23 Apr 2024 14:09:40 -0700
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.4
---
.../Instrumentation/MemorySanitizer.cpp | 22 ++++++++++---------
1 file changed, 12 insertions(+), 10 deletions(-)
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 824cbee4eca578..bfa10baeb8697a 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -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,20 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
}
void materializeChecks() {
- llvm::stable_sort(InstrumentationList,
- [](const ShadowOriginAndInsertPoint &L,
- const ShadowOriginAndInsertPoint &R) {
- return L.OrigIns < R.OrigIns;
- });
+#ifndef NDEBUG
+ 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 atonce.
+ //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;
More information about the llvm-commits
mailing list