Skip to content

Commit

Permalink
[Backport to 14] ensure that PHI node has an incoming value per each …
Browse files Browse the repository at this point in the history
…predecessor instance even if the input SPIR-V module is invalid as reported by spirv-val
  • Loading branch information
VyacheslavLevytskyy authored and MrSidims committed Nov 9, 2024
1 parent 62b046c commit 970ad6c
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 0 deletions.
3 changes: 3 additions & 0 deletions lib/SPIRV/SPIRVReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3059,12 +3059,15 @@ static void validatePhiPredecessors(Function *F) {
for (PHINode &Phi : BB.phis()) {
SmallVector<Value *> Vs;
SmallVector<BasicBlock *> Bs;
SmallPtrSet<BasicBlock *, 8> UsedB;
auto Vals = Phi.incoming_values();
auto Blocks = Phi.blocks();
auto *VIt = Vals.begin();
auto *BIt = Blocks.begin();
for (; VIt != Vals.end() && BIt != Blocks.end(); ++VIt, ++BIt) {
const unsigned N = PredsCnt[*BIt];
if (!UsedB.insert(*BIt).second)
continue;
Vs.insert(Vs.end(), N, *VIt);
Bs.insert(Bs.end(), N, *BIt);
}
Expand Down
41 changes: 41 additions & 0 deletions test/phi-multiple-predecessors-invalid-input.spvasm
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
; The goal of the test case is to ensure that PHI node has an incoming value per each predecessor
; instance even if the input SPIR-V module is invalid as reported by spirv-val.

; We don't run spirv-val on this module therefore.

; REQUIRES: spirv-as
; RUN: spirv-as --target-env spv1.0 -o %t.spv %s
; 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_4 %11 %uint_4 %11 %uint_4 %11 %uint_2 %12
%14 = OpPhi %uint %uint_2 %12 %uint_4 %11 %uint_4 %11 %uint_4 %11 %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 ]

0 comments on commit 970ad6c

Please sign in to comment.