forked from KhronosGroup/SPIRV-LLVM-Translator
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Ensure that PHI node has an incoming value per each predecessor insta…
…nce (KhronosGroup#2736) This PR partially fixes issue KhronosGroup#2702 in the part that is responsible for SPIR-V to LLVM IR translation. Namely, this PR ensures that all PHI nodes of a Function has the number of incoming blocks matching block's predecessor count. When a PHI node doesn't conform to this rule, this PR inserts missing number of (Value, Basic Block) pairs to make the PHI node valid. Another problem from KhronosGroup#2702, that is violation of the requirement to OpPhi's to have exactly one Parent ID operand for each parent block of the current block in the CFG in the output SPIR-V code, is out of scope of this PR.
- Loading branch information
1 parent
4b96335
commit b3cab3d
Showing
2 changed files
with
78 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
; REQUIRES: spirv-as | ||
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s | ||
; RUN: spirv-val %t.spv | ||
; RUN: llvm-spirv -r -o - %t.spv | llvm-dis | FileCheck %s | ||
|
||
OpCapability Kernel | ||
OpCapability Addresses | ||
OpCapability Int64 | ||
OpCapability Linkage | ||
%1 = OpExtInstImport "OpenCL.std" | ||
OpMemoryModel Physical64 OpenCL | ||
OpSource OpenCL_CPP 100000 | ||
OpName %foo "foo" | ||
OpName %get "get" | ||
OpDecorate %foo LinkageAttributes "foo" Export | ||
OpDecorate %get LinkageAttributes "get" Import | ||
%uint = OpTypeInt 32 0 | ||
%3 = OpTypeFunction %uint | ||
%ulong = OpTypeInt 64 0 | ||
%uint_2 = OpConstant %uint 2 | ||
%uint_4 = OpConstant %uint 4 | ||
%get = OpFunction %uint None %3 | ||
OpFunctionEnd | ||
%foo = OpFunction %uint None %3 | ||
%11 = OpLabel | ||
%9 = OpFunctionCall %uint %get | ||
OpSwitch %9 %12 10 %13 4 %13 0 %13 42 %13 | ||
%12 = OpLabel | ||
OpBranch %13 | ||
%13 = OpLabel | ||
%10 = OpPhi %uint %uint_4 %11 %uint_2 %12 | ||
%14 = OpPhi %uint %uint_2 %12 %uint_4 %11 | ||
OpReturnValue %14 | ||
OpFunctionEnd | ||
|
||
; CHECK: phi i32 [ 4, %0 ], [ 4, %0 ], [ 4, %0 ], [ 4, %0 ], [ 2, %2 ] | ||
; CHECK: phi i32 [ 2, %2 ], [ 4, %0 ], [ 4, %0 ], [ 4, %0 ], [ 4, %0 ] |