@@ -4173,7 +4173,15 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
4173
4173
4174
4174
// Instrument AVX permutation intrinsic.
4175
4175
// We apply the same permutation (argument index 1) to the shadow.
4176
- void handleAVXVpermilvar (IntrinsicInst &I) {
4176
+ void handleAVXPermutation (IntrinsicInst &I) {
4177
+ assert (I.arg_size () == 2 );
4178
+ assert (isa<FixedVectorType>(I.getArgOperand (0 )->getType ()));
4179
+ assert (isa<FixedVectorType>(I.getArgOperand (1 )->getType ()));
4180
+ [[maybe_unused]] auto ArgVectorSize =
4181
+ cast<FixedVectorType>(I.getArgOperand (0 )->getType ())->getNumElements ();
4182
+ assert (cast<FixedVectorType>(I.getArgOperand (1 )->getType ())
4183
+ ->getNumElements () == ArgVectorSize);
4184
+ assert (I.getType () == I.getArgOperand (0 )->getType ());
4177
4185
IRBuilder<> IRB (&I);
4178
4186
Value *Shadow = getShadow (&I, 0 );
4179
4187
insertShadowCheck (I.getArgOperand (1 ), &I);
@@ -4187,6 +4195,38 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
4187
4195
setShadow (&I, IRB.CreateBitCast (CI, getShadowTy (&I)));
4188
4196
setOriginForNaryOp (I);
4189
4197
}
4198
+ // Instrument AVX permutation intrinsic.
4199
+ // We apply the same permutation (argument index 1) to the shadows.
4200
+ void handleAVXVpermil2var (IntrinsicInst &I) {
4201
+ assert (I.arg_size () == 3 );
4202
+ assert (isa<FixedVectorType>(I.getArgOperand (0 )->getType ()));
4203
+ assert (isa<FixedVectorType>(I.getArgOperand (1 )->getType ()));
4204
+ assert (isa<FixedVectorType>(I.getArgOperand (2 )->getType ()));
4205
+ [[maybe_unused]] auto ArgVectorSize =
4206
+ cast<FixedVectorType>(I.getArgOperand (0 )->getType ())->getNumElements ();
4207
+ assert (cast<FixedVectorType>(I.getArgOperand (1 )->getType ())
4208
+ ->getNumElements () == ArgVectorSize);
4209
+ assert (cast<FixedVectorType>(I.getArgOperand (2 )->getType ())
4210
+ ->getNumElements () == ArgVectorSize);
4211
+ assert (I.getArgOperand (0 )->getType () == I.getArgOperand (2 )->getType ());
4212
+ assert (I.getType () == I.getArgOperand (0 )->getType ());
4213
+ assert (I.getArgOperand (1 )->getType ()->isIntOrIntVectorTy ());
4214
+ IRBuilder<> IRB (&I);
4215
+ Value *AShadow = getShadow (&I, 0 );
4216
+ Value *Idx = I.getArgOperand (1 );
4217
+ Value *BShadow = getShadow (&I, 2 );
4218
+ insertShadowCheck (Idx, &I);
4219
+
4220
+ // Shadows are integer-ish types but some intrinsics require a
4221
+ // different (e.g., floating-point) type.
4222
+ AShadow = IRB.CreateBitCast (AShadow, I.getArgOperand (0 )->getType ());
4223
+ BShadow = IRB.CreateBitCast (BShadow, I.getArgOperand (2 )->getType ());
4224
+ CallInst *CI = IRB.CreateIntrinsic (I.getType (), I.getIntrinsicID (),
4225
+ {AShadow, Idx, BShadow});
4226
+
4227
+ setShadow (&I, IRB.CreateBitCast (CI, getShadowTy (&I)));
4228
+ setOriginForNaryOp (I);
4229
+ }
4190
4230
4191
4231
// Instrument BMI / BMI2 intrinsics.
4192
4232
// All of these intrinsics are Z = I(X, Y)
@@ -5132,16 +5172,52 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
5132
5172
assert (Success);
5133
5173
break ;
5134
5174
}
5135
-
5175
+ case Intrinsic::x86_avx2_permd:
5176
+ case Intrinsic::x86_avx2_permps:
5177
+ case Intrinsic::x86_ssse3_pshuf_b_128:
5178
+ case Intrinsic::x86_avx2_pshuf_b:
5179
+ case Intrinsic::x86_avx512_pshuf_b_512:
5180
+ case Intrinsic::x86_avx512_permvar_df_256:
5181
+ case Intrinsic::x86_avx512_permvar_df_512:
5182
+ case Intrinsic::x86_avx512_permvar_di_256:
5183
+ case Intrinsic::x86_avx512_permvar_di_512:
5184
+ case Intrinsic::x86_avx512_permvar_hi_128:
5185
+ case Intrinsic::x86_avx512_permvar_hi_256:
5186
+ case Intrinsic::x86_avx512_permvar_hi_512:
5187
+ case Intrinsic::x86_avx512_permvar_qi_128:
5188
+ case Intrinsic::x86_avx512_permvar_qi_256:
5189
+ case Intrinsic::x86_avx512_permvar_qi_512:
5190
+ case Intrinsic::x86_avx512_permvar_sf_512:
5191
+ case Intrinsic::x86_avx512_permvar_si_512:
5136
5192
case Intrinsic::x86_avx_vpermilvar_pd:
5137
5193
case Intrinsic::x86_avx_vpermilvar_pd_256:
5138
5194
case Intrinsic::x86_avx512_vpermilvar_pd_512:
5139
5195
case Intrinsic::x86_avx_vpermilvar_ps:
5140
5196
case Intrinsic::x86_avx_vpermilvar_ps_256:
5141
5197
case Intrinsic::x86_avx512_vpermilvar_ps_512: {
5142
- handleAVXVpermilvar (I);
5198
+ handleAVXPermutation (I);
5143
5199
break ;
5144
5200
}
5201
+ case Intrinsic::x86_avx512_vpermi2var_d_128:
5202
+ case Intrinsic::x86_avx512_vpermi2var_d_256:
5203
+ case Intrinsic::x86_avx512_vpermi2var_d_512:
5204
+ case Intrinsic::x86_avx512_vpermi2var_hi_128:
5205
+ case Intrinsic::x86_avx512_vpermi2var_hi_256:
5206
+ case Intrinsic::x86_avx512_vpermi2var_hi_512:
5207
+ case Intrinsic::x86_avx512_vpermi2var_pd_128:
5208
+ case Intrinsic::x86_avx512_vpermi2var_pd_256:
5209
+ case Intrinsic::x86_avx512_vpermi2var_pd_512:
5210
+ case Intrinsic::x86_avx512_vpermi2var_ps_128:
5211
+ case Intrinsic::x86_avx512_vpermi2var_ps_256:
5212
+ case Intrinsic::x86_avx512_vpermi2var_ps_512:
5213
+ case Intrinsic::x86_avx512_vpermi2var_q_128:
5214
+ case Intrinsic::x86_avx512_vpermi2var_q_256:
5215
+ case Intrinsic::x86_avx512_vpermi2var_q_512:
5216
+ case Intrinsic::x86_avx512_vpermi2var_qi_128:
5217
+ case Intrinsic::x86_avx512_vpermi2var_qi_256:
5218
+ case Intrinsic::x86_avx512_vpermi2var_qi_512:
5219
+ handleAVXVpermil2var (I);
5220
+ break ;
5145
5221
5146
5222
case Intrinsic::x86_avx512fp16_mask_add_sh_round:
5147
5223
case Intrinsic::x86_avx512fp16_mask_sub_sh_round:
0 commit comments