-
Notifications
You must be signed in to change notification settings - Fork 229
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support SPV_INTEL_maximum_registers extension #2344
Changes from 2 commits
95f84ec
d120554
9ed2063
9f88eae
e2674da
e2f8c7f
84a3ead
ce0c5b7
b4b3481
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -977,7 +977,10 @@ SPIRVFunction *LLVMToSPIRVBase::transFunctionDecl(Function *F) { | |
|
||
transFPGAFunctionMetadata(BF, F); | ||
|
||
transFunctionMetadataAsUserSemanticDecoration(BF, F); | ||
if (BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_maximum_registers)) | ||
transFunctionMetadataAsExecutionMode(BF, F); | ||
else | ||
transFunctionMetadataAsUserSemanticDecoration(BF, F); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do we want to support the 'old' implementation or throw an error here? Sorry if this is ignorant question. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually we do, because it takes time for the consumers to adapt the new change on their side. |
||
|
||
transAuxDataInst(BF, F); | ||
|
||
|
@@ -1118,6 +1121,30 @@ void LLVMToSPIRVBase::transFPGAFunctionMetadata(SPIRVFunction *BF, | |
transMetadataDecorations(FDecoMD, BF); | ||
} | ||
|
||
void LLVMToSPIRVBase::transFunctionMetadataAsExecutionMode(SPIRVFunction *BF, | ||
Function *F) { | ||
if (!BM->isAllowedToUseExtension(ExtensionID::SPV_INTEL_maximum_registers)) | ||
vmaksimo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
return; | ||
|
||
// TODO: Also add support for ExecutionModeMaximumRegistersIdINTEL | ||
if (auto *RegisterAllocModeMD = F->getMetadata("RegisterAllocMode")) { | ||
auto *RegisterAllocMode = RegisterAllocModeMD->getOperand(0).get(); | ||
if (isa<MDString>(RegisterAllocMode)) { | ||
StringRef Str = getMDOperandAsString(RegisterAllocModeMD, 0); | ||
if (Str == "AutoINTEL") | ||
BF->addExecutionMode(BM->add(new SPIRVExecutionMode( | ||
OpExecutionMode, BF, | ||
internal::ExecutionModeNamedMaximumRegistersINTEL, 0))); | ||
} else { | ||
int64_t RegisterAllocNodeMDOp = | ||
vmaksimo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
mdconst::dyn_extract<ConstantInt>(RegisterAllocMode)->getZExtValue(); | ||
BF->addExecutionMode(BM->add(new SPIRVExecutionMode( | ||
OpExecutionMode, BF, internal::ExecutionModeMaximumRegistersINTEL, | ||
RegisterAllocNodeMDOp))); | ||
} | ||
} | ||
} | ||
|
||
void LLVMToSPIRVBase::transFunctionMetadataAsUserSemanticDecoration( | ||
SPIRVFunction *BF, Function *F) { | ||
if (auto *RegisterAllocModeMD = F->getMetadata("RegisterAllocMode")) { | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
; RUN: llvm-as %s -o %t.bc | ||
; RUN: llvm-spirv -spirv-text --spirv-ext=+SPV_INTEL_maximum_registers %t.bc | ||
; RUN: FileCheck < %t.spt %s --check-prefix=CHECK-SPIRV | ||
; RUN: llvm-spirv %t.bc --spirv-ext=+SPV_INTEL_maximum_registers -o %t.spv | ||
; RUN: llvm-spirv -r %t.spv -spirv-target-env=SPV-IR -o - | llvm-dis -o %t.rev.ll | ||
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM | ||
|
||
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC0:]] "main_l3" | ||
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC1:]] "main_l6" | ||
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC2:]] "main_l9" | ||
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC3:]] "main_l13" | ||
; CHECK-SPIRV: EntryPoint [[#]] [[#FUNC4:]] "main_l19" | ||
|
||
; CHECK-SPIRV: ExecutionMode [[#FUNC0]] 6461 2 | ||
; CHECK-SPIRV: ExecutionMode [[#FUNC1]] 6461 1 | ||
; CHECK-SPIRV: ExecutionMode [[#FUNC2]] 6461 0 | ||
; CHECK-SPIRV: ExecutionMode [[#FUNC3]] 6461 3 | ||
|
||
; CHECK-SPIRV-NOT: ExecutionMode [[#FUNC4]] | ||
|
||
; CHECK-LLVM: !spirv.ExecutionMode = !{![[#FLAG0:]], ![[#FLAG1:]], ![[#FLAG2:]], ![[#FLAG3:]]} | ||
; CHECK-LLVM: ![[#FLAG0]] = !{ptr @main_l3, i32 6461, i32 2} | ||
; CHECK-LLVM: ![[#FLAG1]] = !{ptr @main_l6, i32 6461, i32 1} | ||
; CHECK-LLVM: ![[#FLAG2]] = !{ptr @main_l9, i32 6461, i32 0} | ||
; CHECK-LLVM: ![[#FLAG3]] = !{ptr @main_l13, i32 6461, i32 3} | ||
|
||
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" | ||
target triple = "spir64" | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define weak dso_local spir_kernel void @main_l3() #0 !RegisterAllocMode !10 { | ||
newFuncRoot: | ||
ret void | ||
} | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define weak dso_local spir_kernel void @main_l6() #0 !RegisterAllocMode !11 { | ||
newFuncRoot: | ||
ret void | ||
} | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define weak dso_local spir_kernel void @main_l9() #0 !RegisterAllocMode !12 { | ||
newFuncRoot: | ||
ret void | ||
} | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define weak dso_local spir_kernel void @main_l13() #0 !RegisterAllocMode !13 { | ||
newFuncRoot: | ||
ret void | ||
} | ||
|
||
; Function Attrs: noinline nounwind optnone | ||
define weak dso_local spir_kernel void @main_l19() #0 { | ||
newFuncRoot: | ||
ret void | ||
} | ||
|
||
attributes #0 = { noinline nounwind optnone } | ||
|
||
|
||
!opencl.compiler.options = !{!0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0, !0} | ||
!spirv.Source = !{!2, !3, !3, !3, !3, !3, !2, !3, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2, !2} | ||
!llvm.module.flags = !{!4, !5, !6, !7, !8} | ||
!spirv.MemoryModel = !{!9, !9, !9, !9, !9, !9} | ||
!spirv.ExecutionMode = !{} | ||
|
||
!0 = !{} | ||
!2 = !{i32 4, i32 200000} | ||
!3 = !{i32 3, i32 200000} | ||
!4 = !{i32 1, !"wchar_size", i32 4} | ||
!5 = !{i32 7, !"openmp", i32 50} | ||
!6 = !{i32 7, !"openmp-device", i32 50} | ||
!7 = !{i32 8, !"PIC Level", i32 2} | ||
!8 = !{i32 7, !"frame-pointer", i32 2} | ||
!9 = !{i32 2, i32 2} | ||
!10 = !{i32 2} | ||
!11 = !{i32 1} | ||
!12 = !{i32 0} | ||
!13 = !{i32 3} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should we check to ensure that only one mode is chosen?
Consider refactoring common code among the three if statements.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actually no. Even so it seems to have no sense to enable several different
maxregisters
execution modes, neither SPIR-V core spec, nor extension prohibits usage of several execution modes at the same time. So, I believe this code should not be changed toelse if
.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
From KhronosGroup/SPIRV-Registry#235, in extensions/INTEL/SPV_INTEL_maximum_registers.asciidoc
MaximumRegistersINTEL, MaximumRegistersIdINTEL, or
NamedMaximumRegistersINTEL execution modes.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Applied in 84a3ead. Unfortunately I can't add meaningful tests for that, because llvm-spirv fails with an assertion in case we add more than one execution mode of the certain type.
Verified locally that this check both on forward and reverse translation in case of invalid IR/SPV.