@@ -508,17 +508,17 @@ class GenXKernelBuilder {
508
508
VISA_VectorOpnd *createDestination (Value *Dest,
509
509
genx::Signedness Signed,
510
510
unsigned *Offset = nullptr );
511
- VISA_VectorOpnd *createSourceOperand (Instruction *Inst,
512
- genx::Signedness Signed,
513
- unsigned OperandNum, genx::BaleInfo BI,
514
- unsigned Mod = 0 ,
515
- genx::Signedness *SignedRes = nullptr ,
516
- unsigned MaxWidth = 16 );
511
+ VISA_VectorOpnd *
512
+ createSourceOperand (Instruction *Inst, genx::Signedness Signed,
513
+ unsigned OperandNum, genx::BaleInfo BI, unsigned Mod = 0 ,
514
+ genx::Signedness *SignedRes = nullptr ,
515
+ unsigned MaxWidth = 16 , bool IsNullAllowed = false );
517
516
VISA_VectorOpnd *createSource (Value *V, genx::Signedness Signed, bool Baled,
518
517
unsigned Mod = 0 ,
519
518
genx::Signedness *SignedRes = nullptr ,
520
519
unsigned MaxWidth = 16 ,
521
- unsigned *Offset = nullptr , bool IsBF = false );
520
+ unsigned *Offset = nullptr , bool IsBF = false ,
521
+ bool IsNullAllowed = false );
522
522
VISA_VectorOpnd *createSource (Value *V, genx::Signedness Signed,
523
523
unsigned MaxWidth = 16 ,
524
524
unsigned *Offset = nullptr );
@@ -1718,15 +1718,17 @@ GenXKernelBuilder::createDestination(Value *Dest, genx::Signedness Signed,
1718
1718
}
1719
1719
}
1720
1720
1721
- VISA_VectorOpnd *GenXKernelBuilder::createSourceOperand (
1722
- Instruction *Inst, Signedness Signed, unsigned OperandNum,
1723
- genx::BaleInfo BI, unsigned Mod, Signedness *SignedRes, unsigned MaxWidth) {
1721
+ VISA_VectorOpnd *
1722
+ GenXKernelBuilder::createSourceOperand (Instruction *Inst, Signedness Signed,
1723
+ unsigned OperandNum, genx::BaleInfo BI,
1724
+ unsigned Mod, Signedness *SignedRes,
1725
+ unsigned MaxWidth, bool IsNullAllowed) {
1724
1726
Value *V = Inst->getOperand (OperandNum);
1725
1727
auto IID = vc::InternalIntrinsic::getInternalIntrinsicID (Inst);
1726
1728
bool IsBF = IID == vc::InternalIntrinsic::cast_from_bf16;
1727
1729
1728
1730
return createSource (V, Signed, BI.isOperandBaled (OperandNum), Mod, SignedRes,
1729
- MaxWidth, nullptr , IsBF);
1731
+ MaxWidth, nullptr , IsBF, IsNullAllowed );
1730
1732
}
1731
1733
1732
1734
VISA_PredOpnd *
@@ -2000,14 +2002,29 @@ VISA_VectorOpnd *GenXKernelBuilder::createSource(Value *V, Signedness Signed,
2000
2002
bool Baled, unsigned Mod,
2001
2003
Signedness *SignedRes,
2002
2004
unsigned MaxWidth,
2003
- unsigned *Offset, bool IsBF) {
2005
+ unsigned *Offset, bool IsBF,
2006
+ bool IsNullAllowed) {
2004
2007
LLVM_DEBUG (dbgs () << " createSource for " << (Baled ? " baled" : " non-baled" )
2005
2008
<< (IsBF ? " brain" : " non-brain" ) << " value: " );
2006
2009
LLVM_DEBUG (V->dump ());
2007
2010
LLVM_DEBUG (dbgs () << " \n " );
2008
2011
if (SignedRes)
2009
2012
*SignedRes = Signed;
2010
- if (auto C = dyn_cast<Constant>(V)) {
2013
+ // Null register is required
2014
+ if (IsNullAllowed && isa<UndefValue>(V)) {
2015
+ Region R (V);
2016
+ if (Offset)
2017
+ R.Offset = *Offset;
2018
+ if (R.NumElements == 1 )
2019
+ R.VStride = R.Stride = 0 ;
2020
+
2021
+ VISA_GenVar *NullDecl = nullptr ;
2022
+ CISA_CALL (Kernel->GetPredefinedVar (NullDecl, PREDEFINED_NULL));
2023
+
2024
+ return createRegionOperand (&R, NullDecl, Signed, Mod, false /* IsDst*/ ,
2025
+ MaxWidth);
2026
+ }
2027
+ if (auto *C = dyn_cast<Constant>(V)) {
2011
2028
if (Mod) {
2012
2029
// Need to negate constant.
2013
2030
IGC_ASSERT_MESSAGE (Mod == MODIFIER_NEG, " unexpected modifier" );
@@ -3387,8 +3404,9 @@ void GenXKernelBuilder::buildIntrinsic(CallInst *CI, unsigned IntrinID,
3387
3404
MaxWidth =
3388
3405
cast<IGCLLVM::FixedVectorType>(CI->getType ())->getNumElements ();
3389
3406
}
3390
- ResultOperand = createSourceOperand (CI, Signed, AI.getArgIdx (), BI, 0 ,
3391
- nullptr , MaxWidth);
3407
+ ResultOperand =
3408
+ createSourceOperand (CI, Signed, AI.getArgIdx (), BI, 0 , nullptr ,
3409
+ MaxWidth, AI.generalNullAllowed ());
3392
3410
}
3393
3411
return ResultOperand;
3394
3412
};
0 commit comments