diff --git a/Test/baseResults/hlsl.hull.4.tesc.out b/Test/baseResults/hlsl.hull.4.tesc.out
index 139d7d4105834a38b5950d1405de2d815781dd06..3349df81a679f17649b126eb95e6f205469dbe78 100644
--- a/Test/baseResults/hlsl.hull.4.tesc.out
+++ b/Test/baseResults/hlsl.hull.4.tesc.out
@@ -159,10 +159,9 @@ triangle order = cw
 0:?         'cpid' ( in uint InvocationID)
 0:39      Sequence
 0:39        move second child to first child ( temp 4-component vector of float)
-0:39          direct index ( out 4-component vector of float Position)
+0:39          indirect index ( out 4-component vector of float Position)
 0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
-0:39            Constant:
-0:39              0 (const int)
+0:?             'cpid' ( in uint InvocationID)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            Function Call: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
 0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
@@ -400,10 +399,9 @@ triangle order = cw
 0:?         'cpid' ( in uint InvocationID)
 0:39      Sequence
 0:39        move second child to first child ( temp 4-component vector of float)
-0:39          direct index ( out 4-component vector of float Position)
+0:39          indirect index ( out 4-component vector of float Position)
 0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
-0:39            Constant:
-0:39              0 (const int)
+0:?             'cpid' ( in uint InvocationID)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            Function Call: @main(struct-HS_Input-vf4-vf41[3];u1; ( temp structure{ temp 4-component vector of float m_Position})
 0:?               'I' ( temp 3-element array of structure{ temp 4-component vector of float m_Position,  temp 4-component vector of float m_Normal})
@@ -479,12 +477,12 @@ triangle order = cw
 
 // Module Version 10000
 // Generated by (magic number): 80002
-// Id's are bound by 127
+// Id's are bound by 128
 
                               Capability Tessellation
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint TessellationControl 4  "main" 56 64 83 86 110 123
+                              EntryPoint TessellationControl 4  "main" 56 64 83 86 111 124
                               ExecutionMode 4 OutputVertices 3
                               ExecutionMode 4 Triangles
                               ExecutionMode 4 SpacingFractionalOdd
@@ -514,20 +512,20 @@ triangle order = cw
                               Name 81  "cpid"
                               Name 83  "cpid"
                               Name 86  "@entryPointOutput.m_Position"
-                              Name 87  "param"
-                              Name 89  "param"
-                              Name 103  "@patchConstantResult"
-                              Name 104  "param"
-                              Name 110  "@patchConstantOutput.fTessFactor"
-                              Name 123  "@patchConstantOutput.fInsideTessFactor"
+                              Name 88  "param"
+                              Name 90  "param"
+                              Name 104  "@patchConstantResult"
+                              Name 105  "param"
+                              Name 111  "@patchConstantOutput.fTessFactor"
+                              Name 124  "@patchConstantOutput.fInsideTessFactor"
                               Decorate 56(I.m_Position) BuiltIn Position
                               Decorate 64(I) Location 0
                               Decorate 83(cpid) BuiltIn InvocationId
                               Decorate 86(@entryPointOutput.m_Position) BuiltIn Position
-                              Decorate 110(@patchConstantOutput.fTessFactor) Patch
-                              Decorate 110(@patchConstantOutput.fTessFactor) BuiltIn TessLevelOuter
-                              Decorate 123(@patchConstantOutput.fInsideTessFactor) Patch
-                              Decorate 123(@patchConstantOutput.fInsideTessFactor) BuiltIn TessLevelInner
+                              Decorate 111(@patchConstantOutput.fTessFactor) Patch
+                              Decorate 111(@patchConstantOutput.fTessFactor) BuiltIn TessLevelOuter
+                              Decorate 124(@patchConstantOutput.fInsideTessFactor) Patch
+                              Decorate 124(@patchConstantOutput.fInsideTessFactor) BuiltIn TessLevelInner
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -568,27 +566,27 @@ triangle order = cw
         83(cpid):     82(ptr) Variable Input
               85:             TypePointer Output 54
 86(@entryPointOutput.m_Position):     85(ptr) Variable Output
-              93:             TypePointer Output 7(fvec4)
-              95:      9(int) Constant 2
-              96:      9(int) Constant 1
-              97:      9(int) Constant 0
-              99:             TypeBool
-             107:      9(int) Constant 4
-             108:             TypeArray 6(float) 107
-             109:             TypePointer Output 108
-110(@patchConstantOutput.fTessFactor):    109(ptr) Variable Output
-             113:             TypePointer Output 6(float)
-             121:             TypeArray 6(float) 95
-             122:             TypePointer Output 121
-123(@patchConstantOutput.fInsideTessFactor):    122(ptr) Variable Output
+              94:             TypePointer Output 7(fvec4)
+              96:      9(int) Constant 2
+              97:      9(int) Constant 1
+              98:      9(int) Constant 0
+             100:             TypeBool
+             108:      9(int) Constant 4
+             109:             TypeArray 6(float) 108
+             110:             TypePointer Output 109
+111(@patchConstantOutput.fTessFactor):    110(ptr) Variable Output
+             114:             TypePointer Output 6(float)
+             122:             TypeArray 6(float) 96
+             123:             TypePointer Output 122
+124(@patchConstantOutput.fInsideTessFactor):    123(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
            53(I):     12(ptr) Variable Function
         81(cpid):     19(ptr) Variable Function
-       87(param):     12(ptr) Variable Function
-       89(param):     19(ptr) Variable Function
-103(@patchConstantResult):     26(ptr) Variable Function
-      104(param):     12(ptr) Variable Function
+       88(param):     12(ptr) Variable Function
+       90(param):     19(ptr) Variable Function
+104(@patchConstantResult):     26(ptr) Variable Function
+      105(param):     12(ptr) Variable Function
               58:     57(ptr) AccessChain 56(I.m_Position) 33
               59:    7(fvec4) Load 58
               60:     48(ptr) AccessChain 53(I) 33 33
@@ -615,42 +613,43 @@ triangle order = cw
                               Store 80 79
               84:      9(int) Load 83(cpid)
                               Store 81(cpid) 84
-              88:          11 Load 53(I)
-                              Store 87(param) 88
-              90:      9(int) Load 81(cpid)
-                              Store 89(param) 90
-              91:20(HS_Main_Output) FunctionCall 24(@main(struct-HS_Input-vf4-vf41[3];u1;) 87(param) 89(param)
-              92:    7(fvec4) CompositeExtract 91 0
-              94:     93(ptr) AccessChain 86(@entryPointOutput.m_Position) 33
-                              Store 94 92
-                              ControlBarrier 95 96 97
-              98:      9(int) Load 83(cpid)
-             100:    99(bool) IEqual 98 33
-                              SelectionMerge 102 None
-                              BranchConditional 100 101 102
-             101:               Label
-             105:          11   Load 53(I)
-                                Store 104(param) 105
-             106:14(HS_Output)   FunctionCall 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];) 104(param)
-                                Store 103(@patchConstantResult) 106
-             111:     34(ptr)   AccessChain 103(@patchConstantResult) 33 33
-             112:    6(float)   Load 111
-             114:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 33
-                                Store 114 112
-             115:     34(ptr)   AccessChain 103(@patchConstantResult) 33 32
-             116:    6(float)   Load 115
-             117:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 32
-                                Store 117 116
-             118:     34(ptr)   AccessChain 103(@patchConstantResult) 33 74
-             119:    6(float)   Load 118
-             120:    113(ptr)   AccessChain 110(@patchConstantOutput.fTessFactor) 74
-                                Store 120 119
-             124:     34(ptr)   AccessChain 103(@patchConstantResult) 32
-             125:    6(float)   Load 124
-             126:    113(ptr)   AccessChain 123(@patchConstantOutput.fInsideTessFactor) 33
-                                Store 126 125
-                                Branch 102
-             102:             Label
+              87:      9(int) Load 83(cpid)
+              89:          11 Load 53(I)
+                              Store 88(param) 89
+              91:      9(int) Load 81(cpid)
+                              Store 90(param) 91
+              92:20(HS_Main_Output) FunctionCall 24(@main(struct-HS_Input-vf4-vf41[3];u1;) 88(param) 90(param)
+              93:    7(fvec4) CompositeExtract 92 0
+              95:     94(ptr) AccessChain 86(@entryPointOutput.m_Position) 87
+                              Store 95 93
+                              ControlBarrier 96 97 98
+              99:      9(int) Load 83(cpid)
+             101:   100(bool) IEqual 99 33
+                              SelectionMerge 103 None
+                              BranchConditional 101 102 103
+             102:               Label
+             106:          11   Load 53(I)
+                                Store 105(param) 106
+             107:14(HS_Output)   FunctionCall 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];) 105(param)
+                                Store 104(@patchConstantResult) 107
+             112:     34(ptr)   AccessChain 104(@patchConstantResult) 33 33
+             113:    6(float)   Load 112
+             115:    114(ptr)   AccessChain 111(@patchConstantOutput.fTessFactor) 33
+                                Store 115 113
+             116:     34(ptr)   AccessChain 104(@patchConstantResult) 33 32
+             117:    6(float)   Load 116
+             118:    114(ptr)   AccessChain 111(@patchConstantOutput.fTessFactor) 32
+                                Store 118 117
+             119:     34(ptr)   AccessChain 104(@patchConstantResult) 33 74
+             120:    6(float)   Load 119
+             121:    114(ptr)   AccessChain 111(@patchConstantOutput.fTessFactor) 74
+                                Store 121 120
+             125:     34(ptr)   AccessChain 104(@patchConstantResult) 32
+             126:    6(float)   Load 125
+             127:    114(ptr)   AccessChain 124(@patchConstantOutput.fInsideTessFactor) 33
+                                Store 127 126
+                                Branch 103
+             103:             Label
                               Return
                               FunctionEnd
 17(HS_ConstFunc(struct-HS_Input-vf4-vf41[3];):14(HS_Output) Function None 15
diff --git a/Test/baseResults/hlsl.hull.5.tesc.out b/Test/baseResults/hlsl.hull.5.tesc.out
index 3a42b52e6b7619b57251548980549c4608e1ab20..656427b6de3cf031b4118d0673817839eb7a72b5 100644
--- a/Test/baseResults/hlsl.hull.5.tesc.out
+++ b/Test/baseResults/hlsl.hull.5.tesc.out
@@ -80,10 +80,9 @@ ERROR: node is still EOpNull!
 0:?         'cpid' ( in uint InvocationID)
 0:39      Sequence
 0:39        move second child to first child ( temp 4-component vector of float)
-0:39          direct index ( out 4-component vector of float Position)
+0:39          indirect index ( out 4-component vector of float Position)
 0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
-0:39            Constant:
-0:39              0 (const int)
+0:?             'cpid' ( in uint InvocationID)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            Function Call: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
 0:?               'cpid' ( temp uint)
@@ -174,10 +173,9 @@ ERROR: node is still EOpNull!
 0:?         'cpid' ( in uint InvocationID)
 0:39      Sequence
 0:39        move second child to first child ( temp 4-component vector of float)
-0:39          direct index ( out 4-component vector of float Position)
+0:39          indirect index ( out 4-component vector of float Position)
 0:?             '@entryPointOutput.m_Position' ( out 3-element array of 4-component vector of float Position)
-0:39            Constant:
-0:39              0 (const int)
+0:?             'cpid' ( in uint InvocationID)
 0:39          m_Position: direct index for structure ( temp 4-component vector of float)
 0:39            Function Call: @main(u1; ( temp structure{ temp 4-component vector of float m_Position})
 0:?               'cpid' ( temp uint)
diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp
index 5650d6c22343c79d7f7324ac493ba1b26b746d05..43f984ad5310ad94173304cae84e635913d249d6 100755
--- a/hlsl/hlslParseHelper.cpp
+++ b/hlsl/hlslParseHelper.cpp
@@ -2731,13 +2731,23 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
             // copy from interstage IO built-in if needed
             subTree = intermediate.addSymbol(*builtInVar);
 
-            // Arrayness of builtIn symbols isn't handled by the normal recursion:
-            // it's been extracted and moved to the built-in.
-            if (subTree->getType().isArray() && !arrayElement.empty()) {
-                const TType splitDerefType(subTree->getType(), arrayElement.back());
-                subTree = intermediate.addIndex(EOpIndexDirect, subTree,
-                                                intermediate.addConstantUnion(arrayElement.back(), loc), loc);
-                subTree->setType(splitDerefType);
+            if (subTree->getType().isArray()) {
+                // Arrayness of builtIn symbols isn't handled by the normal recursion:
+                // it's been extracted and moved to the built-in.
+                if (!arrayElement.empty()) {
+                    const TType splitDerefType(subTree->getType(), arrayElement.back());
+                    subTree = intermediate.addIndex(EOpIndexDirect, subTree,
+                                                    intermediate.addConstantUnion(arrayElement.back(), loc), loc);
+                    subTree->setType(splitDerefType);
+                } else if (splitNode->getAsOperator() != nullptr && (splitNode->getAsOperator()->getOp() == EOpIndexIndirect)) {
+                    // This might also be a stage with arrayed outputs, in which case there's an index
+                    // operation we should transfer to the output builtin.
+
+                    const TType splitDerefType(subTree->getType(), 0);
+                    subTree = intermediate.addIndex(splitNode->getAsOperator()->getOp(), subTree,
+                                                    splitNode->getAsBinaryNode()->getRight(), loc);
+                    subTree->setType(splitDerefType);
+                }
             }
         } else if (flattened && !shouldFlatten(derefType, isLeft ? leftStorage : rightStorage, false)) {
             if (isLeft)