Generate correctly structured do-while loops.
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.
This commit is contained in:
@@ -5,7 +5,7 @@ Linked vertex stage:
|
||||
|
||||
// Module Version 99
|
||||
// Generated by (magic number): 51a00bb
|
||||
// Id's are bound by 48
|
||||
// Id's are bound by 52
|
||||
|
||||
Source ESSL 300
|
||||
1: ExtInstImport "GLSL.std.450"
|
||||
@@ -13,97 +13,104 @@ Linked vertex stage:
|
||||
EntryPoint Vertex 4
|
||||
Name 4 "main"
|
||||
Name 9 "i"
|
||||
Name 15 "A"
|
||||
Name 22 "B"
|
||||
Name 25 "C"
|
||||
Name 31 "D"
|
||||
Name 34 "E"
|
||||
Name 36 "F"
|
||||
Name 43 "G"
|
||||
Name 46 "gl_VertexID"
|
||||
Name 47 "gl_InstanceID"
|
||||
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 15(A) PrecisionHigh
|
||||
Decorate 22(B) PrecisionHigh
|
||||
Decorate 25(C) PrecisionHigh
|
||||
Decorate 31(D) PrecisionHigh
|
||||
Decorate 34(E) PrecisionHigh
|
||||
Decorate 36(F) PrecisionHigh
|
||||
Decorate 43(G) PrecisionHigh
|
||||
Decorate 46(gl_VertexID) PrecisionHigh
|
||||
Decorate 46(gl_VertexID) BuiltIn VertexId
|
||||
Decorate 46(gl_VertexID) NoStaticUse
|
||||
Decorate 47(gl_InstanceID) PrecisionHigh
|
||||
Decorate 47(gl_InstanceID) BuiltIn InstanceId
|
||||
Decorate 47(gl_InstanceID) NoStaticUse
|
||||
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
|
||||
17: 7(int) Constant 2
|
||||
18: TypeBool
|
||||
23: 7(int) Constant 1
|
||||
27: 7(int) Constant 5
|
||||
32: 7(int) Constant 3
|
||||
35: 7(int) Constant 42
|
||||
37: 7(int) Constant 99
|
||||
40: 7(int) Constant 19
|
||||
44: 7(int) Constant 12
|
||||
45: TypePointer Input 7(int)
|
||||
46(gl_VertexID): 45(ptr) Variable Input
|
||||
47(gl_InstanceID): 45(ptr) Variable Input
|
||||
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
|
||||
15(A): 8(ptr) Variable Function
|
||||
22(B): 8(ptr) Variable Function
|
||||
25(C): 8(ptr) Variable Function
|
||||
31(D): 8(ptr) Variable Function
|
||||
34(E): 8(ptr) Variable Function
|
||||
36(F): 8(ptr) Variable Function
|
||||
43(G): 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 13
|
||||
13: Label
|
||||
Store 15(A) 10
|
||||
16: 7(int) Load 9(i)
|
||||
19: 18(bool) IEqual 16 17
|
||||
SelectionMerge 21 None
|
||||
BranchConditional 19 20 21
|
||||
20: Label
|
||||
Store 22(B) 23
|
||||
Branch 14
|
||||
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
|
||||
Store 25(C) 17
|
||||
Branch 21
|
||||
21: Label
|
||||
Branch 17
|
||||
17: Label
|
||||
Store 25(A) 10
|
||||
26: 7(int) Load 9(i)
|
||||
28: 18(bool) IEqual 26 27
|
||||
28: 14(bool) IEqual 26 27
|
||||
SelectionMerge 30 None
|
||||
BranchConditional 28 29 30
|
||||
29: Label
|
||||
Store 31(D) 32
|
||||
Branch 12
|
||||
Store 31(B) 20
|
||||
Branch 11
|
||||
33: Label
|
||||
Store 34(E) 35
|
||||
Store 34(C) 27
|
||||
Branch 30
|
||||
30: Label
|
||||
Store 36(F) 37
|
||||
Branch 14
|
||||
14: Label
|
||||
38: 7(int) Load 9(i)
|
||||
39: 7(int) IAdd 38 23
|
||||
Store 9(i) 39
|
||||
41: 18(bool) SLessThan 39 40
|
||||
BranchConditional 41 42 12
|
||||
42: 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 43(G) 44
|
||||
Store 47(G) 48
|
||||
Branch 6
|
||||
6: Label
|
||||
Return
|
||||
|
||||
Reference in New Issue
Block a user