Commit 832c65c3 by Dejan Mircevski

Fix back-branch target for do-while loops.

To ensure back branches always go to a header block, create a header block even for !testFirst loops. Then unify common code between the testFirst/!testFirst cases. Generate the header-block code first, so update golden files. Realize that certain infinite loops generate invalid SPIR-V, so put a TODO to instead abort code generation in such cases. Change-Id: I1e173c8f73daad186cfc666b7d72bd563ed7665d
parent c8fbbab4
...@@ -1342,19 +1342,17 @@ void TGlslangToSpvTraverser::visitConstantUnion(glslang::TIntermConstantUnion* n ...@@ -1342,19 +1342,17 @@ void TGlslangToSpvTraverser::visitConstantUnion(glslang::TIntermConstantUnion* n
bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIntermLoop* node) bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIntermLoop* node)
{ {
auto blocks = builder.makeNewLoop(); auto blocks = builder.makeNewLoop();
builder.createBranch(&blocks.head);
if (node->testFirst() && node->getTest()) { if (node->testFirst() && node->getTest()) {
spv::Block& head = builder.makeNewBlock(); builder.setBuildPoint(&blocks.head);
builder.createBranch(&head);
builder.setBuildPoint(&head);
node->getTest()->traverse(this); node->getTest()->traverse(this);
spv::Id condition = spv::Id condition =
builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType())); builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType()));
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, spv::LoopControlMaskNone); builder.createLoopMerge(&blocks.merge, &blocks.continue_target, spv::LoopControlMaskNone);
builder.createConditionalBranch(condition, &blocks.body, &blocks.merge); builder.createConditionalBranch(condition, &blocks.body, &blocks.merge);
breakForLoop.push(true);
builder.setBuildPoint(&blocks.body); builder.setBuildPoint(&blocks.body);
breakForLoop.push(true);
if (node->getBody()) if (node->getBody())
node->getBody()->traverse(this); node->getBody()->traverse(this);
builder.createBranch(&blocks.continue_target); builder.createBranch(&blocks.continue_target);
...@@ -1363,8 +1361,14 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn ...@@ -1363,8 +1361,14 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
builder.setBuildPoint(&blocks.continue_target); builder.setBuildPoint(&blocks.continue_target);
if (node->getTerminal()) if (node->getTerminal())
node->getTerminal()->traverse(this); node->getTerminal()->traverse(this);
builder.createBranch(&head); builder.createBranch(&blocks.head);
} else { } else {
// Spec requires back edges to target header blocks, and every header
// block must dominate its merge block. Create an empty header block
// here to ensure these conditions are met even when body contains
// non-trivial control flow.
builder.setBuildPoint(&blocks.head);
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, spv::LoopControlMaskNone);
builder.createBranch(&blocks.body); builder.createBranch(&blocks.body);
breakForLoop.push(true); breakForLoop.push(true);
...@@ -1381,14 +1385,17 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn ...@@ -1381,14 +1385,17 @@ bool TGlslangToSpvTraverser::visitLoop(glslang::TVisit /* visit */, glslang::TIn
node->getTest()->traverse(this); node->getTest()->traverse(this);
spv::Id condition = spv::Id condition =
builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType())); builder.accessChainLoad(convertGlslangToSpvType(node->getTest()->getType()));
builder.createLoopMerge(&blocks.merge, &blocks.continue_target, builder.createConditionalBranch(condition, &blocks.head, &blocks.merge);
spv::LoopControlMaskNone);
builder.createConditionalBranch(condition, &blocks.body, &blocks.merge);
} else { } else {
builder.createBranch(&blocks.body); // TODO: unless there was a break instruction somewhere in the body,
// this is an infinite loop, so we should abort code generation with
// a warning. As it stands now, nothing will jump to the merge
// block, and it may be dropped as unreachable by the SPIR-V dumper.
// That, in turn, will result in a non-existing %ID in the LoopMerge
// above.
builder.createBranch(&blocks.head);
} }
} }
builder.setBuildPoint(&blocks.merge); builder.setBuildPoint(&blocks.merge);
builder.closeLoop(); builder.closeLoop();
return false; return false;
......
...@@ -1763,7 +1763,7 @@ Block& Builder::makeNewBlock() ...@@ -1763,7 +1763,7 @@ Block& Builder::makeNewBlock()
Builder::LoopBlocks& Builder::makeNewLoop() Builder::LoopBlocks& Builder::makeNewLoop()
{ {
loops.push({makeNewBlock(), makeNewBlock(), makeNewBlock()}); loops.push({makeNewBlock(), makeNewBlock(), makeNewBlock(), makeNewBlock()});
return loops.top(); return loops.top();
} }
......
...@@ -374,7 +374,7 @@ public: ...@@ -374,7 +374,7 @@ public:
void endSwitch(std::vector<Block*>& segmentBB); void endSwitch(std::vector<Block*>& segmentBB);
struct LoopBlocks { struct LoopBlocks {
Block &body, &merge, &continue_target; Block &head, &body, &merge, &continue_target;
}; };
// Start a new loop and prepare the builder to generate code for it. Until // Start a new loop and prepare the builder to generate code for it. Until
......
...@@ -48,26 +48,26 @@ Linked vertex stage: ...@@ -48,26 +48,26 @@ Linked vertex stage:
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
25: 6(int) Load 8(i) 14: 6(int) Load 8(i)
28: 19(fvec4) Load 27(color) 17: 16(bool) SLessThan 14 15
30: 29(ptr) AccessChain 24(colorOut) 25 LoopMerge 12 13 None
Store 30 28 BranchConditional 17 11 12
Branch 12 11: Label
11: Label 25: 6(int) Load 8(i)
28: 19(fvec4) Load 27(color)
30: 29(ptr) AccessChain 24(colorOut) 25
Store 30 28
Branch 13
12: Label
35: 29(ptr) AccessChain 24(colorOut) 34 35: 29(ptr) AccessChain 24(colorOut) 34
36: 19(fvec4) Load 35 36: 19(fvec4) Load 35
Store 33(gl_Position) 36 Store 33(gl_Position) 36
Return Return
12: Label 13: Label
31: 6(int) Load 8(i) 31: 6(int) Load 8(i)
32: 6(int) IAdd 31 9 32: 6(int) IAdd 31 9
Store 8(i) 32 Store 8(i) 32
Branch 13 Branch 10
13: Label FunctionEnd
14: 6(int) Load 8(i)
17: 16(bool) SLessThan 14 15
LoopMerge 11 12 None
BranchConditional 17 10 11
FunctionEnd
spv.do-simple.vert spv.do-simple.vert
Linked vertex stage: Linked vertex stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 23 // Id's are bound by 24
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 21 22 EntryPoint Vertex 4 "main" 22 23
Source ESSL 300 Source ESSL 300
Name 4 "main" Name 4 "main"
Name 8 "i" Name 8 "i"
Name 21 "gl_VertexID" Name 22 "gl_VertexID"
Name 22 "gl_InstanceID" Name 23 "gl_InstanceID"
Decorate 21(gl_VertexID) BuiltIn VertexId Decorate 22(gl_VertexID) BuiltIn VertexId
Decorate 22(gl_InstanceID) BuiltIn InstanceId Decorate 23(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: 6(int) Constant 0 9: 6(int) Constant 0
14: 6(int) Constant 1 15: 6(int) Constant 1
17: 6(int) Constant 10 18: 6(int) Constant 10
18: TypeBool 19: TypeBool
20: TypePointer Input 6(int) 21: TypePointer Input 6(int)
21(gl_VertexID): 20(ptr) Variable Input 22(gl_VertexID): 21(ptr) Variable Input
22(gl_InstanceID): 20(ptr) Variable Input 23(gl_InstanceID): 21(ptr) Variable Input
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 10 Branch 10
10: Label 10: Label
13: 6(int) Load 8(i) LoopMerge 12 13 None
15: 6(int) IAdd 13 14 Branch 11
Store 8(i) 15 11: Label
Branch 12 14: 6(int) Load 8(i)
11: Label 16: 6(int) IAdd 14 15
Return Store 8(i) 16
12: Label Branch 13
16: 6(int) Load 8(i) 12: Label
19: 18(bool) SLessThan 16 17 Return
LoopMerge 11 12 None 13: Label
BranchConditional 19 10 11 17: 6(int) Load 8(i)
FunctionEnd 20: 19(bool) SLessThan 17 18
BranchConditional 20 10 12
FunctionEnd
...@@ -5,89 +5,91 @@ Linked vertex stage: ...@@ -5,89 +5,91 @@ Linked vertex stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 45 // Id's are bound by 46
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 43 44 EntryPoint Vertex 4 "main" 44 45
Source ESSL 300 Source ESSL 300
Name 4 "main" Name 4 "main"
Name 8 "i" Name 8 "i"
Name 13 "A" Name 14 "A"
Name 20 "B" Name 21 "B"
Name 23 "C" Name 24 "C"
Name 29 "D" Name 30 "D"
Name 32 "E" Name 33 "E"
Name 34 "F" Name 35 "F"
Name 40 "G" Name 41 "G"
Name 43 "gl_VertexID" Name 44 "gl_VertexID"
Name 44 "gl_InstanceID" Name 45 "gl_InstanceID"
Decorate 43(gl_VertexID) BuiltIn VertexId Decorate 44(gl_VertexID) BuiltIn VertexId
Decorate 44(gl_InstanceID) BuiltIn InstanceId Decorate 45(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: 6(int) Constant 0 9: 6(int) Constant 0
15: 6(int) Constant 2 16: 6(int) Constant 2
16: TypeBool 17: TypeBool
21: 6(int) Constant 1 22: 6(int) Constant 1
25: 6(int) Constant 5 26: 6(int) Constant 5
30: 6(int) Constant 3 31: 6(int) Constant 3
33: 6(int) Constant 42 34: 6(int) Constant 42
35: 6(int) Constant 99 36: 6(int) Constant 99
38: 6(int) Constant 19 39: 6(int) Constant 19
41: 6(int) Constant 12 42: 6(int) Constant 12
42: TypePointer Input 6(int) 43: TypePointer Input 6(int)
43(gl_VertexID): 42(ptr) Variable Input 44(gl_VertexID): 43(ptr) Variable Input
44(gl_InstanceID): 42(ptr) Variable Input 45(gl_InstanceID): 43(ptr) Variable Input
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
13(A): 7(ptr) Variable Function 14(A): 7(ptr) Variable Function
20(B): 7(ptr) Variable Function 21(B): 7(ptr) Variable Function
23(C): 7(ptr) Variable Function 24(C): 7(ptr) Variable Function
29(D): 7(ptr) Variable Function 30(D): 7(ptr) Variable Function
32(E): 7(ptr) Variable Function 33(E): 7(ptr) Variable Function
34(F): 7(ptr) Variable Function 35(F): 7(ptr) Variable Function
40(G): 7(ptr) Variable Function 41(G): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 10 Branch 10
10: Label 10: Label
Store 13(A) 9 LoopMerge 12 13 None
14: 6(int) Load 8(i) Branch 11
17: 16(bool) IEqual 14 15 11: Label
SelectionMerge 19 None Store 14(A) 9
BranchConditional 17 18 19 15: 6(int) Load 8(i)
11: Label 18: 17(bool) IEqual 15 16
Store 40(G) 41 SelectionMerge 20 None
Return BranchConditional 18 19 20
12: Label 12: Label
36: 6(int) Load 8(i) Store 41(G) 42
37: 6(int) IAdd 36 21 Return
Store 8(i) 37 13: Label
39: 16(bool) SLessThan 37 38 37: 6(int) Load 8(i)
LoopMerge 11 12 None 38: 6(int) IAdd 37 22
BranchConditional 39 10 11 Store 8(i) 38
18: Label 40: 17(bool) SLessThan 38 39
Store 20(B) 21 BranchConditional 40 10 12
Branch 12 19: Label
22: Label Store 21(B) 22
Store 23(C) 15 Branch 13
Branch 19 23: Label
19: Label Store 24(C) 16
24: 6(int) Load 8(i) Branch 20
26: 16(bool) IEqual 24 25 20: Label
SelectionMerge 28 None 25: 6(int) Load 8(i)
BranchConditional 26 27 28 27: 17(bool) IEqual 25 26
27: Label SelectionMerge 29 None
Store 29(D) 30 BranchConditional 27 28 29
Branch 11 28: Label
31: Label Store 30(D) 31
Store 32(E) 33 Branch 12
Branch 28 32: Label
28: Label Store 33(E) 34
Store 34(F) 35 Branch 29
Branch 12 29: Label
FunctionEnd Store 35(F) 36
Branch 13
FunctionEnd
...@@ -5,7 +5,7 @@ Linked fragment stage: ...@@ -5,7 +5,7 @@ Linked fragment stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 34 // Id's are bound by 35
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
...@@ -16,9 +16,9 @@ Linked fragment stage: ...@@ -16,9 +16,9 @@ Linked fragment stage:
Name 4 "main" Name 4 "main"
Name 9 "color" Name 9 "color"
Name 11 "BaseColor" Name 11 "BaseColor"
Name 17 "bigColor" Name 18 "bigColor"
Name 27 "d" Name 28 "d"
Name 32 "gl_FragColor" Name 33 "gl_FragColor"
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32
...@@ -26,16 +26,16 @@ Linked fragment stage: ...@@ -26,16 +26,16 @@ Linked fragment stage:
8: TypePointer Function 7(fvec4) 8: TypePointer Function 7(fvec4)
10: TypePointer Input 7(fvec4) 10: TypePointer Input 7(fvec4)
11(BaseColor): 10(ptr) Variable Input 11(BaseColor): 10(ptr) Variable Input
16: TypePointer UniformConstant 7(fvec4) 17: TypePointer UniformConstant 7(fvec4)
17(bigColor): 16(ptr) Variable UniformConstant 18(bigColor): 17(ptr) Variable UniformConstant
21: TypeInt 32 0 22: TypeInt 32 0
22: 21(int) Constant 0 23: 22(int) Constant 0
23: TypePointer Function 6(float) 24: TypePointer Function 6(float)
26: TypePointer UniformConstant 6(float) 27: TypePointer UniformConstant 6(float)
27(d): 26(ptr) Variable UniformConstant 28(d): 27(ptr) Variable UniformConstant
29: TypeBool 30: TypeBool
31: TypePointer Output 7(fvec4) 32: TypePointer Output 7(fvec4)
32(gl_FragColor): 31(ptr) Variable Output 33(gl_FragColor): 32(ptr) Variable Output
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
9(color): 8(ptr) Variable Function 9(color): 8(ptr) Variable Function
...@@ -43,20 +43,22 @@ Linked fragment stage: ...@@ -43,20 +43,22 @@ Linked fragment stage:
Store 9(color) 12 Store 9(color) 12
Branch 13 Branch 13
13: Label 13: Label
18: 7(fvec4) Load 17(bigColor) LoopMerge 15 16 None
19: 7(fvec4) Load 9(color) Branch 14
20: 7(fvec4) FAdd 19 18
Store 9(color) 20
Branch 15
14: Label 14: Label
33: 7(fvec4) Load 9(color) 19: 7(fvec4) Load 18(bigColor)
Store 32(gl_FragColor) 33 20: 7(fvec4) Load 9(color)
Return 21: 7(fvec4) FAdd 20 19
Store 9(color) 21
Branch 16
15: Label 15: Label
24: 23(ptr) AccessChain 9(color) 22 34: 7(fvec4) Load 9(color)
25: 6(float) Load 24 Store 33(gl_FragColor) 34
28: 6(float) Load 27(d) Return
30: 29(bool) FOrdLessThan 25 28 16: Label
LoopMerge 14 15 None 25: 24(ptr) AccessChain 9(color) 23
BranchConditional 30 13 14 26: 6(float) Load 25
29: 6(float) Load 28(d)
31: 30(bool) FOrdLessThan 26 29
BranchConditional 31 13 15
FunctionEnd FunctionEnd
...@@ -51,46 +51,46 @@ Linked vertex stage: ...@@ -51,46 +51,46 @@ Linked vertex stage:
38(F): 7(ptr) Variable Function 38(F): 7(ptr) Variable Function
42(G): 7(ptr) Variable Function 42(G): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
Store 18(A) 19 14: 6(int) Load 8(i)
20: 6(int) Load 8(i) 17: 16(bool) SLessThan 14 15
22: 6(int) SMod 20 21 LoopMerge 12 13 None
23: 16(bool) IEqual 22 9 BranchConditional 17 11 12
SelectionMerge 25 None
BranchConditional 23 24 25
11: Label 11: Label
Store 42(G) 43 Store 18(A) 19
Return 20: 6(int) Load 8(i)
12: Label 22: 6(int) SMod 20 21
40: 6(int) Load 8(i) 23: 16(bool) IEqual 22 9
41: 6(int) IAdd 40 19 SelectionMerge 25 None
Store 8(i) 41 BranchConditional 23 24 25
Branch 13 12: Label
13: Label Store 42(G) 43
14: 6(int) Load 8(i) Return
17: 16(bool) SLessThan 14 15 13: Label
LoopMerge 11 12 None 40: 6(int) Load 8(i)
BranchConditional 17 10 11 41: 6(int) IAdd 40 19
Store 8(i) 41
Branch 10
24: Label 24: Label
Store 26(B) 19 Store 26(B) 19
Branch 12 Branch 13
27: Label 27: Label
Store 28(C) 19 Store 28(C) 19
Branch 25 Branch 25
25: Label 25: Label
29: 6(int) Load 8(i) 29: 6(int) Load 8(i)
31: 6(int) SMod 29 30 31: 6(int) SMod 29 30
32: 16(bool) IEqual 31 9 32: 16(bool) IEqual 31 9
SelectionMerge 34 None SelectionMerge 34 None
BranchConditional 32 33 34 BranchConditional 32 33 34
33: Label 33: Label
Store 35(D) 19 Store 35(D) 19
Branch 11
36: Label
Store 37(E) 19
Branch 34
34: Label
Store 38(F) 39
Branch 12 Branch 12
FunctionEnd 36: Label
Store 37(E) 19
Branch 34
34: Label
Store 38(F) 39
Branch 13
FunctionEnd
spv.for-nobody.vert spv.for-nobody.vert
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing. Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
Linked vertex stage: Linked vertex stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 27 // Id's are bound by 27
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 22 25 26 EntryPoint Vertex 4 "main" 22 25 26
Source GLSL 450 Source GLSL 450
Name 4 "main" Name 4 "main"
Name 8 "i" Name 8 "i"
Name 22 "r" Name 22 "r"
Name 25 "gl_VertexID" Name 25 "gl_VertexID"
Name 26 "gl_InstanceID" Name 26 "gl_InstanceID"
Decorate 22(r) Location 0 Decorate 22(r) Location 0
Decorate 25(gl_VertexID) BuiltIn VertexId Decorate 25(gl_VertexID) BuiltIn VertexId
Decorate 26(gl_InstanceID) BuiltIn InstanceId Decorate 26(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: 6(int) Constant 0 9: 6(int) Constant 0
15: 6(int) Constant 10 15: 6(int) Constant 10
16: TypeBool 16: TypeBool
19: 6(int) Constant 1 19: 6(int) Constant 1
21: TypePointer Output 6(int) 21: TypePointer Output 6(int)
22(r): 21(ptr) Variable Output 22(r): 21(ptr) Variable Output
24: TypePointer Input 6(int) 24: TypePointer Input 6(int)
25(gl_VertexID): 24(ptr) Variable Input 25(gl_VertexID): 24(ptr) Variable Input
26(gl_InstanceID): 24(ptr) Variable Input 26(gl_InstanceID): 24(ptr) Variable Input
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
Branch 12 14: 6(int) Load 8(i)
11: Label 17: 16(bool) SLessThan 14 15
23: 6(int) Load 8(i) LoopMerge 12 13 None
Store 22(r) 23 BranchConditional 17 11 12
Return 11: Label
12: Label Branch 13
18: 6(int) Load 8(i) 12: Label
20: 6(int) IAdd 18 19 23: 6(int) Load 8(i)
Store 8(i) 20 Store 22(r) 23
Branch 13 Return
13: Label 13: Label
14: 6(int) Load 8(i) 18: 6(int) Load 8(i)
17: 16(bool) SLessThan 14 15 20: 6(int) IAdd 18 19
LoopMerge 11 12 None Store 8(i) 20
BranchConditional 17 10 11 Branch 10
FunctionEnd FunctionEnd
spv.for-notest.vert spv.for-notest.vert
Warning, version 450 is not yet complete; most version-specific features are present, but some are missing. Warning, version 450 is not yet complete; most version-specific features are present, but some are missing.
Linked vertex stage: Linked vertex stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 22 // Id's are bound by 23
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 14 20 21 EntryPoint Vertex 4 "main" 15 21 22
Source GLSL 450 Source GLSL 450
Name 4 "main" Name 4 "main"
Name 8 "i" Name 8 "i"
Name 14 "r" Name 15 "r"
Name 20 "gl_VertexID" Name 21 "gl_VertexID"
Name 21 "gl_InstanceID" Name 22 "gl_InstanceID"
Decorate 14(r) Location 0 Decorate 15(r) Location 0
Decorate 20(gl_VertexID) BuiltIn VertexId Decorate 21(gl_VertexID) BuiltIn VertexId
Decorate 21(gl_InstanceID) BuiltIn InstanceId Decorate 22(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: 6(int) Constant 0 9: 6(int) Constant 0
13: TypePointer Output 6(int) 14: TypePointer Output 6(int)
14(r): 13(ptr) Variable Output 15(r): 14(ptr) Variable Output
17: 6(int) Constant 1 18: 6(int) Constant 1
19: TypePointer Input 6(int) 20: TypePointer Input 6(int)
20(gl_VertexID): 19(ptr) Variable Input 21(gl_VertexID): 20(ptr) Variable Input
21(gl_InstanceID): 19(ptr) Variable Input 22(gl_InstanceID): 20(ptr) Variable Input
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 10 Branch 10
10: Label 10: Label
15: 6(int) Load 8(i) LoopMerge 12 13 None
Store 14(r) 15 Branch 11
Branch 12 11: Label
12: Label 16: 6(int) Load 8(i)
16: 6(int) Load 8(i) Store 15(r) 16
18: 6(int) IAdd 16 17 Branch 13
Store 8(i) 18 13: Label
Branch 10 17: 6(int) Load 8(i)
FunctionEnd 19: 6(int) IAdd 17 18
Store 8(i) 19
Branch 10
FunctionEnd
spv.for-simple.vert spv.for-simple.vert
Linked vertex stage: Linked vertex stage:
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
// Id's are bound by 26 // Id's are bound by 26
Capability Shader Capability Shader
1: ExtInstImport "GLSL.std.450" 1: ExtInstImport "GLSL.std.450"
MemoryModel Logical GLSL450 MemoryModel Logical GLSL450
EntryPoint Vertex 4 "main" 24 25 EntryPoint Vertex 4 "main" 24 25
Source ESSL 300 Source ESSL 300
Name 4 "main" Name 4 "main"
Name 8 "i" Name 8 "i"
Name 18 "j" Name 18 "j"
Name 24 "gl_VertexID" Name 24 "gl_VertexID"
Name 25 "gl_InstanceID" Name 25 "gl_InstanceID"
Decorate 24(gl_VertexID) BuiltIn VertexId Decorate 24(gl_VertexID) BuiltIn VertexId
Decorate 25(gl_InstanceID) BuiltIn InstanceId Decorate 25(gl_InstanceID) BuiltIn InstanceId
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeInt 32 1 6: TypeInt 32 1
7: TypePointer Function 6(int) 7: TypePointer Function 6(int)
9: 6(int) Constant 0 9: 6(int) Constant 0
15: 6(int) Constant 10 15: 6(int) Constant 10
16: TypeBool 16: TypeBool
19: 6(int) Constant 12 19: 6(int) Constant 12
21: 6(int) Constant 1 21: 6(int) Constant 1
23: TypePointer Input 6(int) 23: TypePointer Input 6(int)
24(gl_VertexID): 23(ptr) Variable Input 24(gl_VertexID): 23(ptr) Variable Input
25(gl_InstanceID): 23(ptr) Variable Input 25(gl_InstanceID): 23(ptr) Variable Input
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
18(j): 7(ptr) Variable Function 18(j): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
Store 18(j) 19 14: 6(int) Load 8(i)
Branch 12 17: 16(bool) SLessThan 14 15
11: Label LoopMerge 12 13 None
Return BranchConditional 17 11 12
12: Label 11: Label
20: 6(int) Load 8(i) Store 18(j) 19
22: 6(int) IAdd 20 21 Branch 13
Store 8(i) 22 12: Label
Branch 13 Return
13: Label 13: Label
14: 6(int) Load 8(i) 20: 6(int) Load 8(i)
17: 16(bool) SLessThan 14 15 22: 6(int) IAdd 20 21
LoopMerge 11 12 None Store 8(i) 22
BranchConditional 17 10 11 Branch 10
FunctionEnd FunctionEnd
...@@ -159,59 +159,59 @@ Linked fragment stage: ...@@ -159,59 +159,59 @@ Linked fragment stage:
74: 30(ptr) AccessChain 70(localArray) 71 74: 30(ptr) AccessChain 70(localArray) 71
Store 74 73 Store 74 73
Store 75(i) 16 Store 75(i) 16
Branch 79 Branch 76
76: Label 76: Label
84: 6(int) Load 75(i) 80: 6(int) Load 75(i)
86: 30(ptr) AccessChain 83(a) 84 82: 23(bool) SLessThan 80 81
Store 86 85 LoopMerge 78 79 None
Branch 78 BranchConditional 82 77 78
77: Label 77: Label
84: 6(int) Load 75(i)
86: 30(ptr) AccessChain 83(a) 84
Store 86 85
Branch 79
78: Label
90: 6(int) Load 89(condition) 90: 6(int) Load 89(condition)
91: 23(bool) IEqual 90 28 91: 23(bool) IEqual 90 28
SelectionMerge 93 None SelectionMerge 93 None
BranchConditional 91 92 93 BranchConditional 91 92 93
78: Label 79: Label
87: 6(int) Load 75(i) 87: 6(int) Load 75(i)
88: 6(int) IAdd 87 28 88: 6(int) IAdd 87 28
Store 75(i) 88 Store 75(i) 88
Branch 79 Branch 76
79: Label 92: Label
80: 6(int) Load 75(i) 94: 34 Load 70(localArray)
82: 23(bool) SLessThan 80 81 Store 83(a) 94
LoopMerge 77 78 None Branch 93
BranchConditional 82 76 77 93: Label
92: Label 98: 9(fvec4) Load 97(color)
94: 34 Load 70(localArray) 100: 99(ptr) AccessChain 12(locals2) 95
Store 83(a) 94 Store 100 98
Branch 93 102: 42(ptr) AccessChain 40(coord) 101
93: Label 103: 7(float) Load 102
98: 9(fvec4) Load 97(color) 105: 30(ptr) AccessChain 12(locals2) 95 104
100: 99(ptr) AccessChain 12(locals2) 95 Store 105 103
Store 100 98 108: 99(ptr) AccessChain 12(locals2) 95
102: 42(ptr) AccessChain 40(coord) 101 109: 9(fvec4) Load 108
103: 7(float) Load 102 110: 30(ptr) AccessChain 36(localFArray) 37
105: 30(ptr) AccessChain 12(locals2) 95 104 111: 7(float) Load 110
Store 105 103 112: 30(ptr) AccessChain 12(locals2) 27 28
108: 99(ptr) AccessChain 12(locals2) 95 113: 7(float) Load 112
109: 9(fvec4) Load 108 114: 7(float) FAdd 111 113
110: 30(ptr) AccessChain 36(localFArray) 37 115: 6(int) Load 68(x)
111: 7(float) Load 110 116: 30(ptr) AccessChain 70(localArray) 115
112: 30(ptr) AccessChain 12(locals2) 27 28 117: 7(float) Load 116
113: 7(float) Load 112 118: 7(float) FAdd 114 117
114: 7(float) FAdd 111 113 119: 6(int) Load 68(x)
115: 6(int) Load 68(x) 120: 30(ptr) AccessChain 83(a) 119
116: 30(ptr) AccessChain 70(localArray) 115 121: 7(float) Load 120
117: 7(float) Load 116 122: 7(float) FAdd 118 121
118: 7(float) FAdd 114 117 123: 9(fvec4) VectorTimesScalar 109 122
119: 6(int) Load 68(x) 128: 125 Load 127(samp2D)
120: 30(ptr) AccessChain 83(a) 119 129: 38(fvec2) Load 40(coord)
121: 7(float) Load 120 130: 9(fvec4) ImageSampleImplicitLod 128 129
122: 7(float) FAdd 118 121 131: 9(fvec4) FMul 123 130
123: 9(fvec4) VectorTimesScalar 109 122 Store 107(gl_FragColor) 131
128: 125 Load 127(samp2D) Return
129: 38(fvec2) Load 40(coord) FunctionEnd
130: 9(fvec4) ImageSampleImplicitLod 128 129
131: 9(fvec4) FMul 123 130
Store 107(gl_FragColor) 131
Return
FunctionEnd
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -44,45 +44,45 @@ Linked vertex stage: ...@@ -44,45 +44,45 @@ Linked vertex stage:
28(C): 7(ptr) Variable Function 28(C): 7(ptr) Variable Function
38(D): 7(ptr) Variable Function 38(D): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
Store 18(A) 19 14: 6(int) Load 8(i)
20: 6(int) Load 8(i) 17: 16(bool) SLessThan 14 15
22: 6(int) SMod 20 21 LoopMerge 12 13 None
23: 16(bool) IEqual 22 9 BranchConditional 17 11 12
SelectionMerge 25 None
BranchConditional 23 24 25
11: Label 11: Label
Store 38(D) 39 Store 18(A) 19
Return 20: 6(int) Load 8(i)
12: Label 22: 6(int) SMod 20 21
Branch 13 23: 16(bool) IEqual 22 9
13: Label SelectionMerge 25 None
14: 6(int) Load 8(i) BranchConditional 23 24 25
17: 16(bool) SLessThan 14 15 12: Label
LoopMerge 11 12 None Store 38(D) 39
BranchConditional 17 10 11 Return
13: Label
Branch 10
24: Label 24: Label
Store 26(B) 21 Store 26(B) 21
Branch 12 Branch 13
27: Label 27: Label
Store 28(C) 21 Store 28(C) 21
Branch 25 Branch 25
25: Label 25: Label
29: 6(int) Load 8(i) 29: 6(int) Load 8(i)
31: 6(int) SMod 29 30 31: 6(int) SMod 29 30
32: 16(bool) IEqual 31 9 32: 16(bool) IEqual 31 9
SelectionMerge 34 None SelectionMerge 34 None
BranchConditional 32 33 34 BranchConditional 32 33 34
33: Label 33: Label
Store 26(B) 21 Store 26(B) 21
Branch 11
35: Label
Store 28(C) 21
Branch 34
34: Label
36: 6(int) Load 8(i)
37: 6(int) IAdd 36 19
Store 8(i) 37
Branch 12 Branch 12
FunctionEnd 35: Label
Store 28(C) 21
Branch 34
34: Label
36: 6(int) Load 8(i)
37: 6(int) IAdd 36 19
Store 8(i) 37
Branch 13
FunctionEnd
...@@ -33,19 +33,19 @@ Linked vertex stage: ...@@ -33,19 +33,19 @@ Linked vertex stage:
5: Label 5: Label
8(i): 7(ptr) Variable Function 8(i): 7(ptr) Variable Function
Store 8(i) 9 Store 8(i) 9
Branch 13 Branch 10
10: Label 10: Label
18: 6(int) Load 8(i)
20: 6(int) IAdd 18 19
Store 8(i) 20
Branch 12
11: Label
Return
12: Label
Branch 13
13: Label
14: 6(int) Load 8(i) 14: 6(int) Load 8(i)
17: 16(bool) SLessThan 14 15 17: 16(bool) SLessThan 14 15
LoopMerge 11 12 None LoopMerge 12 13 None
BranchConditional 17 10 11 BranchConditional 17 11 12
FunctionEnd 11: Label
18: 6(int) Load 8(i)
20: 6(int) IAdd 18 19
Store 8(i) 20
Branch 13
12: Label
Return
13: Label
Branch 10
FunctionEnd
...@@ -41,24 +41,24 @@ Linked fragment stage: ...@@ -41,24 +41,24 @@ Linked fragment stage:
9(color): 8(ptr) Variable Function 9(color): 8(ptr) Variable Function
12: 7(fvec4) Load 11(BaseColor) 12: 7(fvec4) Load 11(BaseColor)
Store 9(color) 12 Store 9(color) 12
Branch 16 Branch 13
13: Label 13: Label
29: 7(fvec4) Load 28(bigColor)
30: 7(fvec4) Load 9(color)
31: 7(fvec4) FAdd 30 29
Store 9(color) 31
Branch 15
14: Label
34: 7(fvec4) Load 9(color)
Store 33(gl_FragColor) 34
Return
15: Label
Branch 16
16: Label
20: 19(ptr) AccessChain 9(color) 18 20: 19(ptr) AccessChain 9(color) 18
21: 6(float) Load 20 21: 6(float) Load 20
24: 6(float) Load 23(d) 24: 6(float) Load 23(d)
26: 25(bool) FOrdLessThan 21 24 26: 25(bool) FOrdLessThan 21 24
LoopMerge 14 15 None LoopMerge 15 16 None
BranchConditional 26 13 14 BranchConditional 26 14 15
FunctionEnd 14: Label
29: 7(fvec4) Load 28(bigColor)
30: 7(fvec4) Load 9(color)
31: 7(fvec4) FAdd 30 29
Store 9(color) 31
Branch 16
15: Label
34: 7(fvec4) Load 9(color)
Store 33(gl_FragColor) 34
Return
16: Label
Branch 13
FunctionEnd
...@@ -2,5 +2,8 @@ ...@@ -2,5 +2,8 @@
layout(location=0) out highp int r; layout(location=0) out highp int r;
void main() { void main() {
int i; int i;
// This infinite loop results in bad SPIR-V generated, since the merge block
// is dropped as unreachable. It is still useful for testing the rest of the
// code generation.
for (i=0; ; i++) { r = i; } for (i=0; ; i++) { r = i; }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment