[PATCH] D124871: Handle instrumentation of scalar single-precision (_ss) intrinsics
Nicolas Capens via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue May 3 13:20:48 PDT 2022
capn created this revision.
capn added reviewers: eugenis, vitalybuka.
Herald added subscribers: pengfei, hiraditya.
Herald added a project: All.
capn requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Instrumentation of scalar double-precision intrinsics such as
x86_sse41_round_sd was already handled by https://reviews.llvm.org/D82398,
but not their single-precision counterparts. Also rcpss and rsqrtss are
useful to support.
https://issuetracker.google.com/172238865
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D124871
Files:
llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -3202,27 +3202,39 @@
SOC.Done(&I);
}
- // Instrument _mm_*_sd intrinsics
- void handleUnarySdIntrinsic(IntrinsicInst &I) {
+ // Instrument _mm_*_sd|ss intrinsics
+ void handleUnarySdSsIntrinsic(IntrinsicInst &I) {
IRBuilder<> IRB(&I);
+ unsigned Width =
+ cast<FixedVectorType>(I.getArgOperand(0)->getType())->getNumElements();
Value *First = getShadow(&I, 0);
Value *Second = getShadow(&I, 1);
- // High word of first operand, low word of second
- Value *Shadow =
- IRB.CreateShuffleVector(First, Second, llvm::makeArrayRef<int>({2, 1}));
+ // First element of second operand, remaining elements of first operand
+ SmallVector<int, 16> Mask;
+ Mask.push_back(Width);
+ for (int i = 1; i < Width; i++) {
+ Mask.push_back(i);
+ }
+ Value *Shadow = IRB.CreateShuffleVector(First, Second, Mask);
setShadow(&I, Shadow);
setOriginForNaryOp(I);
}
- void handleBinarySdIntrinsic(IntrinsicInst &I) {
+ void handleBinarySdSsIntrinsic(IntrinsicInst &I) {
IRBuilder<> IRB(&I);
+ unsigned Width =
+ cast<FixedVectorType>(I.getArgOperand(0)->getType())->getNumElements();
Value *First = getShadow(&I, 0);
Value *Second = getShadow(&I, 1);
Value *OrShadow = IRB.CreateOr(First, Second);
- // High word of first operand, low word of both OR'd together
- Value *Shadow = IRB.CreateShuffleVector(First, OrShadow,
- llvm::makeArrayRef<int>({2, 1}));
+ // First element of both OR'd together, remaining elements of first operand
+ SmallVector<int, 16> Mask;
+ Mask.push_back(Width);
+ for (int i = 1; i < Width; i++) {
+ Mask.push_back(i);
+ }
+ Value *Shadow = IRB.CreateShuffleVector(First, OrShadow, Mask);
setShadow(&I, Shadow);
setOriginForNaryOp(I);
@@ -3497,11 +3509,16 @@
break;
case Intrinsic::x86_sse41_round_sd:
- handleUnarySdIntrinsic(I);
+ case Intrinsic::x86_sse41_round_ss:
+ case Intrinsic::x86_sse_rcp_ss:
+ case Intrinsic::x86_sse_rsqrt_ss:
+ handleUnarySdSsIntrinsic(I);
break;
case Intrinsic::x86_sse2_max_sd:
+ case Intrinsic::x86_sse_max_ss:
case Intrinsic::x86_sse2_min_sd:
- handleBinarySdIntrinsic(I);
+ case Intrinsic::x86_sse_min_ss:
+ handleBinarySdSsIntrinsic(I);
break;
case Intrinsic::fshl:
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124871.426812.patch
Type: text/x-patch
Size: 2646 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220503/e505b79d/attachment.bin>
More information about the llvm-commits
mailing list