Skip to content

Commit 290f136

Browse files
vmaksimosvenvh
andauthored
Fix ArgumentAttributeINTEL decoration translation after nocapture attribute change (#2983)
Update after llvm/llvm-project@29441e4f5fa5 ("[IR] Convert from nocapture to captures(none)") Co-authored-by: Sven van Haastregt <[email protected]>
1 parent c1a7e51 commit 290f136

File tree

4 files changed

+18
-12
lines changed

4 files changed

+18
-12
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,14 @@ void SPIRVToLLVM::transFunctionPointerCallArgumentAttributes(
13931393
std::vector<SPIRVWord> Literals = Dec->getVecLiteral();
13941394
SPIRVWord ArgNo = Literals[0];
13951395
SPIRVWord SpirvAttr = Literals[1];
1396+
// There is no value to rmap SPIR-V FunctionParameterAttributeNoCapture, as
1397+
// LLVM does not have Attribute::NoCapture anymore. Adding special handling
1398+
// for this case.
1399+
if (SpirvAttr == FunctionParameterAttributeNoCapture) {
1400+
CI->addParamAttr(ArgNo, Attribute::getWithCaptureInfo(
1401+
CI->getContext(), CaptureInfo::none()));
1402+
continue;
1403+
}
13961404
Attribute::AttrKind LlvmAttrKind = SPIRSPIRVFuncParamAttrMap::rmap(
13971405
static_cast<SPIRVFuncParamAttrKind>(SpirvAttr));
13981406
auto LlvmAttr =

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2740,6 +2740,10 @@ bool LLVMToSPIRVBase::shouldTryToAddMemAliasingDecoration(Instruction *Inst) {
27402740
void addFuncPointerCallArgumentAttributes(CallInst *CI,
27412741
SPIRVValue *FuncPtrCall) {
27422742
for (unsigned ArgNo = 0; ArgNo < CI->arg_size(); ++ArgNo) {
2743+
if (CI->doesNotCapture(ArgNo))
2744+
FuncPtrCall->addDecorate(new SPIRVDecorate(
2745+
spv::internal::DecorationArgumentAttributeINTEL, FuncPtrCall, ArgNo,
2746+
FunctionParameterAttributeNoCapture));
27432747
for (const auto &I : CI->getAttributes().getParamAttrs(ArgNo)) {
27442748
spv::FunctionParameterAttribute Attr = spv::FunctionParameterAttributeMax;
27452749
SPIRSPIRVFuncParamAttrMap::find(I.getKindAsEnum(), &Attr);

test/extensions/INTEL/SPV_INTEL_function_pointers/CodeSectionINTEL/decor-func-ptr-arg-attr.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
; TODO: update for nocapture -> captures(none) LLVM change.
2-
; XFAIL: *
3-
41
; RUN: llvm-as %s -o %t.bc
52
; RUN: llvm-spirv %t.bc -o %t.spt -spirv-text -spirv-ext=+SPV_INTEL_function_pointers
63
; RUN: FileCheck < %t.spt %s --check-prefix CHECK-SPIRV
@@ -13,13 +10,13 @@
1310
; CHECK-SPIRV: Capability FunctionPointersINTEL
1411
; CHECK-SPIRV: Extension "SPV_INTEL_function_pointers"
1512

16-
; CHECK-SPIRV: Decorate [[#TargetId:]] ArgumentAttributeINTEL 0 4
17-
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 5
13+
; CHECK-SPIRV: Decorate [[#TargetId:]] ArgumentAttributeINTEL 0 5
14+
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 4
1815
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 2
1916
; CHECK-SPIRV: FunctionPointerCallINTEL
2017
; CHECK-SPIRV-SAME: [[#TargetId]]
2118

22-
; CHECK-LLVM: call spir_func addrspace(9) void %cond.i.i(ptr noalias captures(none) byval(%multi_ptr) %agg.tmp.i.i)
19+
; CHECK-LLVM: call spir_func addrspace(9) void %cond.i.i(ptr noalias byval(%multi_ptr) captures(none) %agg.tmp.i.i)
2320

2421
; ModuleID = 'sycl_test.cpp'
2522
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"

test/extensions/INTEL/SPV_INTEL_function_pointers/decor-func-ptr-arg-attr.ll

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
; TODO: update for nocapture -> captures(none) LLVM change.
2-
; XFAIL: *
3-
41
; RUN: llvm-as %s -o %t.bc
52
; RUN: llvm-spirv %t.bc -o %t.spt -spirv-text -spirv-ext=+SPV_INTEL_function_pointers
63
; RUN: FileCheck < %t.spt %s --check-prefix CHECK-SPIRV
@@ -13,13 +10,13 @@
1310
; CHECK-SPIRV: Capability FunctionPointersINTEL
1411
; CHECK-SPIRV: Extension "SPV_INTEL_function_pointers"
1512

16-
; CHECK-SPIRV: Decorate [[#TargetId:]] ArgumentAttributeINTEL 0 4
17-
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 5
13+
; CHECK-SPIRV: Decorate [[#TargetId:]] ArgumentAttributeINTEL 0 5
14+
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 4
1815
; CHECK-SPIRV: Decorate [[#TargetId]] ArgumentAttributeINTEL 0 2
1916
; CHECK-SPIRV: FunctionPointerCallINTEL
2017
; CHECK-SPIRV-SAME: [[#TargetId]]
2118

22-
; CHECK-LLVM: call spir_func void %cond.i.i(ptr noalias captures(none) byval(%multi_ptr) %agg.tmp.i.i)
19+
; CHECK-LLVM: call spir_func void %cond.i.i(ptr noalias byval(%multi_ptr) captures(none) %agg.tmp.i.i)
2320

2421
; ModuleID = 'sycl_test.cpp'
2522
target datalayout = "e-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64"

0 commit comments

Comments
 (0)