diff options
| author | Thurston Dang <thurston@google.com> | 2024-07-03 12:40:12 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-07-03 12:40:12 -0700 |
| commit | 7002ecb4c6dba2050b321699e0e17eb890c3ca2c (patch) | |
| tree | 543baf0193b617998cb44413b1f4a6b4e6a575c6 /llvm/lib/Transforms | |
| parent | c02e8f762a410e55581866c43636efcd6504c1bd (diff) | |
| download | llvm-7002ecb4c6dba2050b321699e0e17eb890c3ca2c.zip llvm-7002ecb4c6dba2050b321699e0e17eb890c3ca2c.tar.gz llvm-7002ecb4c6dba2050b321699e0e17eb890c3ca2c.tar.bz2 | |
[msan] Convert vector shadow to scalar before zext (#96722)
zext does not allow converting vector shadow to scalar, so we must
manually convert it prior to calling zext in materializeOneCheck, for
which the 'ConvertedShadow' parameter isn't actually guaranteed to be
scalar (1). Note that it is safe/no-op to call convertShadowToScalar on
a shadow that is already scalar.
In contrast, the storeOrigin function already converts the (potentially
vector) shadow to scalar; we add a comment to note why it is load
bearing.
(1) In materializeInstructionChecks():
"// Disable combining in some cases. TrackOrigins checks each shadow to
pick
// correct origin.
bool Combine = !MS.TrackOrigins;
...
if (!Combine) {
materializeOneCheck(IRB, ConvertedShadow, ShadowData.Origin);
continue;
}"
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index d0dbb10..c7d41f6 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -1283,6 +1283,7 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { const DataLayout &DL = F.getDataLayout(); const Align OriginAlignment = std::max(kMinOriginAlignment, Alignment); TypeSize StoreSize = DL.getTypeStoreSize(Shadow->getType()); + // ZExt cannot convert between vector and scalar Value *ConvertedShadow = convertShadowToScalar(Shadow, IRB); if (auto *ConstantShadow = dyn_cast<Constant>(ConvertedShadow)) { if (!ClCheckConstantShadow || ConstantShadow->isZeroValue()) { @@ -1398,6 +1399,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { if (instrumentWithCalls(ConvertedShadow) && SizeIndex < kNumberOfAccessSizes && !MS.CompileKernel) { FunctionCallee Fn = MS.MaybeWarningFn[SizeIndex]; + // ZExt cannot convert between vector and scalar + ConvertedShadow = convertShadowToScalar(ConvertedShadow, IRB); Value *ConvertedShadow2 = IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex))); CallBase *CB = IRB.CreateCall( |
