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:
David Neto
2015-07-15 16:21:26 -04:00
parent 51b31b5785
commit c22f37cfb4
8 changed files with 1486 additions and 1373 deletions

View File

@@ -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