The loop test is always emitted before the loop body. For do-while loops, use a phi node to track whether we're on the first loop iteration, and only check the loop test on the second and subsequent iterations. For do-while loops, the loop test branch no longer occurs at the top of the loop, so it must get its own selection merge instruction. A block can't be the target of more than one merge instruction. So when the loop test executes after the body (as in do-while in GLSL) we need to introduce a dummy block to be the target of the selection merge just before the loop test conditional branch. The other arm of the branch exits the loop and hence is the "break block" exception in the structured control flow rules.
118 lines
5.3 KiB
Plaintext
118 lines
5.3 KiB
Plaintext
spv.do-while-continue-break.vert
|
|
|
|
Linked vertex stage:
|
|
|
|
|
|
// Module Version 99
|
|
// Generated by (magic number): 51a00bb
|
|
// Id's are bound by 52
|
|
|
|
Source ESSL 300
|
|
1: ExtInstImport "GLSL.std.450"
|
|
MemoryModel Logical GLSL450
|
|
EntryPoint Vertex 4
|
|
Name 4 "main"
|
|
Name 9 "i"
|
|
Name 25 "A"
|
|
Name 31 "B"
|
|
Name 34 "C"
|
|
Name 40 "D"
|
|
Name 43 "E"
|
|
Name 45 "F"
|
|
Name 47 "G"
|
|
Name 50 "gl_VertexID"
|
|
Name 51 "gl_InstanceID"
|
|
Decorate 9(i) PrecisionHigh
|
|
Decorate 25(A) PrecisionHigh
|
|
Decorate 31(B) PrecisionHigh
|
|
Decorate 34(C) PrecisionHigh
|
|
Decorate 40(D) PrecisionHigh
|
|
Decorate 43(E) PrecisionHigh
|
|
Decorate 45(F) PrecisionHigh
|
|
Decorate 47(G) PrecisionHigh
|
|
Decorate 50(gl_VertexID) PrecisionHigh
|
|
Decorate 50(gl_VertexID) BuiltIn VertexId
|
|
Decorate 50(gl_VertexID) NoStaticUse
|
|
Decorate 51(gl_InstanceID) PrecisionHigh
|
|
Decorate 51(gl_InstanceID) BuiltIn InstanceId
|
|
Decorate 51(gl_InstanceID) NoStaticUse
|
|
2: TypeVoid
|
|
3: TypeFunction 2
|
|
7: TypeInt 32 1
|
|
8: TypePointer Function 7(int)
|
|
10: 7(int) Constant 0
|
|
14: TypeBool
|
|
15: 14(bool) ConstantTrue
|
|
20: 7(int) Constant 1
|
|
22: 7(int) Constant 19
|
|
27: 7(int) Constant 2
|
|
32: 14(bool) ConstantFalse
|
|
36: 7(int) Constant 5
|
|
41: 7(int) Constant 3
|
|
44: 7(int) Constant 42
|
|
46: 7(int) Constant 99
|
|
48: 7(int) Constant 12
|
|
49: TypePointer Input 7(int)
|
|
50(gl_VertexID): 49(ptr) Variable Input
|
|
51(gl_InstanceID): 49(ptr) Variable Input
|
|
4(main): 2 Function None 3
|
|
5: Label
|
|
9(i): 8(ptr) Variable Function
|
|
25(A): 8(ptr) Variable Function
|
|
31(B): 8(ptr) Variable Function
|
|
34(C): 8(ptr) Variable Function
|
|
40(D): 8(ptr) Variable Function
|
|
43(E): 8(ptr) Variable Function
|
|
45(F): 8(ptr) Variable Function
|
|
47(G): 8(ptr) Variable Function
|
|
Store 9(i) 10
|
|
Branch 11
|
|
11: Label
|
|
13: 14(bool) Phi 15 5 32 29 32 39
|
|
LoopMerge 12 None
|
|
Branch 16
|
|
16: Label
|
|
SelectionMerge 17 None
|
|
BranchConditional 13 17 18
|
|
18: Label
|
|
19: 7(int) Load 9(i)
|
|
21: 7(int) IAdd 19 20
|
|
Store 9(i) 21
|
|
23: 14(bool) SLessThan 21 22
|
|
SelectionMerge 24 None
|
|
BranchConditional 23 24 12
|
|
24: Label
|
|
Branch 17
|
|
17: Label
|
|
Store 25(A) 10
|
|
26: 7(int) Load 9(i)
|
|
28: 14(bool) IEqual 26 27
|
|
SelectionMerge 30 None
|
|
BranchConditional 28 29 30
|
|
29: Label
|
|
Store 31(B) 20
|
|
Branch 11
|
|
33: Label
|
|
Store 34(C) 27
|
|
Branch 30
|
|
30: Label
|
|
35: 7(int) Load 9(i)
|
|
37: 14(bool) IEqual 35 36
|
|
SelectionMerge 39 None
|
|
BranchConditional 37 38 39
|
|
38: Label
|
|
Store 40(D) 41
|
|
Branch 12
|
|
42: Label
|
|
Store 43(E) 44
|
|
Branch 39
|
|
39: Label
|
|
Store 45(F) 46
|
|
Branch 11
|
|
12: Label
|
|
Store 47(G) 48
|
|
Branch 6
|
|
6: Label
|
|
Return
|
|
FunctionEnd
|