@@ -260,6 +260,7 @@ class GenXLowering : public FunctionPass {
260
260
bool lowerStackRestore (CallInst *CI);
261
261
bool lowerHardwareThreadID (CallInst *CI);
262
262
bool lowerLogicalThreadID (CallInst *CI);
263
+ bool lowerNamedBarrierArrive (CallInst *CI);
263
264
264
265
Value *swapLowHighHalves (IRBuilder<> &Builder, Value *Arg) const ;
265
266
bool lowerByteSwap (CallInst *CI);
@@ -2170,6 +2171,8 @@ bool GenXLowering::processInst(Instruction *Inst) {
2170
2171
return lowerHardwareThreadID (CI);
2171
2172
case vc::InternalIntrinsic::logical_thread_id:
2172
2173
return lowerLogicalThreadID (CI);
2174
+ case GenXIntrinsic::genx_nbarrier_arrive:
2175
+ return lowerNamedBarrierArrive (CI);
2173
2176
}
2174
2177
return false ;
2175
2178
}
@@ -4778,6 +4781,59 @@ bool GenXLowering::lowerLogicalThreadID(CallInst *CI) {
4778
4781
return true ;
4779
4782
}
4780
4783
4784
+ bool GenXLowering::lowerNamedBarrierArrive (CallInst *CI) {
4785
+ IGC_ASSERT (vc::getAnyIntrinsicID (CI) == GenXIntrinsic::genx_nbarrier_arrive);
4786
+ if (!ST->hasNBarrier ()) {
4787
+ CI->getContext ().emitError (CI, " Named barriers are not suppported by " +
4788
+ ST->getCPU ());
4789
+ return false ;
4790
+ }
4791
+
4792
+ Module *M = CI->getModule ();
4793
+ IRBuilder<> Builder (CI);
4794
+
4795
+ const unsigned Width = ST->getGRFByteSize () / DWordBytes;
4796
+ auto *Int32Ty = Builder.getInt32Ty ();
4797
+ auto *PayloadTy = IGCLLVM::FixedVectorType::get (Int32Ty, Width);
4798
+ auto *UndefV = UndefValue::get (PayloadTy);
4799
+
4800
+ // Prepare named barrier message payload as follows:
4801
+ // payload[2][31:24]: number of consumers
4802
+ // payload[2][23:16]: number of producers
4803
+ // payload[2][15:14]: thread role
4804
+ // payload[2][4:0]: barrier id
4805
+ auto *BarrierId = Builder.CreateZExt (CI->getArgOperand (0 ), Int32Ty);
4806
+ auto *Role = Builder.CreateZExt (CI->getArgOperand (1 ), Int32Ty);
4807
+ auto *NumProducers = Builder.CreateZExt (CI->getArgOperand (2 ), Int32Ty);
4808
+ auto *NumConsumers = Builder.CreateZExt (CI->getArgOperand (3 ), Int32Ty);
4809
+
4810
+ auto *Payload = Builder.CreateAdd (BarrierId, Builder.CreateShl (Role, 14 ));
4811
+ Payload = Builder.CreateAdd (Payload, Builder.CreateShl (NumProducers, 16 ));
4812
+ Payload = Builder.CreateAdd (Payload, Builder.CreateShl (NumConsumers, 24 ));
4813
+
4814
+ Payload = Builder.CreateInsertElement (UndefV, Payload, 2 );
4815
+
4816
+ SmallVector<Value *, 8 > Args = {
4817
+ Builder.getInt8 (0 ), // modifier (none)
4818
+ Builder.getInt8 (0 ), // log2(exec size)
4819
+ Builder.getTrue (), // predicate
4820
+ Builder.getInt8 (1 ), // number of source registers
4821
+ Builder.getInt8 (3 ), // Gateway
4822
+ Builder.getInt32 (0 ), // extened message descriptor
4823
+ Builder.getInt32 (0x02000004 ), // message descriptor: barrier
4824
+ Payload,
4825
+ };
4826
+
4827
+ auto *SendFunc =
4828
+ vc::getAnyDeclaration (M, GenXIntrinsic::genx_raw_send2_noresult,
4829
+ {Builder.getInt1Ty (), PayloadTy});
4830
+
4831
+ Builder.CreateCall (SendFunc, Args);
4832
+ ToErase.push_back (CI);
4833
+
4834
+ return true ;
4835
+ }
4836
+
4781
4837
template <typename BuilderOp>
4782
4838
bool GenXLowering::lowerReduction (CallInst *CI, Value *Src, Value *Start,
4783
4839
BuilderOp Builder) {
0 commit comments