Skip to content

Commit f360ff0

Browse files
committed
[msan] Add handleIntrinsicByApplyingToShadow and support NEON tbl intrinsics
This adds a general function that handles intrinsics by applying the intrinsic to the shadows, and applies it to the specific case of Arm NEON TBL intrinsics. This also updates the tests from #114462
1 parent 51a4f31 commit f360ff0

File tree

3 files changed

+1333
-237
lines changed

3 files changed

+1333
-237
lines changed

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3944,6 +3944,30 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
39443944
}
39453945
}
39463946

3947+
/// Handle intrinsics by applying the intrinsic to the shadows.
3948+
/// The origin is approximated using setOriginForNaryOp.
3949+
///
3950+
/// For example, this can be applied to the Arm NEON vector table intrinsics
3951+
/// (tbl{1,2,3,4}).
3952+
void handleIntrinsicByApplyingToShadow(IntrinsicInst &I, unsigned int numArgOperands) {
3953+
IRBuilder<> IRB(&I);
3954+
3955+
// Don't use getNumOperands() because it includes the callee
3956+
assert (numArgOperands == I.arg_size());
3957+
3958+
SmallVector<Value *, 8> ShadowArgs;
3959+
for (unsigned int i = 0; i < numArgOperands; i++) {
3960+
Value *Shadow = getShadow(&I, i);
3961+
ShadowArgs.append(1, Shadow);
3962+
}
3963+
3964+
CallInst *CI =
3965+
IRB.CreateIntrinsic(I.getType(), I.getIntrinsicID(), ShadowArgs);
3966+
setShadow(&I, CI);
3967+
3968+
setOriginForNaryOp(I);
3969+
}
3970+
39473971
void visitIntrinsicInst(IntrinsicInst &I) {
39483972
switch (I.getIntrinsicID()) {
39493973
case Intrinsic::uadd_with_overflow:
@@ -4319,6 +4343,25 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
43194343
break;
43204344
}
43214345

4346+
// Arm NEON vector table intrinsics have the source/table register(s),
4347+
// followed by the index register. They return the output.
4348+
case Intrinsic::aarch64_neon_tbl1: {
4349+
handleIntrinsicByApplyingToShadow(I, 2);
4350+
break;
4351+
}
4352+
case Intrinsic::aarch64_neon_tbl2: {
4353+
handleIntrinsicByApplyingToShadow(I, 3);
4354+
break;
4355+
}
4356+
case Intrinsic::aarch64_neon_tbl3: {
4357+
handleIntrinsicByApplyingToShadow(I, 4);
4358+
break;
4359+
}
4360+
case Intrinsic::aarch64_neon_tbl4: {
4361+
handleIntrinsicByApplyingToShadow(I, 5);
4362+
break;
4363+
}
4364+
43224365
default:
43234366
if (!handleUnknownIntrinsic(I))
43244367
visitInstruction(I);

0 commit comments

Comments
 (0)