@@ -279,6 +279,9 @@ class OCL20ToSPIRV : public ModulePass, public InstVisitor<OCL20ToSPIRV> {
279279 StringRef MangledName,
280280 const std::string &DemangledName);
281281
282+ // / For cl_intel_split_work_group_barrier built-ins:
283+ void visitCallSplitBarrierINTEL (CallInst *CI, StringRef DemangledName);
284+
282285 static char ID;
283286
284287private:
@@ -544,6 +547,10 @@ void OCL20ToSPIRV::visitCallInst(CallInst &CI) {
544547 visitSubgroupImageMediaBlockINTEL (&CI, DemangledName);
545548 return ;
546549 }
550+ if (DemangledName.find (kOCLBuiltinName ::SplitBarrierINTELPrefix) == 0 ) {
551+ visitCallSplitBarrierINTEL (&CI, DemangledName);
552+ return ;
553+ }
547554 // Handle 'cl_intel_device_side_avc_motion_estimation' extension built-ins
548555 if (DemangledName.find (kOCLSubgroupsAVCIntel ::Prefix) == 0 ||
549556 // Workaround for a bug in the extension specification
@@ -1846,6 +1853,37 @@ void OCL20ToSPIRV::visitSubgroupAVCBuiltinCallWithSampler(
18461853 &Attrs);
18471854}
18481855
1856+ void OCL20ToSPIRV::visitCallSplitBarrierINTEL (CallInst *CI,
1857+ StringRef DemangledName) {
1858+ auto Lit = getBarrierLiterals (CI);
1859+ AttributeList Attrs = CI->getCalledFunction ()->getAttributes ();
1860+ Op OpCode =
1861+ StringSwitch<Op>(DemangledName)
1862+ .Case (" intel_work_group_barrier_arrive" , OpControlBarrierArriveINTEL)
1863+ .Case (" intel_work_group_barrier_wait" , OpControlBarrierWaitINTEL)
1864+ .Default (OpNop);
1865+
1866+ mutateCallInstSPIRV (
1867+ M, CI,
1868+ [=](CallInst *, std::vector<Value *> &Args) {
1869+ Args.resize (3 );
1870+ // Execution scope
1871+ Args[0 ] = addInt32 (map<Scope>(std::get<2 >(Lit)));
1872+ // Memory scope
1873+ Args[1 ] = addInt32 (map<Scope>(std::get<1 >(Lit)));
1874+ // Memory semantics
1875+ // OpControlBarrierArriveINTEL -> Release,
1876+ // OpControlBarrierWaitINTEL -> Acquire
1877+ unsigned MemFenceFlag = std::get<0 >(Lit);
1878+ OCLMemOrderKind MemOrder = OpCode == OpControlBarrierArriveINTEL
1879+ ? OCLMO_release
1880+ : OCLMO_acquire;
1881+ Args[2 ] = addInt32 (mapOCLMemSemanticToSPIRV (MemFenceFlag, MemOrder));
1882+ return getSPIRVFuncName (OpCode);
1883+ },
1884+ &Attrs);
1885+ }
1886+
18491887} // namespace SPIRV
18501888
18511889INITIALIZE_PASS_BEGIN (OCL20ToSPIRV, " cl20tospv" , " Transform OCL 2.0 to SPIR-V" ,
0 commit comments