@@ -874,10 +874,15 @@ Value *spirv::genLinearLocalID(Instruction &Before, const Triple &TT) {
874
874
IRBuilder<> Bld (Ctx);
875
875
Bld.SetInsertPoint (&Before);
876
876
877
+ AttributeList Attr;
878
+ Attr = Attr.addAttribute (Ctx, AttributeList::FunctionIndex,
879
+ Attribute::Convergent);
880
+
877
881
#define CREATE_CALLEE (NAME, FN_NAME ) \
878
- FunctionCallee FnCallee##NAME = M.getOrInsertFunction (FN_NAME, RetTy); \
882
+ FunctionCallee FnCallee##NAME = M.getOrInsertFunction (FN_NAME, Attr, RetTy); \
879
883
assert (FnCallee##NAME && " spirv intrinsic creation failed" ); \
880
- auto NAME = Bld.CreateCall (FnCallee##NAME, {});
884
+ auto NAME = Bld.CreateCall (FnCallee##NAME, {}); \
885
+ NAME->addAttribute (AttributeList::FunctionIndex, Attribute::Convergent);
881
886
882
887
CREATE_CALLEE (LocalInvocationId_X, " _Z27__spirv_LocalInvocationId_xv" );
883
888
CREATE_CALLEE (LocalInvocationId_Y, " _Z27__spirv_LocalInvocationId_yv" );
@@ -937,8 +942,11 @@ Instruction *spirv::genWGBarrier(Instruction &Before, const Triple &TT) {
937
942
Type *SemanticsTy = Type::getInt32Ty (Ctx);
938
943
Type *RetTy = Type::getVoidTy (Ctx);
939
944
945
+ AttributeList Attr;
946
+ Attr = Attr.addAttribute (Ctx, AttributeList::FunctionIndex,
947
+ Attribute::Convergent);
940
948
FunctionCallee FC =
941
- M.getOrInsertFunction (Name, RetTy, ScopeTy, ScopeTy, SemanticsTy);
949
+ M.getOrInsertFunction (Name, Attr, RetTy, ScopeTy, ScopeTy, SemanticsTy);
942
950
assert (FC.getCallee () && " spirv intrinsic creation failed" );
943
951
944
952
IRBuilder<> Bld (Ctx);
@@ -948,5 +956,8 @@ Instruction *spirv::genWGBarrier(Instruction &Before, const Triple &TT) {
948
956
auto ArgSema = ConstantInt::get (
949
957
ScopeTy, asUInt (spirv::MemorySemantics::SequentiallyConsistent) |
950
958
asUInt (spirv::MemorySemantics::WorkgroupMemory));
951
- return Bld.CreateCall (FC, {ArgExec, ArgMem, ArgSema});
959
+ auto BarrierCall = Bld.CreateCall (FC, {ArgExec, ArgMem, ArgSema});
960
+ BarrierCall->addAttribute (llvm::AttributeList::FunctionIndex,
961
+ llvm::Attribute::Convergent);
962
+ return BarrierCall;
952
963
}
0 commit comments