Skip to content

Commit 52f7641

Browse files
vmustyaigcbot
authored andcommitted
Lower named barrier arrive VC intrinsic
vISA doesn't support divergent named barrier arrive instruction, so lower it into raw send.
1 parent 4756266 commit 52f7641

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

IGC/VectorCompiler/lib/GenXCodeGen/GenXLowering.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ class GenXLowering : public FunctionPass {
260260
bool lowerStackRestore(CallInst *CI);
261261
bool lowerHardwareThreadID(CallInst *CI);
262262
bool lowerLogicalThreadID(CallInst *CI);
263+
bool lowerNamedBarrierArrive(CallInst *CI);
263264

264265
Value *swapLowHighHalves(IRBuilder<> &Builder, Value *Arg) const;
265266
bool lowerByteSwap(CallInst *CI);
@@ -2170,6 +2171,8 @@ bool GenXLowering::processInst(Instruction *Inst) {
21702171
return lowerHardwareThreadID(CI);
21712172
case vc::InternalIntrinsic::logical_thread_id:
21722173
return lowerLogicalThreadID(CI);
2174+
case GenXIntrinsic::genx_nbarrier_arrive:
2175+
return lowerNamedBarrierArrive(CI);
21732176
}
21742177
return false;
21752178
}
@@ -4778,6 +4781,59 @@ bool GenXLowering::lowerLogicalThreadID(CallInst *CI) {
47784781
return true;
47794782
}
47804783

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+
47814837
template <typename BuilderOp>
47824838
bool GenXLowering::lowerReduction(CallInst *CI, Value *Src, Value *Start,
47834839
BuilderOp Builder) {
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2024 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
9+
; RUN: %opt %use_old_pass_manager% -GenXLowering -march=genx64 -mcpu=XeHPC -mtriple=spir64-unknown-unknown -S < %s | FileCheck %s
10+
11+
; RUN: not %opt %use_old_pass_manager% -GenXLowering -march=genx64 -mcpu=XeLP -mtriple=spir64-unknown-unknown -S < %s 2>&1 | FileCheck %s --check-prefix=CHECK-NO-NBARRIER
12+
13+
declare void @llvm.genx.nbarrier.arrive(i8, i8, i8, i8)
14+
15+
define spir_func void @test() {
16+
; CHECK: call void @llvm.genx.raw.send2.noresult.i1.v16i32(i8 0, i8 0, i1 true, i8 1, i8 3, i32 0, i32 33554436, <16 x i32> <i32 undef, i32 undef, i32 1075838988, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>)
17+
18+
; CHECK-NO-NBARRIER: Named barriers are not suppported by XeLP
19+
20+
tail call void @llvm.genx.nbarrier.arrive(i8 12, i8 0, i8 32, i8 64)
21+
ret void
22+
}

0 commit comments

Comments
 (0)