@@ -6383,6 +6383,55 @@ void Verifier::visitIntrinsicCall(Intrinsic::ID ID, CallBase &Call) {
6383
6383
" llvm.amdgcn.s.prefetch.data only supports global or constant memory" );
6384
6384
break ;
6385
6385
}
6386
+ case Intrinsic::amdgcn_mfma_scale_f32_16x16x128_f8f6f4:
6387
+ case Intrinsic::amdgcn_mfma_scale_f32_32x32x64_f8f6f4: {
6388
+ Value *Src0 = Call.getArgOperand (0 );
6389
+ Value *Src1 = Call.getArgOperand (1 );
6390
+
6391
+ uint64_t CBSZ = cast<ConstantInt>(Call.getArgOperand (3 ))->getZExtValue ();
6392
+ uint64_t BLGP = cast<ConstantInt>(Call.getArgOperand (4 ))->getZExtValue ();
6393
+ Check (CBSZ <= 4 , " invalid value for cbsz format" , Call,
6394
+ Call.getArgOperand (3 ));
6395
+ Check (BLGP <= 4 , " invalid value for blgp format" , Call,
6396
+ Call.getArgOperand (4 ));
6397
+
6398
+ // AMDGPU::MFMAScaleFormats values
6399
+ auto getFormatNumRegs = [](unsigned FormatVal) {
6400
+ switch (FormatVal) {
6401
+ case 0 :
6402
+ case 1 :
6403
+ return 8u ;
6404
+ case 2 :
6405
+ case 3 :
6406
+ return 6u ;
6407
+ case 4 :
6408
+ return 4u ;
6409
+ default :
6410
+ llvm_unreachable (" invalid format value" );
6411
+ }
6412
+ };
6413
+
6414
+ auto isValidSrcASrcBVector = [](FixedVectorType *Ty) {
6415
+ if (!Ty || !Ty->getElementType ()->isIntegerTy (32 ))
6416
+ return false ;
6417
+ unsigned NumElts = Ty->getNumElements ();
6418
+ return NumElts == 4 || NumElts == 6 || NumElts == 8 ;
6419
+ };
6420
+
6421
+ auto *Src0Ty = dyn_cast<FixedVectorType>(Src0->getType ());
6422
+ auto *Src1Ty = dyn_cast<FixedVectorType>(Src1->getType ());
6423
+ Check (isValidSrcASrcBVector (Src0Ty),
6424
+ " operand 0 must be 4, 6 or 8 element i32 vector" , &Call, Src0);
6425
+ Check (isValidSrcASrcBVector (Src1Ty),
6426
+ " operand 1 must be 4, 6 or 8 element i32 vector" , &Call, Src1);
6427
+
6428
+ // Permit excess registers for the format.
6429
+ Check (Src0Ty->getNumElements () >= getFormatNumRegs (CBSZ),
6430
+ " invalid vector type for format" , &Call, Src0, Call.getArgOperand (3 ));
6431
+ Check (Src1Ty->getNumElements () >= getFormatNumRegs (BLGP),
6432
+ " invalid vector type for format" , &Call, Src1, Call.getArgOperand (5 ));
6433
+ break ;
6434
+ }
6386
6435
case Intrinsic::nvvm_setmaxnreg_inc_sync_aligned_u32:
6387
6436
case Intrinsic::nvvm_setmaxnreg_dec_sync_aligned_u32: {
6388
6437
Value *V = Call.getArgOperand (0 );
0 commit comments