[llvm] ef50227 - [NFCI][msan] Refactor into 'horizontalReduce' (#152961)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 11 15:48:23 PDT 2025
Author: Thurston Dang
Date: 2025-08-11T15:48:20-07:00
New Revision: ef5022745c93ed705c575492e4e2be4aca543363
URL: https://github.com/llvm/llvm-project/commit/ef5022745c93ed705c575492e4e2be4aca543363
DIFF: https://github.com/llvm/llvm-project/commit/ef5022745c93ed705c575492e4e2be4aca543363.diff
LOG: [NFCI][msan] Refactor into 'horizontalReduce' (#152961)
The functionality is used by two helper functions, and will be used even more in the future (e.g.,
https://github.com/llvm/llvm-project/pull/152941).
Added:
Modified:
llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 6e8138725375a..65528de8e7ac1 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -2690,6 +2690,54 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
SC.Done(&I);
}
+ // Perform a bitwise OR on the horizontal pairs (or other specified grouping)
+ // of elements.
+ //
+ // For example, suppose we have:
+ // VectorA: <a1, a2, a3, a4, a5, a6>
+ // VectorB: <b1, b2, b3, b4, b5, b6>
+ // ReductionFactor: 3.
+ // The output would be:
+ // <a1|a2|a3, a4|a5|a6, b1|b2|b3, b4|b5|b6>
+ //
+ // This is convenient for instrumenting horizontal add/sub.
+ // For bitwise OR on "vertical" pairs, see maybeHandleSimpleNomemIntrinsic().
+ Value *horizontalReduce(IntrinsicInst &I, unsigned ReductionFactor,
+ Value *VectorA, Value *VectorB) {
+ assert(isa<FixedVectorType>(VectorA->getType()));
+ unsigned TotalNumElems =
+ cast<FixedVectorType>(VectorA->getType())->getNumElements();
+
+ if (VectorB) {
+ assert(VectorA->getType() == VectorB->getType());
+ TotalNumElems = TotalNumElems * 2;
+ }
+
+ assert(TotalNumElems % ReductionFactor == 0);
+
+ Value *Or = nullptr;
+
+ IRBuilder<> IRB(&I);
+ for (unsigned i = 0; i < ReductionFactor; i++) {
+ SmallVector<int, 16> Mask;
+ for (unsigned X = 0; X < TotalNumElems; X += ReductionFactor)
+ Mask.push_back(X + i);
+
+ Value *Masked;
+ if (VectorB)
+ Masked = IRB.CreateShuffleVector(VectorA, VectorB, Mask);
+ else
+ Masked = IRB.CreateShuffleVector(VectorA, Mask);
+
+ if (Or)
+ Or = IRB.CreateOr(Or, Masked);
+ else
+ Or = Masked;
+ }
+
+ return Or;
+ }
+
/// Propagate shadow for 1- or 2-vector intrinsics that combine adjacent
/// fields.
///
@@ -2711,31 +2759,16 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
2 * ReturnType->getNumElements());
IRBuilder<> IRB(&I);
- unsigned Width = ParamType->getNumElements() * I.arg_size();
// Horizontal OR of shadow
- SmallVector<int, 8> EvenMask;
- SmallVector<int, 8> OddMask;
- for (unsigned X = 0; X < Width; X += 2) {
- EvenMask.push_back(X);
- OddMask.push_back(X + 1);
- }
-
Value *FirstArgShadow = getShadow(&I, 0);
- Value *EvenShadow;
- Value *OddShadow;
- if (I.arg_size() == 2) {
- Value *SecondArgShadow = getShadow(&I, 1);
- EvenShadow =
- IRB.CreateShuffleVector(FirstArgShadow, SecondArgShadow, EvenMask);
- OddShadow =
- IRB.CreateShuffleVector(FirstArgShadow, SecondArgShadow, OddMask);
- } else {
- EvenShadow = IRB.CreateShuffleVector(FirstArgShadow, EvenMask);
- OddShadow = IRB.CreateShuffleVector(FirstArgShadow, OddMask);
- }
+ Value *SecondArgShadow = nullptr;
+ if (I.arg_size() == 2)
+ SecondArgShadow = getShadow(&I, 1);
+
+ Value *OrShadow = horizontalReduce(I, /*ReductionFactor=*/2, FirstArgShadow,
+ SecondArgShadow);
- Value *OrShadow = IRB.CreateOr(EvenShadow, OddShadow);
OrShadow = CreateShadowCast(IRB, OrShadow, getShadowTy(&I));
setShadow(&I, OrShadow);
@@ -2768,23 +2801,14 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
IRBuilder<> IRB(&I);
- unsigned TotalNumElems = ParamType->getNumElements() * I.arg_size();
FixedVectorType *ReinterpretShadowTy = nullptr;
assert(isAligned(Align(ReinterpretElemWidth),
ParamType->getPrimitiveSizeInBits()));
ReinterpretShadowTy = FixedVectorType::get(
IRB.getIntNTy(ReinterpretElemWidth),
ParamType->getPrimitiveSizeInBits() / ReinterpretElemWidth);
- TotalNumElems = ReinterpretShadowTy->getNumElements() * I.arg_size();
// Horizontal OR of shadow
- SmallVector<int, 8> EvenMask;
- SmallVector<int, 8> OddMask;
- for (unsigned X = 0; X < TotalNumElems - 1; X += 2) {
- EvenMask.push_back(X);
- OddMask.push_back(X + 1);
- }
-
Value *FirstArgShadow = getShadow(&I, 0);
FirstArgShadow = IRB.CreateBitCast(FirstArgShadow, ReinterpretShadowTy);
@@ -2796,22 +2820,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
Align(2),
cast<FixedVectorType>(FirstArgShadow->getType())->getNumElements()));
- Value *EvenShadow;
- Value *OddShadow;
+ Value *SecondArgShadow = nullptr;
if (I.arg_size() == 2) {
- Value *SecondArgShadow = getShadow(&I, 1);
+ SecondArgShadow = getShadow(&I, 1);
SecondArgShadow = IRB.CreateBitCast(SecondArgShadow, ReinterpretShadowTy);
-
- EvenShadow =
- IRB.CreateShuffleVector(FirstArgShadow, SecondArgShadow, EvenMask);
- OddShadow =
- IRB.CreateShuffleVector(FirstArgShadow, SecondArgShadow, OddMask);
- } else {
- EvenShadow = IRB.CreateShuffleVector(FirstArgShadow, EvenMask);
- OddShadow = IRB.CreateShuffleVector(FirstArgShadow, OddMask);
}
- Value *OrShadow = IRB.CreateOr(EvenShadow, OddShadow);
+ Value *OrShadow = horizontalReduce(I, /*ReductionFactor=*/2, FirstArgShadow,
+ SecondArgShadow);
+
OrShadow = CreateShadowCast(IRB, OrShadow, getShadowTy(&I));
setShadow(&I, OrShadow);
@@ -3219,7 +3236,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
/// Caller guarantees that this intrinsic does not access memory.
///
/// TODO: "horizontal"/"pairwise" intrinsics are often incorrectly matched by
- /// by this handler.
+ /// by this handler. See horizontalReduce().
[[maybe_unused]] bool
maybeHandleSimpleNomemIntrinsic(IntrinsicInst &I,
unsigned int trailingFlags) {
More information about the llvm-commits
mailing list