HLSL: implement 4 (of 6) structuredbuffer types

This is a partial implemention of structurebuffers supporting:

* structured buffer types of:
*   StructuredBuffer
*   RWStructuredBuffer
*   ByteAddressBuffer
*   RWByteAddressBuffer

* Atomic operations on RWByteAddressBuffer

* Load/Load[234], Store/Store[234], GetDimensions methods (where allowed by type)

* globallycoherent flag

But NOT yet supporting:

* AppendStructuredBuffer / ConsumeStructuredBuffer types
* IncrementCounter/DecrementCounter methods

Please note: the stride returned by GetDimensions is as calculated by glslang for std430,
and may not match other environments in all cases.
diff --git a/Test/baseResults/hlsl.structbuffer.atomics.frag.out b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
new file mode 100644
index 0000000..7f20d5f
--- /dev/null
+++ b/Test/baseResults/hlsl.structbuffer.atomics.frag.out
@@ -0,0 +1,599 @@
+hlsl.structbuffer.atomics.frag
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main(u1; (temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'pos' (in uint)
+0:?     Sequence
+0:8      AtomicAdd (temp void)
+0:8        indirect index (layout(row_major std430 ) buffer uint)
+0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:8            Constant:
+0:8              0 (const uint)
+0:8          right-shift (temp int)
+0:8            Constant:
+0:8              8 (const int)
+0:8            Constant:
+0:8              2 (const int)
+0:8        Constant:
+0:8          1 (const int)
+0:9      move second child to first child (temp uint)
+0:9        'u' (temp uint)
+0:9        AtomicAdd (temp uint)
+0:9          indirect index (layout(row_major std430 ) buffer uint)
+0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:9              Constant:
+0:9                0 (const uint)
+0:9            right-shift (temp int)
+0:9              Constant:
+0:9                8 (const int)
+0:9              Constant:
+0:9                2 (const int)
+0:9          Constant:
+0:9            1 (const int)
+0:10      AtomicAnd (temp void)
+0:10        indirect index (layout(row_major std430 ) buffer uint)
+0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          right-shift (temp int)
+0:10            Constant:
+0:10              8 (const int)
+0:10            Constant:
+0:10              2 (const int)
+0:10        Constant:
+0:10          1 (const int)
+0:11      move second child to first child (temp uint)
+0:11        'u' (temp uint)
+0:11        AtomicAnd (temp uint)
+0:11          indirect index (layout(row_major std430 ) buffer uint)
+0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:11              Constant:
+0:11                0 (const uint)
+0:11            right-shift (temp int)
+0:11              Constant:
+0:11                8 (const int)
+0:11              Constant:
+0:11                2 (const int)
+0:11          Constant:
+0:11            1 (const int)
+0:12      move second child to first child (temp uint)
+0:12        'u' (temp uint)
+0:12        Convert int to uint (temp uint)
+0:12          AtomicCompSwap (temp int)
+0:12            indirect index (layout(row_major std430 ) buffer uint)
+0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:12                Constant:
+0:12                  0 (const uint)
+0:12              right-shift (temp int)
+0:12                Constant:
+0:12                  8 (const int)
+0:12                Constant:
+0:12                  2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:14      move second child to first child (temp uint)
+0:14        'u' (temp uint)
+0:14        AtomicExchange (temp uint)
+0:14          indirect index (layout(row_major std430 ) buffer uint)
+0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            right-shift (temp int)
+0:14              Constant:
+0:14                8 (const int)
+0:14              Constant:
+0:14                2 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:15      AtomicMax (temp void)
+0:15        indirect index (layout(row_major std430 ) buffer uint)
+0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          right-shift (temp int)
+0:15            Constant:
+0:15              8 (const int)
+0:15            Constant:
+0:15              2 (const int)
+0:15        Constant:
+0:15          1 (const int)
+0:16      move second child to first child (temp uint)
+0:16        'u' (temp uint)
+0:16        AtomicMax (temp uint)
+0:16          indirect index (layout(row_major std430 ) buffer uint)
+0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:16              Constant:
+0:16                0 (const uint)
+0:16            right-shift (temp int)
+0:16              Constant:
+0:16                8 (const int)
+0:16              Constant:
+0:16                2 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:17      AtomicMin (temp void)
+0:17        indirect index (layout(row_major std430 ) buffer uint)
+0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:17            Constant:
+0:17              0 (const uint)
+0:17          right-shift (temp int)
+0:17            Constant:
+0:17              8 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      move second child to first child (temp uint)
+0:18        'u' (temp uint)
+0:18        AtomicMin (temp uint)
+0:18          indirect index (layout(row_major std430 ) buffer uint)
+0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:18              Constant:
+0:18                0 (const uint)
+0:18            right-shift (temp int)
+0:18              Constant:
+0:18                8 (const int)
+0:18              Constant:
+0:18                2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:19      AtomicOr (temp void)
+0:19        indirect index (layout(row_major std430 ) buffer uint)
+0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:19            Constant:
+0:19              0 (const uint)
+0:19          right-shift (temp int)
+0:19            Constant:
+0:19              8 (const int)
+0:19            Constant:
+0:19              2 (const int)
+0:19        Constant:
+0:19          1 (const int)
+0:20      move second child to first child (temp uint)
+0:20        'u' (temp uint)
+0:20        AtomicOr (temp uint)
+0:20          indirect index (layout(row_major std430 ) buffer uint)
+0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:20              Constant:
+0:20                0 (const uint)
+0:20            right-shift (temp int)
+0:20              Constant:
+0:20                8 (const int)
+0:20              Constant:
+0:20                2 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:21      AtomicXor (temp void)
+0:21        indirect index (layout(row_major std430 ) buffer uint)
+0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:21            Constant:
+0:21              0 (const uint)
+0:21          right-shift (temp int)
+0:21            Constant:
+0:21              8 (const int)
+0:21            Constant:
+0:21              2 (const int)
+0:21        Constant:
+0:21          1 (const int)
+0:22      move second child to first child (temp uint)
+0:22        'u' (temp uint)
+0:22        AtomicXor (temp uint)
+0:22          indirect index (layout(row_major std430 ) buffer uint)
+0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:22              Constant:
+0:22                0 (const uint)
+0:22            right-shift (temp int)
+0:22              Constant:
+0:22                8 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            1 (const int)
+0:24      Branch: Return with expression
+0:24        Construct vec4 (temp 4-component vector of float)
+0:24          Convert uint to float (temp float)
+0:24            indirect index (layout(row_major std430 ) buffer uint)
+0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              right-shift (temp int)
+0:24                'pos' (in uint)
+0:24                Constant:
+0:24                  2 (const int)
+0:5  Function Definition: main( (temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child (temp uint)
+0:?         'pos' (temp uint)
+0:?         'pos' (layout(location=0 ) in uint)
+0:5      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:5        Function Call: @main(u1; (temp 4-component vector of float)
+0:?           'pos' (temp uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'pos' (layout(location=0 ) in uint)
+
+
+Linked fragment stage:
+
+
+Shader version: 450
+gl_FragCoord origin is upper left
+0:? Sequence
+0:5  Function Definition: @main(u1; (temp 4-component vector of float)
+0:5    Function Parameters: 
+0:5      'pos' (in uint)
+0:?     Sequence
+0:8      AtomicAdd (temp void)
+0:8        indirect index (layout(row_major std430 ) buffer uint)
+0:8          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:8            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:8            Constant:
+0:8              0 (const uint)
+0:8          right-shift (temp int)
+0:8            Constant:
+0:8              8 (const int)
+0:8            Constant:
+0:8              2 (const int)
+0:8        Constant:
+0:8          1 (const int)
+0:9      move second child to first child (temp uint)
+0:9        'u' (temp uint)
+0:9        AtomicAdd (temp uint)
+0:9          indirect index (layout(row_major std430 ) buffer uint)
+0:9            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:9              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:9              Constant:
+0:9                0 (const uint)
+0:9            right-shift (temp int)
+0:9              Constant:
+0:9                8 (const int)
+0:9              Constant:
+0:9                2 (const int)
+0:9          Constant:
+0:9            1 (const int)
+0:10      AtomicAnd (temp void)
+0:10        indirect index (layout(row_major std430 ) buffer uint)
+0:10          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:10            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:10            Constant:
+0:10              0 (const uint)
+0:10          right-shift (temp int)
+0:10            Constant:
+0:10              8 (const int)
+0:10            Constant:
+0:10              2 (const int)
+0:10        Constant:
+0:10          1 (const int)
+0:11      move second child to first child (temp uint)
+0:11        'u' (temp uint)
+0:11        AtomicAnd (temp uint)
+0:11          indirect index (layout(row_major std430 ) buffer uint)
+0:11            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:11              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:11              Constant:
+0:11                0 (const uint)
+0:11            right-shift (temp int)
+0:11              Constant:
+0:11                8 (const int)
+0:11              Constant:
+0:11                2 (const int)
+0:11          Constant:
+0:11            1 (const int)
+0:12      move second child to first child (temp uint)
+0:12        'u' (temp uint)
+0:12        Convert int to uint (temp uint)
+0:12          AtomicCompSwap (temp int)
+0:12            indirect index (layout(row_major std430 ) buffer uint)
+0:12              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:12                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:12                Constant:
+0:12                  0 (const uint)
+0:12              right-shift (temp int)
+0:12                Constant:
+0:12                  8 (const int)
+0:12                Constant:
+0:12                  2 (const int)
+0:12            Constant:
+0:12              1 (const int)
+0:12            Constant:
+0:12              2 (const int)
+0:14      move second child to first child (temp uint)
+0:14        'u' (temp uint)
+0:14        AtomicExchange (temp uint)
+0:14          indirect index (layout(row_major std430 ) buffer uint)
+0:14            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:14              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:14              Constant:
+0:14                0 (const uint)
+0:14            right-shift (temp int)
+0:14              Constant:
+0:14                8 (const int)
+0:14              Constant:
+0:14                2 (const int)
+0:14          Constant:
+0:14            1 (const int)
+0:15      AtomicMax (temp void)
+0:15        indirect index (layout(row_major std430 ) buffer uint)
+0:15          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:15            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:15            Constant:
+0:15              0 (const uint)
+0:15          right-shift (temp int)
+0:15            Constant:
+0:15              8 (const int)
+0:15            Constant:
+0:15              2 (const int)
+0:15        Constant:
+0:15          1 (const int)
+0:16      move second child to first child (temp uint)
+0:16        'u' (temp uint)
+0:16        AtomicMax (temp uint)
+0:16          indirect index (layout(row_major std430 ) buffer uint)
+0:16            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:16              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:16              Constant:
+0:16                0 (const uint)
+0:16            right-shift (temp int)
+0:16              Constant:
+0:16                8 (const int)
+0:16              Constant:
+0:16                2 (const int)
+0:16          Constant:
+0:16            1 (const int)
+0:17      AtomicMin (temp void)
+0:17        indirect index (layout(row_major std430 ) buffer uint)
+0:17          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:17            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:17            Constant:
+0:17              0 (const uint)
+0:17          right-shift (temp int)
+0:17            Constant:
+0:17              8 (const int)
+0:17            Constant:
+0:17              2 (const int)
+0:17        Constant:
+0:17          1 (const int)
+0:18      move second child to first child (temp uint)
+0:18        'u' (temp uint)
+0:18        AtomicMin (temp uint)
+0:18          indirect index (layout(row_major std430 ) buffer uint)
+0:18            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:18              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:18              Constant:
+0:18                0 (const uint)
+0:18            right-shift (temp int)
+0:18              Constant:
+0:18                8 (const int)
+0:18              Constant:
+0:18                2 (const int)
+0:18          Constant:
+0:18            1 (const int)
+0:19      AtomicOr (temp void)
+0:19        indirect index (layout(row_major std430 ) buffer uint)
+0:19          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:19            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:19            Constant:
+0:19              0 (const uint)
+0:19          right-shift (temp int)
+0:19            Constant:
+0:19              8 (const int)
+0:19            Constant:
+0:19              2 (const int)
+0:19        Constant:
+0:19          1 (const int)
+0:20      move second child to first child (temp uint)
+0:20        'u' (temp uint)
+0:20        AtomicOr (temp uint)
+0:20          indirect index (layout(row_major std430 ) buffer uint)
+0:20            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:20              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:20              Constant:
+0:20                0 (const uint)
+0:20            right-shift (temp int)
+0:20              Constant:
+0:20                8 (const int)
+0:20              Constant:
+0:20                2 (const int)
+0:20          Constant:
+0:20            1 (const int)
+0:21      AtomicXor (temp void)
+0:21        indirect index (layout(row_major std430 ) buffer uint)
+0:21          sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:21            'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:21            Constant:
+0:21              0 (const uint)
+0:21          right-shift (temp int)
+0:21            Constant:
+0:21              8 (const int)
+0:21            Constant:
+0:21              2 (const int)
+0:21        Constant:
+0:21          1 (const int)
+0:22      move second child to first child (temp uint)
+0:22        'u' (temp uint)
+0:22        AtomicXor (temp uint)
+0:22          indirect index (layout(row_major std430 ) buffer uint)
+0:22            sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:22              'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:22              Constant:
+0:22                0 (const uint)
+0:22            right-shift (temp int)
+0:22              Constant:
+0:22                8 (const int)
+0:22              Constant:
+0:22                2 (const int)
+0:22          Constant:
+0:22            1 (const int)
+0:24      Branch: Return with expression
+0:24        Construct vec4 (temp 4-component vector of float)
+0:24          Convert uint to float (temp float)
+0:24            indirect index (layout(row_major std430 ) buffer uint)
+0:24              sbuf: direct index for structure (layout(row_major std430 ) buffer implicitly-sized array of uint)
+0:24                'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:24                Constant:
+0:24                  0 (const uint)
+0:24              right-shift (temp int)
+0:24                'pos' (in uint)
+0:24                Constant:
+0:24                  2 (const int)
+0:5  Function Definition: main( (temp void)
+0:5    Function Parameters: 
+0:?     Sequence
+0:5      move second child to first child (temp uint)
+0:?         'pos' (temp uint)
+0:?         'pos' (layout(location=0 ) in uint)
+0:5      move second child to first child (temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:5        Function Call: @main(u1; (temp 4-component vector of float)
+0:?           'pos' (temp uint)
+0:?   Linker Objects
+0:?     'anon@0' (layout(row_major std430 ) buffer block{layout(row_major std430 ) buffer implicitly-sized array of uint sbuf})
+0:?     '@entryPointOutput' (layout(location=0 ) out 4-component vector of float)
+0:?     'pos' (layout(location=0 ) in uint)
+
+// Module Version 10000
+// Generated by (magic number): 80001
+// Id's are bound by 87
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 80 83
+                              ExecutionMode 4 OriginUpperLeft
+                              Name 4  "main"
+                              Name 12  "@main(u1;"
+                              Name 11  "pos"
+                              Name 15  "sbuf"
+                              MemberName 15(sbuf) 0  "sbuf"
+                              Name 17  ""
+                              Name 29  "u"
+                              Name 78  "pos"
+                              Name 80  "pos"
+                              Name 83  "@entryPointOutput"
+                              Name 84  "param"
+                              Decorate 14 ArrayStride 4
+                              MemberDecorate 15(sbuf) 0 Offset 0
+                              Decorate 15(sbuf) BufferBlock
+                              Decorate 17 DescriptorSet 0
+                              Decorate 80(pos) Location 0
+                              Decorate 83(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeInt 32 0
+               7:             TypePointer Function 6(int)
+               8:             TypeFloat 32
+               9:             TypeVector 8(float) 4
+              10:             TypeFunction 9(fvec4) 7(ptr)
+              14:             TypeRuntimeArray 6(int)
+        15(sbuf):             TypeStruct 14
+              16:             TypePointer Uniform 15(sbuf)
+              17:     16(ptr) Variable Uniform
+              18:             TypeInt 32 1
+              19:     18(int) Constant 0
+              20:     18(int) Constant 8
+              21:     18(int) Constant 2
+              23:             TypePointer Uniform 6(int)
+              25:     18(int) Constant 1
+              26:      6(int) Constant 1
+              27:      6(int) Constant 0
+              79:             TypePointer Input 6(int)
+         80(pos):     79(ptr) Variable Input
+              82:             TypePointer Output 9(fvec4)
+83(@entryPointOutput):     82(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+         78(pos):      7(ptr) Variable Function
+       84(param):      7(ptr) Variable Function
+              81:      6(int) Load 80(pos)
+                              Store 78(pos) 81
+              85:      6(int) Load 78(pos)
+                              Store 84(param) 85
+              86:    9(fvec4) FunctionCall 12(@main(u1;) 84(param)
+                              Store 83(@entryPointOutput) 86
+                              Return
+                              FunctionEnd
+   12(@main(u1;):    9(fvec4) Function None 10
+         11(pos):      7(ptr) FunctionParameter
+              13:             Label
+           29(u):      7(ptr) Variable Function
+              22:     18(int) ShiftRightArithmetic 20 21
+              24:     23(ptr) AccessChain 17 19 22
+              28:           2 AtomicIAdd 24 26 27 25
+              30:     18(int) ShiftRightArithmetic 20 21
+              31:     23(ptr) AccessChain 17 19 30
+              32:      6(int) AtomicIAdd 31 26 27 25
+                              Store 29(u) 32
+              33:     18(int) ShiftRightArithmetic 20 21
+              34:     23(ptr) AccessChain 17 19 33
+              35:           2 AtomicAnd 34 26 27 25
+              36:     18(int) ShiftRightArithmetic 20 21
+              37:     23(ptr) AccessChain 17 19 36
+              38:      6(int) AtomicAnd 37 26 27 25
+                              Store 29(u) 38
+              39:     18(int) ShiftRightArithmetic 20 21
+              40:     23(ptr) AccessChain 17 19 39
+              41:     18(int) AtomicCompareExchange 40 26 27 27 21 25
+              42:      6(int) Bitcast 41
+                              Store 29(u) 42
+              43:     18(int) ShiftRightArithmetic 20 21
+              44:     23(ptr) AccessChain 17 19 43
+              45:      6(int) AtomicExchange 44 26 27 25
+                              Store 29(u) 45
+              46:     18(int) ShiftRightArithmetic 20 21
+              47:     23(ptr) AccessChain 17 19 46
+              48:           2 AtomicSMax 47 26 27 25
+              49:     18(int) ShiftRightArithmetic 20 21
+              50:     23(ptr) AccessChain 17 19 49
+              51:      6(int) AtomicUMax 50 26 27 25
+                              Store 29(u) 51
+              52:     18(int) ShiftRightArithmetic 20 21
+              53:     23(ptr) AccessChain 17 19 52
+              54:           2 AtomicSMin 53 26 27 25
+              55:     18(int) ShiftRightArithmetic 20 21
+              56:     23(ptr) AccessChain 17 19 55
+              57:      6(int) AtomicUMin 56 26 27 25
+                              Store 29(u) 57
+              58:     18(int) ShiftRightArithmetic 20 21
+              59:     23(ptr) AccessChain 17 19 58
+              60:           2 AtomicOr 59 26 27 25
+              61:     18(int) ShiftRightArithmetic 20 21
+              62:     23(ptr) AccessChain 17 19 61
+              63:      6(int) AtomicOr 62 26 27 25
+                              Store 29(u) 63
+              64:     18(int) ShiftRightArithmetic 20 21
+              65:     23(ptr) AccessChain 17 19 64
+              66:           2 AtomicXor 65 26 27 25
+              67:     18(int) ShiftRightArithmetic 20 21
+              68:     23(ptr) AccessChain 17 19 67
+              69:      6(int) AtomicXor 68 26 27 25
+                              Store 29(u) 69
+              70:      6(int) Load 11(pos)
+              71:     18(int) ShiftRightLogical 70 21
+              72:     23(ptr) AccessChain 17 19 71
+              73:      6(int) Load 72
+              74:    8(float) ConvertUToF 73
+              75:    9(fvec4) CompositeConstruct 74 74 74 74
+                              ReturnValue 75
+                              FunctionEnd