Skip to content

Commit 4ccb1b2

Browse files
authored
Add convergent attribute during reverse translation of OpControlBarrier (#1195)
There is a patch to keep convergent attr during translation of OpControlBarrier to prevent optimization passes from making barrier calls control-dependent.
1 parent 403a943 commit 4ccb1b2

5 files changed

+4
-5
lines changed

lib/SPIRV/SPIRVReader.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -3034,7 +3034,8 @@ Instruction *SPIRVToLLVM::transBuiltinFromInst(const std::string &FuncName,
30343034
if (isFuncNoUnwind())
30353035
Func->addFnAttr(Attribute::NoUnwind);
30363036
auto OC = BI->getOpCode();
3037-
if (isGroupOpCode(OC) || isIntelSubgroupOpCode(OC))
3037+
if (isGroupOpCode(OC) || isIntelSubgroupOpCode(OC) ||
3038+
OC == OpControlBarrier)
30383039
Func->addFnAttr(Attribute::Convergent);
30393040
}
30403041
auto Call =

lib/SPIRV/SPIRVToOCL12.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,6 @@ void SPIRVToOCL12Base::visitCallSPIRVMemoryBarrier(CallInst *CI) {
8989

9090
void SPIRVToOCL12Base::visitCallSPIRVControlBarrier(CallInst *CI) {
9191
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
92-
Attrs = Attrs.addFnAttribute(CI->getContext(), Attribute::Convergent);
9392
mutateCallInstOCL(
9493
M, CI,
9594
[=](CallInst *, std::vector<Value *> &Args) {

lib/SPIRV/SPIRVToOCL20.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ void SPIRVToOCL20Base::visitCallSPIRVMemoryBarrier(CallInst *CI) {
9797

9898
void SPIRVToOCL20Base::visitCallSPIRVControlBarrier(CallInst *CI) {
9999
AttributeList Attrs = CI->getCalledFunction()->getAttributes();
100-
Attrs = Attrs.addFnAttribute(CI->getContext(), Attribute::Convergent);
101100
mutateCallInstOCL(
102101
M, CI,
103102
[=](CallInst *, std::vector<Value *> &Args) {

test/GroupAndSubgroupInstructions.spvasm

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
; CHECK-SPV-IR: declare spir_func i1 @_Z16__spirv_GroupAllib(i32, i1) #[[#Attrs:]]
7979
; CHECK-SPV-IR: declare spir_func i1 @_Z16__spirv_GroupAnyib(i32, i1) #[[#Attrs]]
8080
; CHECK-SPV-IR: declare spir_func i32 @_Z22__spirv_GroupBroadcastiii(i32, i32, i32) #[[#Attrs]]
81-
; CHECK-SPV-IR: declare spir_func void @_Z22__spirv_ControlBarrieriii(i32, i32, i32) #0
81+
; CHECK-SPV-IR: declare spir_func void @_Z22__spirv_ControlBarrieriii(i32, i32, i32) #[[#Attrs]]
8282
; CHECK-SPV-IR: declare spir_func i32 @_Z17__spirv_GroupIAddiii(i32, i32, i32) #[[#Attrs]]
8383
; CHECK-SPV-IR: declare spir_func float @_Z17__spirv_GroupFAddiif(i32, i32, float) #[[#Attrs]]
8484
; CHECK-SPV-IR: declare spir_func i32 @_Z17__spirv_GroupSMiniii(i32, i32, i32) #[[#Attrs]]

test/spirv-ocl-builtins-version.spt

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,4 @@
6565
; CHECK-LLVM-SPV-IR: call spir_func void @_Z22__spirv_ControlBarrieriii(i32 2, i32 2, i32 2320) [[attr]]
6666
; CHECK-LLVM-SPV-IR: call spir_func void @_Z22__spirv_ControlBarrieriii(i32 2, i32 2, i32 2832) [[attr]]
6767
; FIXME: shall we apply convergent attribute to SPIR-V friendly IR representaiton as well?
68-
; CHECK-LLVM-SPV-IR: attributes [[attr]] = { nounwind }
68+
; CHECK-LLVM-SPV-IR: attributes [[attr]] = { convergent nounwind }

0 commit comments

Comments
 (0)