================ @@ -3865,6 +3866,42 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> { setOriginForNaryOp(I); } + /// Handle Arm NEON vector store intrinsics (vst{2,3,4}). + /// + /// Arm NEON vector store intrinsics have the output address (pointer) as the + /// last argument, with the initial arguments being the inputs. They return + /// void. + void handleNEONVectorStoreIntrinsic(IntrinsicInst &I) { + IRBuilder<> IRB(&I); + + // Don't use getNumOperands() because it includes the callee + int numArgOperands = I.arg_size(); + assert(numArgOperands >= 1); + + // The last arg operand is the output + Value *Addr = I.getArgOperand(numArgOperands - 1); + if (ClCheckAccessAddress) + insertShadowCheck(Addr, &I); + + IntrinsicInst *ShadowI = cast<IntrinsicInst>(I.clone()); + for (int i = 0; i < numArgOperands - 1; i++) { ---------------- thurstond wrote:
I ended up making it a two-liner, to assert that the arg operand is a fixed vector type https://github.com/llvm/llvm-project/pull/99360 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits