diff --git a/Test/baseResults/hlsl.struct.split.nested.geom.out b/Test/baseResults/hlsl.struct.split.nested.geom.out
index 2f010f5e0ee754d45dc98962b0e1fce9be79edd8..9cb61ca0a1288166066e616b6a8dfc89909220d7 100644
--- a/Test/baseResults/hlsl.struct.split.nested.geom.out
+++ b/Test/baseResults/hlsl.struct.split.nested.geom.out
@@ -34,42 +34,78 @@ output primitive = triangle_strip
 0:?         Constant:
 0:?           5.000000
 0:?           6.000000
-0:30      Sequence
-0:30        Sequence
-0:30          move second child to first child ( temp 4-component vector of float)
-0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
-0:30            pos: direct index for structure ( temp 4-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30          move second child to first child ( temp 2-component vector of float)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
-0:30                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                1 (const int)
-0:30          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30              Constant:
-0:30                1 (const int)
+0:29      move second child to first child ( temp float)
+0:29        direct index ( temp float)
+0:29          m0_array: direct index for structure ( temp 2-element array of float)
+0:29            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:29              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:29              Constant:
+0:29                1 (const int)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Constant:
+0:29            0 (const int)
+0:29        Constant:
+0:29          2.300000
+0:30      move second child to first child ( temp float)
+0:30        direct index ( temp float)
+0:30          m0_array: direct index for structure ( temp 2-element array of float)
 0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
 0:30              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:30              Constant:
 0:30                1 (const int)
-0:30        EmitVertex ( temp void)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        Constant:
+0:30          2.300000
+0:31      move second child to first child ( temp int)
+0:31        m1: direct index for structure ( temp int)
+0:31          contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:31            'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:31            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            1 (const int)
+0:31        Constant:
+0:31          2 (const int)
+0:33      Sequence
+0:33        Sequence
+0:33          move second child to first child ( temp 4-component vector of float)
+0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
+0:33            pos: direct index for structure ( temp 4-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp 2-component vector of float)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
+0:33                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33              Constant:
+0:33                1 (const int)
+0:33            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33              Constant:
+0:33                1 (const int)
+0:33        EmitVertex ( temp void)
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
@@ -201,42 +237,78 @@ output primitive = triangle_strip
 0:?         Constant:
 0:?           5.000000
 0:?           6.000000
-0:30      Sequence
-0:30        Sequence
-0:30          move second child to first child ( temp 4-component vector of float)
-0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
-0:30            pos: direct index for structure ( temp 4-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30          move second child to first child ( temp 2-component vector of float)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
-0:30                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                0 (const int)
-0:30            tc: direct index for structure ( temp 2-component vector of float)
-0:30              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
-0:30                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30                Constant:
-0:30                  0 (const int)
-0:30              Constant:
-0:30                1 (const int)
-0:30          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
-0:30              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
-0:30              Constant:
-0:30                1 (const int)
+0:29      move second child to first child ( temp float)
+0:29        direct index ( temp float)
+0:29          m0_array: direct index for structure ( temp 2-element array of float)
+0:29            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:29              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:29              Constant:
+0:29                1 (const int)
+0:29            Constant:
+0:29              0 (const int)
+0:29          Constant:
+0:29            0 (const int)
+0:29        Constant:
+0:29          2.300000
+0:30      move second child to first child ( temp float)
+0:30        direct index ( temp float)
+0:30          m0_array: direct index for structure ( temp 2-element array of float)
 0:30            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
 0:30              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
 0:30              Constant:
 0:30                1 (const int)
-0:30        EmitVertex ( temp void)
+0:30            Constant:
+0:30              0 (const int)
+0:30          Constant:
+0:30            1 (const int)
+0:30        Constant:
+0:30          2.300000
+0:31      move second child to first child ( temp int)
+0:31        m1: direct index for structure ( temp int)
+0:31          contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:31            'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:31            Constant:
+0:31              1 (const int)
+0:31          Constant:
+0:31            1 (const int)
+0:31        Constant:
+0:31          2 (const int)
+0:33      Sequence
+0:33        Sequence
+0:33          move second child to first child ( temp 4-component vector of float)
+0:?             'ts_psIn_pos' ( out 4-component vector of float Position)
+0:33            pos: direct index for structure ( temp 4-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33          move second child to first child ( temp 2-component vector of float)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 2-component vector of float tc})
+0:33                'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                0 (const int)
+0:33            tc: direct index for structure ( temp 2-component vector of float)
+0:33              psIn: direct index for structure ( temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc})
+0:33                'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33                Constant:
+0:33                  0 (const int)
+0:33              Constant:
+0:33                1 (const int)
+0:33          move second child to first child ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33              'ts' (layout( location=0) out structure{ temp structure{ temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33              Constant:
+0:33                1 (const int)
+0:33            contains_no_builtin_io: direct index for structure ( temp structure{ temp 2-element array of float m0_array,  temp int m1})
+0:33              'o' ( temp structure{ temp structure{ temp 4-component vector of float pos,  temp 2-component vector of float tc} psIn,  temp structure{ temp 2-element array of float m0_array,  temp int m1} contains_no_builtin_io})
+0:33              Constant:
+0:33                1 (const int)
+0:33        EmitVertex ( temp void)
 0:24  Function Definition: main( ( temp void)
 0:24    Function Parameters: 
 0:?     Sequence
@@ -331,12 +403,12 @@ output primitive = triangle_strip
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 99
+// Id's are bound by 105
 
                               Capability Geometry
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Geometry 4  "main" 41 48 67 75
+                              EntryPoint Geometry 4  "main" 48 55 74 82
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 Invocations 1
                               ExecutionMode 4 OutputTriangleStrip
@@ -356,28 +428,28 @@ output primitive = triangle_strip
                               Name 21  "tin"
                               Name 22  "ts"
                               Name 25  "o"
-                              Name 41  "ts_psIn_pos"
-                              Name 44  "PS_IN"
-                              MemberName 44(PS_IN) 0  "tc"
-                              Name 45  "STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO"
-                              MemberName 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 0  "m0_array"
-                              MemberName 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 1  "m1"
-                              Name 46  "GS_OUT"
-                              MemberName 46(GS_OUT) 0  "psIn"
-                              MemberName 46(GS_OUT) 1  "contains_no_builtin_io"
-                              Name 48  "ts"
-                              Name 64  "tin"
-                              Name 67  "tin_pos"
-                              Name 72  "PS_IN"
-                              MemberName 72(PS_IN) 0  "tc"
-                              Name 75  "tin"
-                              Name 93  "ts"
-                              Name 94  "param"
-                              Name 96  "param"
-                              Decorate 41(ts_psIn_pos) BuiltIn Position
-                              Decorate 48(ts) Location 0
-                              Decorate 67(tin_pos) BuiltIn Position
-                              Decorate 75(tin) Location 0
+                              Name 48  "ts_psIn_pos"
+                              Name 51  "PS_IN"
+                              MemberName 51(PS_IN) 0  "tc"
+                              Name 52  "STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO"
+                              MemberName 52(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 0  "m0_array"
+                              MemberName 52(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) 1  "m1"
+                              Name 53  "GS_OUT"
+                              MemberName 53(GS_OUT) 0  "psIn"
+                              MemberName 53(GS_OUT) 1  "contains_no_builtin_io"
+                              Name 55  "ts"
+                              Name 71  "tin"
+                              Name 74  "tin_pos"
+                              Name 79  "PS_IN"
+                              MemberName 79(PS_IN) 0  "tc"
+                              Name 82  "tin"
+                              Name 99  "ts"
+                              Name 100  "param"
+                              Name 102  "param"
+                              Decorate 48(ts_psIn_pos) BuiltIn Position
+                              Decorate 55(ts) Location 0
+                              Decorate 74(tin_pos) BuiltIn Position
+                              Decorate 82(tin) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -407,63 +479,66 @@ output primitive = triangle_strip
               36:    6(float) Constant 1086324736
               37:    8(fvec2) ConstantComposite 35 36
               38:             TypePointer Function 8(fvec2)
-              40:             TypePointer Output 7(fvec4)
- 41(ts_psIn_pos):     40(ptr) Variable Output
-       44(PS_IN):             TypeStruct 8(fvec2)
-45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO):             TypeStruct 15 16(int)
-      46(GS_OUT):             TypeStruct 44(PS_IN) 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              47:             TypePointer Output 46(GS_OUT)
-          48(ts):     47(ptr) Variable Output
-              51:             TypePointer Output 8(fvec2)
-              53:             TypePointer Function 17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              56:             TypePointer Output 45(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
-              59:             TypePointer Output 15
-              62:             TypePointer Output 16(int)
-              65:             TypeArray 7(fvec4) 11
-              66:             TypePointer Input 65
-     67(tin_pos):     66(ptr) Variable Input
-              68:             TypePointer Input 7(fvec4)
-       72(PS_IN):             TypeStruct 8(fvec2)
-              73:             TypeArray 72(PS_IN) 11
-              74:             TypePointer Input 73
-         75(tin):     74(ptr) Variable Input
-              76:             TypePointer Input 8(fvec2)
-              86:     16(int) Constant 2
+              40:    6(float) Constant 1075000115
+              41:             TypePointer Function 6(float)
+              44:     16(int) Constant 2
+              45:             TypePointer Function 16(int)
+              47:             TypePointer Output 7(fvec4)
+ 48(ts_psIn_pos):     47(ptr) Variable Output
+       51(PS_IN):             TypeStruct 8(fvec2)
+52(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO):             TypeStruct 15 16(int)
+      53(GS_OUT):             TypeStruct 51(PS_IN) 52(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
+              54:             TypePointer Output 53(GS_OUT)
+          55(ts):     54(ptr) Variable Output
+              58:             TypePointer Output 8(fvec2)
+              60:             TypePointer Function 17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
+              63:             TypePointer Output 52(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO)
+              66:             TypePointer Output 15
+              69:             TypePointer Output 16(int)
+              72:             TypeArray 7(fvec4) 11
+              73:             TypePointer Input 72
+     74(tin_pos):     73(ptr) Variable Input
+              75:             TypePointer Input 7(fvec4)
+       79(PS_IN):             TypeStruct 8(fvec2)
+              80:             TypeArray 79(PS_IN) 11
+              81:             TypePointer Input 80
+         82(tin):     81(ptr) Variable Input
+              83:             TypePointer Input 8(fvec2)
          4(main):           2 Function None 3
                5:             Label
-         64(tin):     13(ptr) Variable Function
-          93(ts):     19(ptr) Variable Function
-       94(param):     13(ptr) Variable Function
-       96(param):     19(ptr) Variable Function
-              69:     68(ptr) AccessChain 67(tin_pos) 26
-              70:    7(fvec4) Load 69
-              71:     32(ptr) AccessChain 64(tin) 26 26
-                              Store 71 70
-              77:     76(ptr) AccessChain 75(tin) 26 26
-              78:    8(fvec2) Load 77
-              79:     38(ptr) AccessChain 64(tin) 26 34
-                              Store 79 78
-              80:     68(ptr) AccessChain 67(tin_pos) 34
-              81:    7(fvec4) Load 80
-              82:     32(ptr) AccessChain 64(tin) 34 26
-                              Store 82 81
-              83:     76(ptr) AccessChain 75(tin) 34 26
-              84:    8(fvec2) Load 83
-              85:     38(ptr) AccessChain 64(tin) 34 34
-                              Store 85 84
-              87:     68(ptr) AccessChain 67(tin_pos) 86
+         71(tin):     13(ptr) Variable Function
+          99(ts):     19(ptr) Variable Function
+      100(param):     13(ptr) Variable Function
+      102(param):     19(ptr) Variable Function
+              76:     75(ptr) AccessChain 74(tin_pos) 26
+              77:    7(fvec4) Load 76
+              78:     32(ptr) AccessChain 71(tin) 26 26
+                              Store 78 77
+              84:     83(ptr) AccessChain 82(tin) 26 26
+              85:    8(fvec2) Load 84
+              86:     38(ptr) AccessChain 71(tin) 26 34
+                              Store 86 85
+              87:     75(ptr) AccessChain 74(tin_pos) 34
               88:    7(fvec4) Load 87
-              89:     32(ptr) AccessChain 64(tin) 86 26
+              89:     32(ptr) AccessChain 71(tin) 34 26
                               Store 89 88
-              90:     76(ptr) AccessChain 75(tin) 86 26
+              90:     83(ptr) AccessChain 82(tin) 34 26
               91:    8(fvec2) Load 90
-              92:     38(ptr) AccessChain 64(tin) 86 34
+              92:     38(ptr) AccessChain 71(tin) 34 34
                               Store 92 91
-              95:          12 Load 64(tin)
-                              Store 94(param) 95
-              97:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 94(param) 96(param)
-              98:  18(GS_OUT) Load 96(param)
-                              Store 93(ts) 98
+              93:     75(ptr) AccessChain 74(tin_pos) 44
+              94:    7(fvec4) Load 93
+              95:     32(ptr) AccessChain 71(tin) 44 26
+                              Store 95 94
+              96:     83(ptr) AccessChain 82(tin) 44 26
+              97:    8(fvec2) Load 96
+              98:     38(ptr) AccessChain 71(tin) 44 34
+                              Store 98 97
+             101:          12 Load 71(tin)
+                              Store 100(param) 101
+             103:           2 FunctionCall 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;) 100(param) 102(param)
+             104:  18(GS_OUT) Load 102(param)
+                              Store 99(ts) 104
                               Return
                               FunctionEnd
 23(@main(struct-PS_IN-vf4-vf21[3];struct-GS_OUT-struct-PS_IN-vf4-vf21-struct-STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO-f1[2]-i111;):           2 Function None 20
@@ -475,22 +550,28 @@ output primitive = triangle_strip
                               Store 33 31
               39:     38(ptr) AccessChain 25(o) 26 34
                               Store 39 37
-              42:     32(ptr) AccessChain 25(o) 26 26
-              43:    7(fvec4) Load 42
-                              Store 41(ts_psIn_pos) 43
-              49:     38(ptr) AccessChain 25(o) 26 34
-              50:    8(fvec2) Load 49
-              52:     51(ptr) AccessChain 48(ts) 26 26
-                              Store 52 50
-              54:     53(ptr) AccessChain 25(o) 34
-              55:17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) Load 54
-              57:     56(ptr) AccessChain 48(ts) 34
-              58:          15 CompositeExtract 55 0
-              60:     59(ptr) AccessChain 57 26
-                              Store 60 58
-              61:     16(int) CompositeExtract 55 1
-              63:     62(ptr) AccessChain 57 34
-                              Store 63 61
+              42:     41(ptr) AccessChain 25(o) 34 26 26
+                              Store 42 40
+              43:     41(ptr) AccessChain 25(o) 34 26 34
+                              Store 43 40
+              46:     45(ptr) AccessChain 25(o) 34 34
+                              Store 46 44
+              49:     32(ptr) AccessChain 25(o) 26 26
+              50:    7(fvec4) Load 49
+                              Store 48(ts_psIn_pos) 50
+              56:     38(ptr) AccessChain 25(o) 26 34
+              57:    8(fvec2) Load 56
+              59:     58(ptr) AccessChain 55(ts) 26 26
+                              Store 59 57
+              61:     60(ptr) AccessChain 25(o) 34
+              62:17(STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO) Load 61
+              64:     63(ptr) AccessChain 55(ts) 34
+              65:          15 CompositeExtract 62 0
+              67:     66(ptr) AccessChain 64 26
+                              Store 67 65
+              68:     16(int) CompositeExtract 62 1
+              70:     69(ptr) AccessChain 64 34
+                              Store 70 68
                               EmitVertex
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/hlsl.structin.vert.out b/Test/baseResults/hlsl.structin.vert.out
index 8378de216e01569fcd3bb5e3370a5f2f1a8ff492..ff6b37aee0f6b201fdcc4aea12f1072b08662315 100755
--- a/Test/baseResults/hlsl.structin.vert.out
+++ b/Test/baseResults/hlsl.structin.vert.out
@@ -1,15 +1,15 @@
 hlsl.structin.vert
 Shader version: 500
 0:? Sequence
-0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8    Function Parameters: 
 0:8      'd' ( in 4-component vector of float)
-0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8      'e' ( in 4-component vector of float)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of float)
 0:11        b: direct index for structure ( temp 4-component vector of float)
-0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11          Constant:
 0:11            2 (const int)
 0:11        add ( temp 4-component vector of float)
@@ -18,31 +18,66 @@ Shader version: 500
 0:11              add ( temp 4-component vector of float)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    1 (const int)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    0 (const int)
 0:11              Construct vec4 ( temp 4-component vector of float)
-0:11                Convert uint to float ( temp float)
-0:11                  direct index ( temp uint)
-0:11                    coord: direct index for structure ( temp 2-component vector of uint)
-0:11                      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:11                      Constant:
-0:11                        1 (const int)
+0:11                direct index ( temp float)
+0:11                  coord: direct index for structure ( temp 4-component vector of float)
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
-0:11                      0 (const int)
+0:11                      1 (const int)
+0:11                  Constant:
+0:11                    0 (const int)
 0:11            'd' ( in 4-component vector of float)
 0:11          'e' ( in 4-component vector of float)
-0:13      Branch: Return with expression
-0:13        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        coord: direct index for structure ( temp 4-component vector of float)
+0:12          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index ( temp 4-component vector of float)
+0:13          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:13            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:13            Constant:
+0:13              0 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        direct index ( temp 4-component vector of float)
+0:14          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:14            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:16      Branch: Return with expression
+0:16        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8  Function Definition: main( ( temp void)
 0:8    Function Parameters: 
 0:?     Sequence
@@ -53,7 +88,7 @@ Shader version: 500
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
@@ -62,21 +97,21 @@ Shader version: 500
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
 0:?           'm[1]' (layout( location=2) in 4-component vector of float)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
-0:?           'coord' (layout( location=3) in 2-component vector of uint)
+0:?           'coord' (layout( location=3) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?           'b' (layout( location=4) in 4-component vector of float)
@@ -84,47 +119,44 @@ Shader version: 500
 0:?         'e' ( temp 4-component vector of float)
 0:?         'e' (layout( location=5) in 4-component vector of float)
 0:8      Sequence
-0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'd' ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'e' ( temp 4-component vector of float)
 0:8        move second child to first child ( temp 2-element array of 4-component vector of float)
 0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:8            Constant:
 0:8              0 (const int)
 0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              0 (const int)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              1 (const int)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput_coord' ( out 4-component vector of float Position)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
 0:8        move second child to first child ( temp 4-component vector of float)
-0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8          b: direct index for structure ( smooth temp 4-component vector of float)
+0:8            '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:8            Constant:
-0:8              2 (const int)
+0:8              1 (const int)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:?     'd' (layout( location=0) in 4-component vector of float)
 0:?     'm[0]' (layout( location=1) in 4-component vector of float)
 0:?     'm[1]' (layout( location=2) in 4-component vector of float)
 0:?     'm[0]' (layout( location=1) in 4-component vector of float)
 0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'coord' (layout( location=3) in 2-component vector of uint)
+0:?     'coord' (layout( location=3) in 4-component vector of float)
 0:?     'b' (layout( location=4) in 4-component vector of float)
 0:?     'e' (layout( location=5) in 4-component vector of float)
 
@@ -134,15 +166,15 @@ Linked vertex stage:
 
 Shader version: 500
 0:? Sequence
-0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8  Function Definition: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8    Function Parameters: 
 0:8      'd' ( in 4-component vector of float)
-0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8      'e' ( in 4-component vector of float)
 0:?     Sequence
 0:11      move second child to first child ( temp 4-component vector of float)
 0:11        b: direct index for structure ( temp 4-component vector of float)
-0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11          Constant:
 0:11            2 (const int)
 0:11        add ( temp 4-component vector of float)
@@ -151,31 +183,66 @@ Shader version: 500
 0:11              add ( temp 4-component vector of float)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    1 (const int)
 0:11                direct index ( temp 4-component vector of float)
 0:11                  m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
 0:11                      0 (const int)
 0:11                  Constant:
 0:11                    0 (const int)
 0:11              Construct vec4 ( temp 4-component vector of float)
-0:11                Convert uint to float ( temp float)
-0:11                  direct index ( temp uint)
-0:11                    coord: direct index for structure ( temp 2-component vector of uint)
-0:11                      'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:11                      Constant:
-0:11                        1 (const int)
+0:11                direct index ( temp float)
+0:11                  coord: direct index for structure ( temp 4-component vector of float)
+0:11                    'vi' ( in structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:11                    Constant:
-0:11                      0 (const int)
+0:11                      1 (const int)
+0:11                  Constant:
+0:11                    0 (const int)
 0:11            'd' ( in 4-component vector of float)
 0:11          'e' ( in 4-component vector of float)
-0:13      Branch: Return with expression
-0:13        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:12      move second child to first child ( temp 4-component vector of float)
+0:12        coord: direct index for structure ( temp 4-component vector of float)
+0:12          'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:12          Constant:
+0:12            1 (const int)
+0:12        Constant:
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:12          1.000000
+0:13      move second child to first child ( temp 4-component vector of float)
+0:13        direct index ( temp 4-component vector of float)
+0:13          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:13            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:13            Constant:
+0:13              0 (const int)
+0:13          Constant:
+0:13            0 (const int)
+0:13        Constant:
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:13          2.000000
+0:14      move second child to first child ( temp 4-component vector of float)
+0:14        direct index ( temp 4-component vector of float)
+0:14          m: direct index for structure ( temp 2-element array of 4-component vector of float)
+0:14            'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:14            Constant:
+0:14              0 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:14        Constant:
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:14          3.000000
+0:16      Branch: Return with expression
+0:16        'local' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8  Function Definition: main( ( temp void)
 0:8    Function Parameters: 
 0:?     Sequence
@@ -186,7 +253,7 @@ Shader version: 500
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
@@ -195,21 +262,21 @@ Shader version: 500
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          direct index ( temp 4-component vector of float)
 0:8            m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?               'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8              Constant:
 0:8                0 (const int)
 0:8            Constant:
 0:8              1 (const int)
 0:?           'm[1]' (layout( location=2) in 4-component vector of float)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
-0:?           'coord' (layout( location=3) in 2-component vector of uint)
+0:?           'coord' (layout( location=3) in 4-component vector of float)
 0:8        move second child to first child ( temp 4-component vector of float)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?           'b' (layout( location=4) in 4-component vector of float)
@@ -217,94 +284,92 @@ Shader version: 500
 0:?         'e' ( temp 4-component vector of float)
 0:?         'e' (layout( location=5) in 4-component vector of float)
 0:8      Sequence
-0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
+0:8          Function Call: @main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4; ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'd' ( temp 4-component vector of float)
-0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?             'vi' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:?             'e' ( temp 4-component vector of float)
 0:8        move second child to first child ( temp 2-element array of 4-component vector of float)
 0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:8            Constant:
 0:8              0 (const int)
 0:8          m: direct index for structure ( temp 2-element array of 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              0 (const int)
-0:8        move second child to first child ( temp 2-component vector of uint)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
-0:8            Constant:
-0:8              1 (const int)
-0:8          coord: direct index for structure ( temp 2-component vector of uint)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8        move second child to first child ( temp 4-component vector of float)
+0:?           '@entryPointOutput_coord' ( out 4-component vector of float Position)
+0:8          coord: direct index for structure ( temp 4-component vector of float)
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              1 (const int)
 0:8        move second child to first child ( temp 4-component vector of float)
-0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8          b: direct index for structure ( smooth temp 4-component vector of float)
+0:8            '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:8            Constant:
-0:8              2 (const int)
+0:8              1 (const int)
 0:8          b: direct index for structure ( temp 4-component vector of float)
-0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:8            'flattenTemp' ( temp structure{ temp 2-element array of 4-component vector of float m,  temp 4-component vector of float coord,  temp 4-component vector of float b})
 0:8            Constant:
 0:8              2 (const int)
 0:?   Linker Objects
-0:?     '@entryPointOutput' ( out structure Position{ temp 2-element array of 4-component vector of float m,  temp 2-component vector of uint coord,  temp 4-component vector of float b})
+0:?     '@entryPointOutput' (layout( location=0) out structure{ temp 2-element array of 4-component vector of float m,  smooth temp 4-component vector of float b})
 0:?     'd' (layout( location=0) in 4-component vector of float)
 0:?     'm[0]' (layout( location=1) in 4-component vector of float)
 0:?     'm[1]' (layout( location=2) in 4-component vector of float)
 0:?     'm[0]' (layout( location=1) in 4-component vector of float)
 0:?     'm[1]' (layout( location=2) in 4-component vector of float)
-0:?     'coord' (layout( location=3) in 2-component vector of uint)
+0:?     'coord' (layout( location=3) in 4-component vector of float)
 0:?     'b' (layout( location=4) in 4-component vector of float)
 0:?     'e' (layout( location=5) in 4-component vector of float)
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 92
+// Id's are bound by 96
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 48 51 54 58 62 66 78
+                              EntryPoint Vertex 4  "main" 55 58 61 64 67 71 83 90
                               Source HLSL 500
                               Name 4  "main"
-                              Name 13  "VI"
-                              MemberName 13(VI) 0  "m"
-                              MemberName 13(VI) 1  "coord"
-                              MemberName 13(VI) 2  "b"
-                              Name 19  "@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;"
-                              Name 16  "d"
-                              Name 17  "vi"
-                              Name 18  "e"
-                              Name 21  "local"
-                              Name 46  "d"
-                              Name 48  "d"
-                              Name 50  "vi"
-                              Name 51  "m[0]"
-                              Name 54  "m[1]"
-                              Name 58  "coord"
-                              Name 62  "b"
-                              Name 65  "e"
-                              Name 66  "e"
-                              Name 68  "flattenTemp"
-                              Name 69  "param"
-                              Name 71  "param"
-                              Name 73  "param"
-                              Name 76  "VI"
-                              MemberName 76(VI) 0  "m"
-                              MemberName 76(VI) 1  "coord"
-                              MemberName 76(VI) 2  "b"
-                              Name 78  "@entryPointOutput"
-                              Decorate 48(d) Location 0
-                              Decorate 51(m[0]) Location 1
-                              Decorate 54(m[1]) Location 2
-                              Decorate 58(coord) Location 3
-                              Decorate 62(b) Location 4
-                              Decorate 66(e) Location 5
-                              Decorate 78(@entryPointOutput) BuiltIn Position
+                              Name 12  "VI"
+                              MemberName 12(VI) 0  "m"
+                              MemberName 12(VI) 1  "coord"
+                              MemberName 12(VI) 2  "b"
+                              Name 18  "@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;"
+                              Name 15  "d"
+                              Name 16  "vi"
+                              Name 17  "e"
+                              Name 20  "local"
+                              Name 53  "d"
+                              Name 55  "d"
+                              Name 57  "vi"
+                              Name 58  "m[0]"
+                              Name 61  "m[1]"
+                              Name 64  "coord"
+                              Name 67  "b"
+                              Name 70  "e"
+                              Name 71  "e"
+                              Name 73  "flattenTemp"
+                              Name 74  "param"
+                              Name 76  "param"
+                              Name 78  "param"
+                              Name 81  "VI"
+                              MemberName 81(VI) 0  "m"
+                              MemberName 81(VI) 1  "b"
+                              Name 83  "@entryPointOutput"
+                              Name 90  "@entryPointOutput_coord"
+                              Decorate 55(d) Location 0
+                              Decorate 58(m[0]) Location 1
+                              Decorate 61(m[1]) Location 2
+                              Decorate 64(coord) Location 3
+                              Decorate 67(b) Location 4
+                              Decorate 71(e) Location 5
+                              Decorate 83(@entryPointOutput) Location 0
+                              Decorate 90(@entryPointOutput_coord) BuiltIn Position
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -313,101 +378,108 @@ Shader version: 500
                9:             TypeInt 32 0
               10:      9(int) Constant 2
               11:             TypeArray 7(fvec4) 10
-              12:             TypeVector 9(int) 2
-          13(VI):             TypeStruct 11 12(ivec2) 7(fvec4)
-              14:             TypePointer Function 13(VI)
-              15:             TypeFunction 13(VI) 8(ptr) 14(ptr) 8(ptr)
-              22:             TypeInt 32 1
-              23:     22(int) Constant 2
-              24:     22(int) Constant 0
-              25:     22(int) Constant 1
-              31:      9(int) Constant 0
-              32:             TypePointer Function 9(int)
-              47:             TypePointer Input 7(fvec4)
-           48(d):     47(ptr) Variable Input
-        51(m[0]):     47(ptr) Variable Input
-        54(m[1]):     47(ptr) Variable Input
-              57:             TypePointer Input 12(ivec2)
-       58(coord):     57(ptr) Variable Input
-              60:             TypePointer Function 12(ivec2)
-           62(b):     47(ptr) Variable Input
-           66(e):     47(ptr) Variable Input
-          76(VI):             TypeStruct 11 12(ivec2) 7(fvec4)
-              77:             TypePointer Output 76(VI)
-78(@entryPointOutput):     77(ptr) Variable Output
-              79:             TypePointer Function 11
-              82:             TypePointer Output 11
-              86:             TypePointer Output 12(ivec2)
-              90:             TypePointer Output 7(fvec4)
+          12(VI):             TypeStruct 11 7(fvec4) 7(fvec4)
+              13:             TypePointer Function 12(VI)
+              14:             TypeFunction 12(VI) 8(ptr) 13(ptr) 8(ptr)
+              21:             TypeInt 32 1
+              22:     21(int) Constant 2
+              23:     21(int) Constant 0
+              24:     21(int) Constant 1
+              30:      9(int) Constant 0
+              31:             TypePointer Function 6(float)
+              41:    6(float) Constant 1065353216
+              42:    7(fvec4) ConstantComposite 41 41 41 41
+              44:    6(float) Constant 1073741824
+              45:    7(fvec4) ConstantComposite 44 44 44 44
+              47:    6(float) Constant 1077936128
+              48:    7(fvec4) ConstantComposite 47 47 47 47
+              54:             TypePointer Input 7(fvec4)
+           55(d):     54(ptr) Variable Input
+        58(m[0]):     54(ptr) Variable Input
+        61(m[1]):     54(ptr) Variable Input
+       64(coord):     54(ptr) Variable Input
+           67(b):     54(ptr) Variable Input
+           71(e):     54(ptr) Variable Input
+          81(VI):             TypeStruct 11 7(fvec4)
+              82:             TypePointer Output 81(VI)
+83(@entryPointOutput):     82(ptr) Variable Output
+              84:             TypePointer Function 11
+              87:             TypePointer Output 11
+              89:             TypePointer Output 7(fvec4)
+90(@entryPointOutput_coord):     89(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-           46(d):      8(ptr) Variable Function
-          50(vi):     14(ptr) Variable Function
-           65(e):      8(ptr) Variable Function
- 68(flattenTemp):     14(ptr) Variable Function
-       69(param):      8(ptr) Variable Function
-       71(param):     14(ptr) Variable Function
-       73(param):      8(ptr) Variable Function
-              49:    7(fvec4) Load 48(d)
-                              Store 46(d) 49
-              52:    7(fvec4) Load 51(m[0])
-              53:      8(ptr) AccessChain 50(vi) 24 24
-                              Store 53 52
-              55:    7(fvec4) Load 54(m[1])
-              56:      8(ptr) AccessChain 50(vi) 24 25
-                              Store 56 55
-              59:   12(ivec2) Load 58(coord)
-              61:     60(ptr) AccessChain 50(vi) 25
-                              Store 61 59
-              63:    7(fvec4) Load 62(b)
-              64:      8(ptr) AccessChain 50(vi) 23
-                              Store 64 63
-              67:    7(fvec4) Load 66(e)
-                              Store 65(e) 67
-              70:    7(fvec4) Load 46(d)
-                              Store 69(param) 70
-              72:      13(VI) Load 50(vi)
-                              Store 71(param) 72
-              74:    7(fvec4) Load 65(e)
-                              Store 73(param) 74
-              75:      13(VI) FunctionCall 19(@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;) 69(param) 71(param) 73(param)
-                              Store 68(flattenTemp) 75
-              80:     79(ptr) AccessChain 68(flattenTemp) 24
-              81:          11 Load 80
-              83:     82(ptr) AccessChain 78(@entryPointOutput) 24
-                              Store 83 81
-              84:     60(ptr) AccessChain 68(flattenTemp) 25
-              85:   12(ivec2) Load 84
-              87:     86(ptr) AccessChain 78(@entryPointOutput) 25
-                              Store 87 85
-              88:      8(ptr) AccessChain 68(flattenTemp) 23
-              89:    7(fvec4) Load 88
-              91:     90(ptr) AccessChain 78(@entryPointOutput) 23
-                              Store 91 89
+           53(d):      8(ptr) Variable Function
+          57(vi):     13(ptr) Variable Function
+           70(e):      8(ptr) Variable Function
+ 73(flattenTemp):     13(ptr) Variable Function
+       74(param):      8(ptr) Variable Function
+       76(param):     13(ptr) Variable Function
+       78(param):      8(ptr) Variable Function
+              56:    7(fvec4) Load 55(d)
+                              Store 53(d) 56
+              59:    7(fvec4) Load 58(m[0])
+              60:      8(ptr) AccessChain 57(vi) 23 23
+                              Store 60 59
+              62:    7(fvec4) Load 61(m[1])
+              63:      8(ptr) AccessChain 57(vi) 23 24
+                              Store 63 62
+              65:    7(fvec4) Load 64(coord)
+              66:      8(ptr) AccessChain 57(vi) 24
+                              Store 66 65
+              68:    7(fvec4) Load 67(b)
+              69:      8(ptr) AccessChain 57(vi) 22
+                              Store 69 68
+              72:    7(fvec4) Load 71(e)
+                              Store 70(e) 72
+              75:    7(fvec4) Load 53(d)
+                              Store 74(param) 75
+              77:      12(VI) Load 57(vi)
+                              Store 76(param) 77
+              79:    7(fvec4) Load 70(e)
+                              Store 78(param) 79
+              80:      12(VI) FunctionCall 18(@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;) 74(param) 76(param) 78(param)
+                              Store 73(flattenTemp) 80
+              85:     84(ptr) AccessChain 73(flattenTemp) 23
+              86:          11 Load 85
+              88:     87(ptr) AccessChain 83(@entryPointOutput) 23
+                              Store 88 86
+              91:      8(ptr) AccessChain 73(flattenTemp) 24
+              92:    7(fvec4) Load 91
+                              Store 90(@entryPointOutput_coord) 92
+              93:      8(ptr) AccessChain 73(flattenTemp) 22
+              94:    7(fvec4) Load 93
+              95:     89(ptr) AccessChain 83(@entryPointOutput) 24
+                              Store 95 94
                               Return
                               FunctionEnd
-19(@main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4;):      13(VI) Function None 15
-           16(d):      8(ptr) FunctionParameter
-          17(vi):     14(ptr) FunctionParameter
-           18(e):      8(ptr) FunctionParameter
-              20:             Label
-       21(local):     14(ptr) Variable Function
-              26:      8(ptr) AccessChain 17(vi) 24 25
-              27:    7(fvec4) Load 26
-              28:      8(ptr) AccessChain 17(vi) 24 24
-              29:    7(fvec4) Load 28
-              30:    7(fvec4) FAdd 27 29
-              33:     32(ptr) AccessChain 17(vi) 25 31
-              34:      9(int) Load 33
-              35:    6(float) ConvertUToF 34
-              36:    7(fvec4) CompositeConstruct 35 35 35 35
-              37:    7(fvec4) FAdd 30 36
-              38:    7(fvec4) Load 16(d)
+18(@main(vf4;struct-VI-vf4[2]-vf4-vf41;vf4;):      12(VI) Function None 14
+           15(d):      8(ptr) FunctionParameter
+          16(vi):     13(ptr) FunctionParameter
+           17(e):      8(ptr) FunctionParameter
+              19:             Label
+       20(local):     13(ptr) Variable Function
+              25:      8(ptr) AccessChain 16(vi) 23 24
+              26:    7(fvec4) Load 25
+              27:      8(ptr) AccessChain 16(vi) 23 23
+              28:    7(fvec4) Load 27
+              29:    7(fvec4) FAdd 26 28
+              32:     31(ptr) AccessChain 16(vi) 24 30
+              33:    6(float) Load 32
+              34:    7(fvec4) CompositeConstruct 33 33 33 33
+              35:    7(fvec4) FAdd 29 34
+              36:    7(fvec4) Load 15(d)
+              37:    7(fvec4) FAdd 35 36
+              38:    7(fvec4) Load 17(e)
               39:    7(fvec4) FAdd 37 38
-              40:    7(fvec4) Load 18(e)
-              41:    7(fvec4) FAdd 39 40
-              42:      8(ptr) AccessChain 21(local) 23
-                              Store 42 41
-              43:      13(VI) Load 21(local)
-                              ReturnValue 43
+              40:      8(ptr) AccessChain 20(local) 22
+                              Store 40 39
+              43:      8(ptr) AccessChain 20(local) 24
+                              Store 43 42
+              46:      8(ptr) AccessChain 20(local) 23 23
+                              Store 46 45
+              49:      8(ptr) AccessChain 20(local) 23 24
+                              Store 49 48
+              50:      12(VI) Load 20(local)
+                              ReturnValue 50
                               FunctionEnd
diff --git a/Test/hlsl.struct.split.nested.geom b/Test/hlsl.struct.split.nested.geom
index 03bf38f3e281a0abd668189cf17bf1c06254e577..8bcc5b994abf6c4f775379d3980dcfdf4b3f4af0 100644
--- a/Test/hlsl.struct.split.nested.geom
+++ b/Test/hlsl.struct.split.nested.geom
@@ -1,8 +1,8 @@
 
 struct STRUCT_WITH_NO_BUILTIN_INTERSTAGE_IO
 {
-    float m0_array[2];
-    int   m1;
+    float m0_array[2] : mysemA;
+    int   m1 : mysemB;
 };
 
 struct PS_IN 
@@ -26,6 +26,9 @@ void main(triangle PS_IN tin[3], inout TriangleStream <GS_OUT> ts )
 
     o.psIn.pos = float4(1,2,3,4);
     o.psIn.tc  = float2(5,6);
+    o.contains_no_builtin_io.m0_array[0] = 2.3;
+    o.contains_no_builtin_io.m0_array[1] = 2.3;
+    o.contains_no_builtin_io.m1 = 2;
 
     ts.Append(o);
 }
diff --git a/Test/hlsl.structin.vert b/Test/hlsl.structin.vert
index 43d0cfd0bbdf5d62e17680a0b4838667a14b11e8..20a26dd9eb9f166de227e71a90c6414115ff7553 100644
--- a/Test/hlsl.structin.vert
+++ b/Test/hlsl.structin.vert
@@ -1,14 +1,17 @@
 struct VI {
-    float4 m[2];
-    uint2 coord;
-    linear float4 b;
+    float4 m[2] : mysemA;
+    float4 coord : SV_POSITION;
+    linear float4 b : mysemB;
 };
 
-VI main(float4 d, VI vi, float4 e) : SV_POSITION
+VI main(float4 d : mysem, VI vi, float4 e : mysem)
 {
     VI local;
 
-    local.b = vi.m[1] + vi.m[0] + float4(vi.coord.x) + d + e;
+    local.b = vi.m[1] + vi.m[0] + (float4)vi.coord.x + d + e;
+    local.coord = (float4)1;
+    local.m[0] = (float4)2;
+    local.m[1] = (float4)3;
 
     return local;
 }