@@ -557,6 +557,7 @@ class GenXKernelBuilder {
557557 VISABuilder *CisaBuilder = nullptr ;
558558
559559private:
560+ bool allowI64Ops () const ;
560561 void collectKernelInfo ();
561562 void buildVariables ();
562563 void buildInstructions ();
@@ -3038,6 +3039,13 @@ void GenXKernelBuilder::AddGenVar(Register &Reg) {
30383039 (void *)(Attr.second .c_str ())));
30393040 }
30403041}
3042+
3043+ bool GenXKernelBuilder::allowI64Ops () const {
3044+ IGC_ASSERT (Subtarget);
3045+ if (!Subtarget->hasLongLong ())
3046+ return false ;
3047+ return true ;
3048+ }
30413049/* *************************************************************************************************
30423050 * Scan ir to collect information about whether kernel has callable function or
30433051 * barrier.
@@ -4493,7 +4501,7 @@ void GenXKernelBuilder::buildAlloca(CallInst *CI, unsigned IntrinID,
44934501 LLVM_DEBUG (dbgs () << " Building alloca " << *CI << " \n " );
44944502 VISA_GenVar *Sp = nullptr ;
44954503 CISA_CALL (Kernel->GetPredefinedVar (Sp, PreDefined_Vars::PREDEFINED_FE_SP));
4496- if (!Subtarget-> hasLongLong ())
4504+ if (!allowI64Ops ())
44974505 CISA_CALL (Kernel->CreateVISAGenVar (Sp, " Sp" , 1 , ISA_TYPE_UD, ALIGN_DWORD, Sp));
44984506
44994507 Value *AllocaOff = CI->getOperand (0 );
@@ -5539,7 +5547,7 @@ void GenXKernelBuilder::beginFunction(Function *Func) {
55395547 CISA_CALL (Kernel->GetPredefinedVar (Sp, PREDEFINED_FE_SP));
55405548 CISA_CALL (Kernel->GetPredefinedVar (Fp, PREDEFINED_FE_FP));
55415549 // TODO: consider removing the if for local stack
5542- if (!Subtarget-> hasLongLong ()) {
5550+ if (!allowI64Ops ()) {
55435551 CISA_CALL (Kernel->CreateVISAGenVar (Sp, " Sp" , 1 , ISA_TYPE_UD, ALIGN_DWORD, Sp));
55445552 CISA_CALL (Kernel->CreateVISAGenVar (Fp, " Fp" , 1 , ISA_TYPE_UD, ALIGN_DWORD, Fp));
55455553 }
@@ -5587,9 +5595,9 @@ void GenXKernelBuilder::beginFunction(Function *Func) {
55875595 EXEC_SIZE_1, SpOpDst, HwtidOp, Imm));
55885596 } else {
55895597 VISA_GenVar *Tmp = nullptr ;
5598+
55905599 CISA_CALL (Kernel->CreateVISAGenVar (
5591- Tmp, " SpOff" , 1 , Subtarget->hasLongLong () ? ISA_TYPE_UQ : ISA_TYPE_UD,
5592- ALIGN_DWORD));
5600+ Tmp, " SpOff" , 1 , allowI64Ops () ? ISA_TYPE_UQ : ISA_TYPE_UD, ALIGN_DWORD));
55935601
55945602 VISA_VectorOpnd *OffOpDst = nullptr ;
55955603 VISA_VectorOpnd *OffOpSrc = nullptr ;
@@ -6055,10 +6063,14 @@ void GenXKernelBuilder::buildStackCall(CallInst *CI,
60556063 Kernel->CreateVISASrcOperand (SpOpSrc, Sp, MODIFIER_NONE, 0 , 1 , 0 , 0 , 0 ));
60566064 CISA_CALL (Kernel->CreateVISADstOperand (SpOpDst, Sp, 1 , 0 , 0 ));
60576065 uint64_t OffVal = -StackRetSz;
6058- CISA_CALL (Kernel->CreateVISAImmediate (Imm, &OffVal, ISA_TYPE_UQ));
6059- CISA_CALL (Kernel->AppendVISAArithmeticInst (
6066+ IGC_ASSERT (OffVal <= std::numeric_limits<uint32_t >::max ());
6067+
6068+ if (OffVal) {
6069+ CISA_CALL (Kernel->CreateVISAImmediate (Imm, &OffVal, ISA_TYPE_UD));
6070+ CISA_CALL (Kernel->AppendVISAArithmeticInst (
60606071 ISA_ADD, nullptr , false , (NoMask ? vISA_EMASK_M1_NM : vISA_EMASK_M1),
60616072 EXEC_SIZE_1, SpOpDst, SpOpSrc, Imm));
6073+ }
60626074}
60636075
60646076namespace {
0 commit comments