Merge pull request #2787 from greg-lunarg/i2779

Allow 8/16-bit integer as array index
diff --git a/SPIRV/SpvPostProcess.cpp b/SPIRV/SpvPostProcess.cpp
index d283feb..dd6dabc 100644
--- a/SPIRV/SpvPostProcess.cpp
+++ b/SPIRV/SpvPostProcess.cpp
@@ -111,8 +111,6 @@
             }
         }
         break;
-    case OpAccessChain:
-    case OpPtrAccessChain:
     case OpCopyObject:
         break;
     case OpFConvert:
@@ -172,13 +170,30 @@
             break;
         }
         break;
+    case OpAccessChain:
+    case OpPtrAccessChain:
+        if (isPointerType(typeId))
+            break;
+        if (basicTypeOp == OpTypeInt) {
+            if (width == 16)
+                addCapability(CapabilityInt16);
+            else if (width == 8)
+                addCapability(CapabilityInt8);
+        }
     default:
-        if (basicTypeOp == OpTypeFloat && width == 16)
-            addCapability(CapabilityFloat16);
-        if (basicTypeOp == OpTypeInt && width == 16)
-            addCapability(CapabilityInt16);
-        if (basicTypeOp == OpTypeInt && width == 8)
-            addCapability(CapabilityInt8);
+        if (basicTypeOp == OpTypeInt) {
+            if (width == 16)
+                addCapability(CapabilityInt16);
+            else if (width == 8)
+                addCapability(CapabilityInt8);
+            else if (width == 64)
+                addCapability(CapabilityInt64);
+        } else if (basicTypeOp == OpTypeFloat) {
+            if (width == 16)
+                addCapability(CapabilityFloat16);
+            else if (width == 64)
+                addCapability(CapabilityFloat64);
+        }
         break;
     }
 }
diff --git a/Test/baseResults/spv.int16.frag.out b/Test/baseResults/spv.int16.frag.out
index 43cb09f..3e10a7d 100644
--- a/Test/baseResults/spv.int16.frag.out
+++ b/Test/baseResults/spv.int16.frag.out
@@ -1,7 +1,7 @@
 spv.int16.frag
 // Module Version 10000
 // Generated by (magic number): 8000a
-// Id's are bound by 535
+// Id's are bound by 549
 
                               Capability Shader
                               Capability Float16
@@ -48,53 +48,55 @@
                               Name 154  "i8v"
                               Name 163  "u8v"
                               Name 176  "bv"
-                              Name 195  "u16v"
-                              Name 200  "i16"
-                              Name 220  "i"
-                              Name 227  "uv"
-                              Name 243  "i64"
-                              Name 281  "b"
-                              Name 343  "i16v"
-                              Name 346  "i16"
-                              Name 356  "u16v"
-                              Name 358  "u16"
-                              Name 428  "i32"
-                              Name 431  "i64"
-                              Name 434  "i16v4"
-                              Name 437  "u32"
-                              Name 438  "u16v2"
-                              Name 442  "u64"
-                              Name 445  "u16v4"
-                              Name 457  "bv"
-                              Name 530  "Block"
-                              MemberName 530(Block) 0  "i16"
-                              MemberName 530(Block) 1  "i16v2"
-                              MemberName 530(Block) 2  "i16v3"
-                              MemberName 530(Block) 3  "i16v4"
-                              MemberName 530(Block) 4  "u16"
-                              MemberName 530(Block) 5  "u16v2"
-                              MemberName 530(Block) 6  "u16v3"
-                              MemberName 530(Block) 7  "u16v4"
-                              Name 532  "block"
-                              Name 533  "si16"
-                              Name 534  "su16"
+                              Name 196  "arr"
+                              Name 204  "u16v"
+                              Name 209  "i16"
+                              Name 229  "i"
+                              Name 236  "uv"
+                              Name 252  "i64"
+                              Name 290  "b"
+                              Name 353  "f"
+                              Name 357  "i16v"
+                              Name 360  "i16"
+                              Name 370  "u16v"
+                              Name 372  "u16"
+                              Name 442  "i32"
+                              Name 445  "i64"
+                              Name 448  "i16v4"
+                              Name 451  "u32"
+                              Name 452  "u16v2"
+                              Name 456  "u64"
+                              Name 459  "u16v4"
+                              Name 471  "bv"
+                              Name 544  "Block"
+                              MemberName 544(Block) 0  "i16"
+                              MemberName 544(Block) 1  "i16v2"
+                              MemberName 544(Block) 2  "i16v3"
+                              MemberName 544(Block) 3  "i16v4"
+                              MemberName 544(Block) 4  "u16"
+                              MemberName 544(Block) 5  "u16v2"
+                              MemberName 544(Block) 6  "u16v3"
+                              MemberName 544(Block) 7  "u16v4"
+                              Name 546  "block"
+                              Name 547  "si16"
+                              Name 548  "su16"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 530(Block) 0 Offset 0
-                              MemberDecorate 530(Block) 1 Offset 4
-                              MemberDecorate 530(Block) 2 Offset 8
-                              MemberDecorate 530(Block) 3 Offset 16
-                              MemberDecorate 530(Block) 4 Offset 24
-                              MemberDecorate 530(Block) 5 Offset 28
-                              MemberDecorate 530(Block) 6 Offset 32
-                              MemberDecorate 530(Block) 7 Offset 40
-                              Decorate 530(Block) Block
-                              Decorate 532(block) DescriptorSet 0
-                              Decorate 532(block) Binding 1
-                              Decorate 533(si16) SpecId 100
-                              Decorate 534(su16) SpecId 101
+                              MemberDecorate 544(Block) 0 Offset 0
+                              MemberDecorate 544(Block) 1 Offset 4
+                              MemberDecorate 544(Block) 2 Offset 8
+                              MemberDecorate 544(Block) 3 Offset 16
+                              MemberDecorate 544(Block) 4 Offset 24
+                              MemberDecorate 544(Block) 5 Offset 28
+                              MemberDecorate 544(Block) 6 Offset 32
+                              MemberDecorate 544(Block) 7 Offset 40
+                              Decorate 544(Block) Block
+                              Decorate 546(block) DescriptorSet 0
+                              Decorate 546(block) Binding 1
+                              Decorate 547(si16) SpecId 100
+                              Decorate 548(su16) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 16 1
@@ -160,37 +162,46 @@
              185: 36(int16_t) Constant 1
              186: 57(i16vec2) ConstantComposite 184 184
              187: 57(i16vec2) ConstantComposite 185 185
-             193:             TypeVector 36(int16_t) 3
-             194:             TypePointer Function 193(i16vec3)
-             197:             TypeVector 14(int16_t) 3
-             219:             TypePointer Function 27(int)
-             225:             TypeVector 17(int) 3
-             226:             TypePointer Function 225(ivec3)
-             242:             TypePointer Function 71(int64_t)
-             264:     17(int) Constant 1
-             270:     17(int) Constant 2
-             276:             TypeVector 27(int) 3
-             280:             TypePointer Function 173(bool)
-             282:     17(int) Constant 0
-             296:             TypePointer Function 17(int)
-             354: 52(i16vec2) ConstantComposite 21 21
-             363:193(i16vec3) ConstantComposite 184 184 184
-             405:   173(bool) ConstantTrue
-             412:   173(bool) ConstantFalse
-             413:  174(bvec2) ConstantComposite 412 412
-             425:             TypeVector 173(bool) 3
-             426:  425(bvec3) ConstantComposite 412 412 412
-             432:             TypeVector 14(int16_t) 4
-             433:             TypePointer Function 432(i16vec4)
-             441:             TypePointer Function 77(int64_t)
-             443:             TypeVector 36(int16_t) 4
-             444:             TypePointer Function 443(i16vec4)
-             456:             TypePointer Function 425(bvec3)
-      530(Block):             TypeStruct 14(int16_t) 52(i16vec2) 197(i16vec3) 432(i16vec4) 36(int16_t) 57(i16vec2) 193(i16vec3) 443(i16vec4)
-             531:             TypePointer Uniform 530(Block)
-      532(block):    531(ptr) Variable Uniform
-       533(si16): 14(int16_t) SpecConstant 4294967286
-       534(su16): 36(int16_t) SpecConstant 20
+             193:     17(int) Constant 4
+             194:             TypeArray 97(float) 193
+             195:             TypePointer Function 194
+             197:   97(float) Constant 1065353216
+             198:   97(float) Constant 1073741824
+             199:   97(float) Constant 1077936128
+             200:   97(float) Constant 1082130432
+             201:         194 ConstantComposite 197 198 199 200
+             202:             TypeVector 36(int16_t) 3
+             203:             TypePointer Function 202(i16vec3)
+             206:             TypeVector 14(int16_t) 3
+             228:             TypePointer Function 27(int)
+             234:             TypeVector 17(int) 3
+             235:             TypePointer Function 234(ivec3)
+             251:             TypePointer Function 71(int64_t)
+             273:     17(int) Constant 1
+             279:     17(int) Constant 2
+             285:             TypeVector 27(int) 3
+             289:             TypePointer Function 173(bool)
+             291:     17(int) Constant 0
+             305:             TypePointer Function 17(int)
+             352:             TypePointer Function 97(float)
+             368: 52(i16vec2) ConstantComposite 21 21
+             377:202(i16vec3) ConstantComposite 184 184 184
+             419:   173(bool) ConstantTrue
+             426:   173(bool) ConstantFalse
+             427:  174(bvec2) ConstantComposite 426 426
+             439:             TypeVector 173(bool) 3
+             440:  439(bvec3) ConstantComposite 426 426 426
+             446:             TypeVector 14(int16_t) 4
+             447:             TypePointer Function 446(i16vec4)
+             455:             TypePointer Function 77(int64_t)
+             457:             TypeVector 36(int16_t) 4
+             458:             TypePointer Function 457(i16vec4)
+             470:             TypePointer Function 439(bvec3)
+      544(Block):             TypeStruct 14(int16_t) 52(i16vec2) 206(i16vec3) 446(i16vec4) 36(int16_t) 57(i16vec2) 202(i16vec3) 457(i16vec4)
+             545:             TypePointer Uniform 544(Block)
+      546(block):    545(ptr) Variable Uniform
+       547(si16): 14(int16_t) SpecConstant 4294967286
+       548(su16): 36(int16_t) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -364,397 +375,404 @@
                               FunctionEnd
   10(operators():           2 Function None 3
               11:             Label
-       195(u16v):    194(ptr) Variable Function
-        200(i16):     15(ptr) Variable Function
-          220(i):    219(ptr) Variable Function
-         227(uv):    226(ptr) Variable Function
-        243(i64):    242(ptr) Variable Function
-          281(b):    280(ptr) Variable Function
-             196:193(i16vec3) Load 195(u16v)
-             198:197(i16vec3) CompositeConstruct 179 179 179
-             199:193(i16vec3) IAdd 196 198
-                              Store 195(u16v) 199
-             201: 14(int16_t) Load 200(i16)
-             202: 14(int16_t) ISub 201 179
-                              Store 200(i16) 202
-             203: 14(int16_t) Load 200(i16)
-             204: 14(int16_t) IAdd 203 179
-                              Store 200(i16) 204
-             205:193(i16vec3) Load 195(u16v)
-             206:197(i16vec3) CompositeConstruct 179 179 179
-             207:193(i16vec3) ISub 205 206
-                              Store 195(u16v) 207
-             208:193(i16vec3) Load 195(u16v)
-             209:193(i16vec3) Not 208
-                              Store 195(u16v) 209
-             210: 14(int16_t) Load 200(i16)
-                              Store 200(i16) 210
-             211:193(i16vec3) Load 195(u16v)
-             212:193(i16vec3) SNegate 211
-                              Store 195(u16v) 212
-             213: 14(int16_t) Load 200(i16)
-             214: 14(int16_t) Load 200(i16)
-             215: 14(int16_t) IAdd 214 213
-                              Store 200(i16) 215
-             216:193(i16vec3) Load 195(u16v)
-             217:193(i16vec3) Load 195(u16v)
-             218:193(i16vec3) ISub 217 216
-                              Store 195(u16v) 218
-             221: 14(int16_t) Load 200(i16)
-             222:     27(int) SConvert 221
-             223:     27(int) Load 220(i)
-             224:     27(int) IMul 223 222
-                              Store 220(i) 224
-             228:193(i16vec3) Load 195(u16v)
-             229:  225(ivec3) UConvert 228
-             230:  225(ivec3) Load 227(uv)
-             231:  225(ivec3) UDiv 230 229
-                              Store 227(uv) 231
-             232: 14(int16_t) Load 200(i16)
-             233:     27(int) SConvert 232
-             234:     17(int) Bitcast 233
-             235:  225(ivec3) Load 227(uv)
-             236:  225(ivec3) CompositeConstruct 234 234 234
-             237:  225(ivec3) UMod 235 236
-                              Store 227(uv) 237
-             238:193(i16vec3) Load 195(u16v)
-             239:  225(ivec3) UConvert 238
-             240:  225(ivec3) Load 227(uv)
-             241:  225(ivec3) IAdd 239 240
-                              Store 227(uv) 241
-             244: 14(int16_t) Load 200(i16)
-             245: 71(int64_t) SConvert 244
-             246: 71(int64_t) Load 243(i64)
-             247: 71(int64_t) ISub 245 246
-                              Store 243(i64) 247
-             248:193(i16vec3) Load 195(u16v)
-             249:  225(ivec3) UConvert 248
-             250:  225(ivec3) Load 227(uv)
-             251:  225(ivec3) IMul 249 250
-                              Store 227(uv) 251
-             252: 14(int16_t) Load 200(i16)
-             253: 71(int64_t) SConvert 252
-             254: 71(int64_t) Load 243(i64)
-             255: 71(int64_t) IMul 253 254
-                              Store 243(i64) 255
-             256: 14(int16_t) Load 200(i16)
-             257:     27(int) SConvert 256
-             258:     27(int) Load 220(i)
-             259:     27(int) SMod 257 258
-                              Store 220(i) 259
-             260: 14(int16_t) Load 200(i16)
-             261:193(i16vec3) Load 195(u16v)
-             262:197(i16vec3) CompositeConstruct 260 260 260
-             263:193(i16vec3) ShiftLeftLogical 261 262
-                              Store 195(u16v) 263
-             265:     37(ptr) AccessChain 195(u16v) 264
-             266: 36(int16_t) Load 265
-             267: 14(int16_t) Load 200(i16)
-             268: 14(int16_t) ShiftRightArithmetic 267 266
-                              Store 200(i16) 268
-             269: 14(int16_t) Load 200(i16)
-             271:     37(ptr) AccessChain 195(u16v) 270
-             272: 36(int16_t) Load 271
-             273: 14(int16_t) ShiftLeftLogical 269 272
-                              Store 200(i16) 273
-             274:193(i16vec3) Load 195(u16v)
-             275:     27(int) Load 220(i)
-             277:  276(ivec3) CompositeConstruct 275 275 275
-             278:193(i16vec3) ShiftLeftLogical 274 277
-             279:  225(ivec3) UConvert 278
-                              Store 227(uv) 279
-             283:     37(ptr) AccessChain 195(u16v) 282
-             284: 36(int16_t) Load 283
-             285: 14(int16_t) Load 200(i16)
-             286: 36(int16_t) Bitcast 285
-             287:   173(bool) INotEqual 284 286
-                              Store 281(b) 287
-             288: 14(int16_t) Load 200(i16)
-             289: 36(int16_t) Bitcast 288
-             290:     37(ptr) AccessChain 195(u16v) 282
-             291: 36(int16_t) Load 290
-             292:   173(bool) IEqual 289 291
-                              Store 281(b) 292
-             293:     37(ptr) AccessChain 195(u16v) 282
-             294: 36(int16_t) Load 293
-             295:     17(int) UConvert 294
-             297:    296(ptr) AccessChain 227(uv) 264
-             298:     17(int) Load 297
-             299:   173(bool) UGreaterThan 295 298
-                              Store 281(b) 299
-             300: 14(int16_t) Load 200(i16)
-             301:     27(int) SConvert 300
-             302:     27(int) Load 220(i)
-             303:   173(bool) SLessThan 301 302
-                              Store 281(b) 303
-             304:     37(ptr) AccessChain 195(u16v) 264
-             305: 36(int16_t) Load 304
-             306:     17(int) UConvert 305
-             307:    296(ptr) AccessChain 227(uv) 282
-             308:     17(int) Load 307
-             309:   173(bool) UGreaterThanEqual 306 308
-                              Store 281(b) 309
-             310: 14(int16_t) Load 200(i16)
-             311:     27(int) SConvert 310
-             312:     27(int) Load 220(i)
-             313:   173(bool) SLessThanEqual 311 312
-                              Store 281(b) 313
-             314: 14(int16_t) Load 200(i16)
-             315:     27(int) SConvert 314
-             316:     17(int) Bitcast 315
-             317:  225(ivec3) Load 227(uv)
-             318:  225(ivec3) CompositeConstruct 316 316 316
-             319:  225(ivec3) BitwiseOr 317 318
-                              Store 227(uv) 319
-             320: 14(int16_t) Load 200(i16)
-             321:     27(int) SConvert 320
-             322:     27(int) Load 220(i)
-             323:     27(int) BitwiseOr 321 322
-                              Store 220(i) 323
-             324: 14(int16_t) Load 200(i16)
-             325: 71(int64_t) SConvert 324
-             326: 71(int64_t) Load 243(i64)
-             327: 71(int64_t) BitwiseAnd 326 325
-                              Store 243(i64) 327
-             328:193(i16vec3) Load 195(u16v)
-             329:  225(ivec3) UConvert 328
-             330:  225(ivec3) Load 227(uv)
-             331:  225(ivec3) BitwiseAnd 329 330
-                              Store 227(uv) 331
-             332: 14(int16_t) Load 200(i16)
-             333:     27(int) SConvert 332
-             334:     17(int) Bitcast 333
-             335:  225(ivec3) Load 227(uv)
-             336:  225(ivec3) CompositeConstruct 334 334 334
-             337:  225(ivec3) BitwiseXor 335 336
-                              Store 227(uv) 337
-             338:193(i16vec3) Load 195(u16v)
-             339: 14(int16_t) Load 200(i16)
-             340: 36(int16_t) Bitcast 339
-             341:193(i16vec3) CompositeConstruct 340 340 340
-             342:193(i16vec3) BitwiseXor 338 341
-                              Store 195(u16v) 342
+        196(arr):    195(ptr) Variable Function
+       204(u16v):    203(ptr) Variable Function
+        209(i16):     15(ptr) Variable Function
+          229(i):    228(ptr) Variable Function
+         236(uv):    235(ptr) Variable Function
+        252(i64):    251(ptr) Variable Function
+          290(b):    289(ptr) Variable Function
+          353(f):    352(ptr) Variable Function
+                              Store 196(arr) 201
+             205:202(i16vec3) Load 204(u16v)
+             207:206(i16vec3) CompositeConstruct 179 179 179
+             208:202(i16vec3) IAdd 205 207
+                              Store 204(u16v) 208
+             210: 14(int16_t) Load 209(i16)
+             211: 14(int16_t) ISub 210 179
+                              Store 209(i16) 211
+             212: 14(int16_t) Load 209(i16)
+             213: 14(int16_t) IAdd 212 179
+                              Store 209(i16) 213
+             214:202(i16vec3) Load 204(u16v)
+             215:206(i16vec3) CompositeConstruct 179 179 179
+             216:202(i16vec3) ISub 214 215
+                              Store 204(u16v) 216
+             217:202(i16vec3) Load 204(u16v)
+             218:202(i16vec3) Not 217
+                              Store 204(u16v) 218
+             219: 14(int16_t) Load 209(i16)
+                              Store 209(i16) 219
+             220:202(i16vec3) Load 204(u16v)
+             221:202(i16vec3) SNegate 220
+                              Store 204(u16v) 221
+             222: 14(int16_t) Load 209(i16)
+             223: 14(int16_t) Load 209(i16)
+             224: 14(int16_t) IAdd 223 222
+                              Store 209(i16) 224
+             225:202(i16vec3) Load 204(u16v)
+             226:202(i16vec3) Load 204(u16v)
+             227:202(i16vec3) ISub 226 225
+                              Store 204(u16v) 227
+             230: 14(int16_t) Load 209(i16)
+             231:     27(int) SConvert 230
+             232:     27(int) Load 229(i)
+             233:     27(int) IMul 232 231
+                              Store 229(i) 233
+             237:202(i16vec3) Load 204(u16v)
+             238:  234(ivec3) UConvert 237
+             239:  234(ivec3) Load 236(uv)
+             240:  234(ivec3) UDiv 239 238
+                              Store 236(uv) 240
+             241: 14(int16_t) Load 209(i16)
+             242:     27(int) SConvert 241
+             243:     17(int) Bitcast 242
+             244:  234(ivec3) Load 236(uv)
+             245:  234(ivec3) CompositeConstruct 243 243 243
+             246:  234(ivec3) UMod 244 245
+                              Store 236(uv) 246
+             247:202(i16vec3) Load 204(u16v)
+             248:  234(ivec3) UConvert 247
+             249:  234(ivec3) Load 236(uv)
+             250:  234(ivec3) IAdd 248 249
+                              Store 236(uv) 250
+             253: 14(int16_t) Load 209(i16)
+             254: 71(int64_t) SConvert 253
+             255: 71(int64_t) Load 252(i64)
+             256: 71(int64_t) ISub 254 255
+                              Store 252(i64) 256
+             257:202(i16vec3) Load 204(u16v)
+             258:  234(ivec3) UConvert 257
+             259:  234(ivec3) Load 236(uv)
+             260:  234(ivec3) IMul 258 259
+                              Store 236(uv) 260
+             261: 14(int16_t) Load 209(i16)
+             262: 71(int64_t) SConvert 261
+             263: 71(int64_t) Load 252(i64)
+             264: 71(int64_t) IMul 262 263
+                              Store 252(i64) 264
+             265: 14(int16_t) Load 209(i16)
+             266:     27(int) SConvert 265
+             267:     27(int) Load 229(i)
+             268:     27(int) SMod 266 267
+                              Store 229(i) 268
+             269: 14(int16_t) Load 209(i16)
+             270:202(i16vec3) Load 204(u16v)
+             271:206(i16vec3) CompositeConstruct 269 269 269
+             272:202(i16vec3) ShiftLeftLogical 270 271
+                              Store 204(u16v) 272
+             274:     37(ptr) AccessChain 204(u16v) 273
+             275: 36(int16_t) Load 274
+             276: 14(int16_t) Load 209(i16)
+             277: 14(int16_t) ShiftRightArithmetic 276 275
+                              Store 209(i16) 277
+             278: 14(int16_t) Load 209(i16)
+             280:     37(ptr) AccessChain 204(u16v) 279
+             281: 36(int16_t) Load 280
+             282: 14(int16_t) ShiftLeftLogical 278 281
+                              Store 209(i16) 282
+             283:202(i16vec3) Load 204(u16v)
+             284:     27(int) Load 229(i)
+             286:  285(ivec3) CompositeConstruct 284 284 284
+             287:202(i16vec3) ShiftLeftLogical 283 286
+             288:  234(ivec3) UConvert 287
+                              Store 236(uv) 288
+             292:     37(ptr) AccessChain 204(u16v) 291
+             293: 36(int16_t) Load 292
+             294: 14(int16_t) Load 209(i16)
+             295: 36(int16_t) Bitcast 294
+             296:   173(bool) INotEqual 293 295
+                              Store 290(b) 296
+             297: 14(int16_t) Load 209(i16)
+             298: 36(int16_t) Bitcast 297
+             299:     37(ptr) AccessChain 204(u16v) 291
+             300: 36(int16_t) Load 299
+             301:   173(bool) IEqual 298 300
+                              Store 290(b) 301
+             302:     37(ptr) AccessChain 204(u16v) 291
+             303: 36(int16_t) Load 302
+             304:     17(int) UConvert 303
+             306:    305(ptr) AccessChain 236(uv) 273
+             307:     17(int) Load 306
+             308:   173(bool) UGreaterThan 304 307
+                              Store 290(b) 308
+             309: 14(int16_t) Load 209(i16)
+             310:     27(int) SConvert 309
+             311:     27(int) Load 229(i)
+             312:   173(bool) SLessThan 310 311
+                              Store 290(b) 312
+             313:     37(ptr) AccessChain 204(u16v) 273
+             314: 36(int16_t) Load 313
+             315:     17(int) UConvert 314
+             316:    305(ptr) AccessChain 236(uv) 291
+             317:     17(int) Load 316
+             318:   173(bool) UGreaterThanEqual 315 317
+                              Store 290(b) 318
+             319: 14(int16_t) Load 209(i16)
+             320:     27(int) SConvert 319
+             321:     27(int) Load 229(i)
+             322:   173(bool) SLessThanEqual 320 321
+                              Store 290(b) 322
+             323: 14(int16_t) Load 209(i16)
+             324:     27(int) SConvert 323
+             325:     17(int) Bitcast 324
+             326:  234(ivec3) Load 236(uv)
+             327:  234(ivec3) CompositeConstruct 325 325 325
+             328:  234(ivec3) BitwiseOr 326 327
+                              Store 236(uv) 328
+             329: 14(int16_t) Load 209(i16)
+             330:     27(int) SConvert 329
+             331:     27(int) Load 229(i)
+             332:     27(int) BitwiseOr 330 331
+                              Store 229(i) 332
+             333: 14(int16_t) Load 209(i16)
+             334: 71(int64_t) SConvert 333
+             335: 71(int64_t) Load 252(i64)
+             336: 71(int64_t) BitwiseAnd 335 334
+                              Store 252(i64) 336
+             337:202(i16vec3) Load 204(u16v)
+             338:  234(ivec3) UConvert 337
+             339:  234(ivec3) Load 236(uv)
+             340:  234(ivec3) BitwiseAnd 338 339
+                              Store 236(uv) 340
+             341: 14(int16_t) Load 209(i16)
+             342:     27(int) SConvert 341
+             343:     17(int) Bitcast 342
+             344:  234(ivec3) Load 236(uv)
+             345:  234(ivec3) CompositeConstruct 343 343 343
+             346:  234(ivec3) BitwiseXor 344 345
+                              Store 236(uv) 346
+             347:202(i16vec3) Load 204(u16v)
+             348: 14(int16_t) Load 209(i16)
+             349: 36(int16_t) Bitcast 348
+             350:202(i16vec3) CompositeConstruct 349 349 349
+             351:202(i16vec3) BitwiseXor 347 350
+                              Store 204(u16v) 351
+             354: 14(int16_t) Load 209(i16)
+             355:    352(ptr) AccessChain 196(arr) 354
+             356:   97(float) Load 355
+                              Store 353(f) 356
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-       343(i16v):     53(ptr) Variable Function
-        346(i16):     15(ptr) Variable Function
-       356(u16v):    194(ptr) Variable Function
-        358(u16):     37(ptr) Variable Function
-        428(i32):    219(ptr) Variable Function
-        431(i64):    242(ptr) Variable Function
-      434(i16v4):    433(ptr) Variable Function
-        437(u32):    296(ptr) Variable Function
-      438(u16v2):     58(ptr) Variable Function
-        442(u64):    441(ptr) Variable Function
-      445(u16v4):    444(ptr) Variable Function
-         457(bv):    456(ptr) Variable Function
-             344: 52(i16vec2) Load 343(i16v)
-             345: 52(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 344
-                              Store 343(i16v) 345
-             347: 14(int16_t) Load 346(i16)
-             348: 14(int16_t) ExtInst 1(GLSL.std.450) 7(SSign) 347
-                              Store 346(i16) 348
-             349: 52(i16vec2) Load 343(i16v)
-             350: 14(int16_t) Load 346(i16)
-             351: 52(i16vec2) CompositeConstruct 350 350
-             352: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 349 351
-                              Store 343(i16v) 352
-             353: 52(i16vec2) Load 343(i16v)
-             355: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 353 354
-                              Store 343(i16v) 355
-             357:193(i16vec3) Load 356(u16v)
-             359: 36(int16_t) Load 358(u16)
-             360:193(i16vec3) CompositeConstruct 359 359 359
-             361:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 360
-                              Store 356(u16v) 361
-             362:193(i16vec3) Load 356(u16v)
-             364:193(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 362 363
-                              Store 356(u16v) 364
-             365: 52(i16vec2) Load 343(i16v)
-             366: 14(int16_t) Load 346(i16)
-             367: 52(i16vec2) CompositeConstruct 366 366
-             368: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 365 367
-                              Store 343(i16v) 368
-             369: 52(i16vec2) Load 343(i16v)
-             370: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 369 354
-                              Store 343(i16v) 370
-             371:193(i16vec3) Load 356(u16v)
-             372: 36(int16_t) Load 358(u16)
-             373:193(i16vec3) CompositeConstruct 372 372 372
-             374:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 371 373
-                              Store 356(u16v) 374
-             375:193(i16vec3) Load 356(u16v)
-             376:193(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 375 363
-                              Store 356(u16v) 376
-             377: 52(i16vec2) Load 343(i16v)
-             378: 14(int16_t) Load 346(i16)
-             379: 14(int16_t) SNegate 378
-             380: 14(int16_t) Load 346(i16)
-             381: 52(i16vec2) CompositeConstruct 379 379
-             382: 52(i16vec2) CompositeConstruct 380 380
-             383: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 377 381 382
-                              Store 343(i16v) 383
-             384: 52(i16vec2) Load 343(i16v)
-             385: 52(i16vec2) Load 343(i16v)
-             386: 52(i16vec2) SNegate 385
-             387: 52(i16vec2) Load 343(i16v)
-             388: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 384 386 387
-                              Store 343(i16v) 388
-             389:193(i16vec3) Load 356(u16v)
-             390: 36(int16_t) Load 358(u16)
-             391: 36(int16_t) SNegate 390
-             392: 36(int16_t) Load 358(u16)
-             393:193(i16vec3) CompositeConstruct 391 391 391
-             394:193(i16vec3) CompositeConstruct 392 392 392
-             395:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 389 393 394
-                              Store 356(u16v) 395
-             396:193(i16vec3) Load 356(u16v)
-             397:193(i16vec3) Load 356(u16v)
-             398:193(i16vec3) SNegate 397
-             399:193(i16vec3) Load 356(u16v)
-             400:193(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 396 398 399
-                              Store 356(u16v) 400
-             401:     15(ptr) AccessChain 343(i16v) 282
-             402: 14(int16_t) Load 401
-             403:     15(ptr) AccessChain 343(i16v) 264
-             404: 14(int16_t) Load 403
-             406: 14(int16_t) Select 405 404 402
-                              Store 346(i16) 406
-             407: 14(int16_t) Load 346(i16)
-             408: 52(i16vec2) CompositeConstruct 407 407
-             409: 14(int16_t) Load 346(i16)
-             410: 14(int16_t) SNegate 409
-             411: 52(i16vec2) CompositeConstruct 410 410
-             414: 52(i16vec2) Select 413 411 408
-                              Store 343(i16v) 414
-             415:     37(ptr) AccessChain 356(u16v) 282
-             416: 36(int16_t) Load 415
-             417:     37(ptr) AccessChain 356(u16v) 264
-             418: 36(int16_t) Load 417
-             419: 36(int16_t) Select 405 418 416
-                              Store 358(u16) 419
-             420: 36(int16_t) Load 358(u16)
-             421:193(i16vec3) CompositeConstruct 420 420 420
-             422: 36(int16_t) Load 358(u16)
-             423: 36(int16_t) SNegate 422
-             424:193(i16vec3) CompositeConstruct 423 423 423
-             427:193(i16vec3) Select 426 424 421
-                              Store 356(u16v) 427
-             429: 52(i16vec2) Load 343(i16v)
-             430:     27(int) Bitcast 429
-                              Store 428(i32) 430
-             435:432(i16vec4) Load 434(i16v4)
-             436: 71(int64_t) Bitcast 435
-                              Store 431(i64) 436
-             439: 57(i16vec2) Load 438(u16v2)
-             440:     17(int) Bitcast 439
-                              Store 437(u32) 440
-             446:443(i16vec4) Load 445(u16v4)
-             447: 77(int64_t) Bitcast 446
-                              Store 442(u64) 447
-             448:     27(int) Load 428(i32)
-             449: 52(i16vec2) Bitcast 448
-                              Store 343(i16v) 449
-             450: 71(int64_t) Load 431(i64)
-             451:432(i16vec4) Bitcast 450
-                              Store 434(i16v4) 451
-             452:     17(int) Load 437(u32)
-             453: 57(i16vec2) Bitcast 452
-                              Store 438(u16v2) 453
-             454: 77(int64_t) Load 442(u64)
-             455:443(i16vec4) Bitcast 454
-                              Store 445(u16v4) 455
-             458:193(i16vec3) Load 356(u16v)
-             459: 36(int16_t) Load 358(u16)
-             460:193(i16vec3) CompositeConstruct 459 459 459
-             461:  425(bvec3) ULessThan 458 460
-                              Store 457(bv) 461
-             462: 52(i16vec2) Load 343(i16v)
-             463: 14(int16_t) Load 346(i16)
-             464: 52(i16vec2) CompositeConstruct 463 463
-             465:  174(bvec2) SLessThan 462 464
-             466:    280(ptr) AccessChain 457(bv) 282
-             467:   173(bool) CompositeExtract 465 0
-                              Store 466 467
-             468:    280(ptr) AccessChain 457(bv) 264
-             469:   173(bool) CompositeExtract 465 1
-                              Store 468 469
-             470:193(i16vec3) Load 356(u16v)
-             471: 36(int16_t) Load 358(u16)
-             472:193(i16vec3) CompositeConstruct 471 471 471
-             473:  425(bvec3) ULessThanEqual 470 472
-                              Store 457(bv) 473
-             474: 52(i16vec2) Load 343(i16v)
-             475: 14(int16_t) Load 346(i16)
-             476: 52(i16vec2) CompositeConstruct 475 475
-             477:  174(bvec2) SLessThanEqual 474 476
-             478:    280(ptr) AccessChain 457(bv) 282
-             479:   173(bool) CompositeExtract 477 0
-                              Store 478 479
-             480:    280(ptr) AccessChain 457(bv) 264
-             481:   173(bool) CompositeExtract 477 1
+       357(i16v):     53(ptr) Variable Function
+        360(i16):     15(ptr) Variable Function
+       370(u16v):    203(ptr) Variable Function
+        372(u16):     37(ptr) Variable Function
+        442(i32):    228(ptr) Variable Function
+        445(i64):    251(ptr) Variable Function
+      448(i16v4):    447(ptr) Variable Function
+        451(u32):    305(ptr) Variable Function
+      452(u16v2):     58(ptr) Variable Function
+        456(u64):    455(ptr) Variable Function
+      459(u16v4):    458(ptr) Variable Function
+         471(bv):    470(ptr) Variable Function
+             358: 52(i16vec2) Load 357(i16v)
+             359: 52(i16vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 358
+                              Store 357(i16v) 359
+             361: 14(int16_t) Load 360(i16)
+             362: 14(int16_t) ExtInst 1(GLSL.std.450) 7(SSign) 361
+                              Store 360(i16) 362
+             363: 52(i16vec2) Load 357(i16v)
+             364: 14(int16_t) Load 360(i16)
+             365: 52(i16vec2) CompositeConstruct 364 364
+             366: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 363 365
+                              Store 357(i16v) 366
+             367: 52(i16vec2) Load 357(i16v)
+             369: 52(i16vec2) ExtInst 1(GLSL.std.450) 39(SMin) 367 368
+                              Store 357(i16v) 369
+             371:202(i16vec3) Load 370(u16v)
+             373: 36(int16_t) Load 372(u16)
+             374:202(i16vec3) CompositeConstruct 373 373 373
+             375:202(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 371 374
+                              Store 370(u16v) 375
+             376:202(i16vec3) Load 370(u16v)
+             378:202(i16vec3) ExtInst 1(GLSL.std.450) 38(UMin) 376 377
+                              Store 370(u16v) 378
+             379: 52(i16vec2) Load 357(i16v)
+             380: 14(int16_t) Load 360(i16)
+             381: 52(i16vec2) CompositeConstruct 380 380
+             382: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 379 381
+                              Store 357(i16v) 382
+             383: 52(i16vec2) Load 357(i16v)
+             384: 52(i16vec2) ExtInst 1(GLSL.std.450) 42(SMax) 383 368
+                              Store 357(i16v) 384
+             385:202(i16vec3) Load 370(u16v)
+             386: 36(int16_t) Load 372(u16)
+             387:202(i16vec3) CompositeConstruct 386 386 386
+             388:202(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 385 387
+                              Store 370(u16v) 388
+             389:202(i16vec3) Load 370(u16v)
+             390:202(i16vec3) ExtInst 1(GLSL.std.450) 41(UMax) 389 377
+                              Store 370(u16v) 390
+             391: 52(i16vec2) Load 357(i16v)
+             392: 14(int16_t) Load 360(i16)
+             393: 14(int16_t) SNegate 392
+             394: 14(int16_t) Load 360(i16)
+             395: 52(i16vec2) CompositeConstruct 393 393
+             396: 52(i16vec2) CompositeConstruct 394 394
+             397: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 391 395 396
+                              Store 357(i16v) 397
+             398: 52(i16vec2) Load 357(i16v)
+             399: 52(i16vec2) Load 357(i16v)
+             400: 52(i16vec2) SNegate 399
+             401: 52(i16vec2) Load 357(i16v)
+             402: 52(i16vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 398 400 401
+                              Store 357(i16v) 402
+             403:202(i16vec3) Load 370(u16v)
+             404: 36(int16_t) Load 372(u16)
+             405: 36(int16_t) SNegate 404
+             406: 36(int16_t) Load 372(u16)
+             407:202(i16vec3) CompositeConstruct 405 405 405
+             408:202(i16vec3) CompositeConstruct 406 406 406
+             409:202(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 403 407 408
+                              Store 370(u16v) 409
+             410:202(i16vec3) Load 370(u16v)
+             411:202(i16vec3) Load 370(u16v)
+             412:202(i16vec3) SNegate 411
+             413:202(i16vec3) Load 370(u16v)
+             414:202(i16vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 410 412 413
+                              Store 370(u16v) 414
+             415:     15(ptr) AccessChain 357(i16v) 291
+             416: 14(int16_t) Load 415
+             417:     15(ptr) AccessChain 357(i16v) 273
+             418: 14(int16_t) Load 417
+             420: 14(int16_t) Select 419 418 416
+                              Store 360(i16) 420
+             421: 14(int16_t) Load 360(i16)
+             422: 52(i16vec2) CompositeConstruct 421 421
+             423: 14(int16_t) Load 360(i16)
+             424: 14(int16_t) SNegate 423
+             425: 52(i16vec2) CompositeConstruct 424 424
+             428: 52(i16vec2) Select 427 425 422
+                              Store 357(i16v) 428
+             429:     37(ptr) AccessChain 370(u16v) 291
+             430: 36(int16_t) Load 429
+             431:     37(ptr) AccessChain 370(u16v) 273
+             432: 36(int16_t) Load 431
+             433: 36(int16_t) Select 419 432 430
+                              Store 372(u16) 433
+             434: 36(int16_t) Load 372(u16)
+             435:202(i16vec3) CompositeConstruct 434 434 434
+             436: 36(int16_t) Load 372(u16)
+             437: 36(int16_t) SNegate 436
+             438:202(i16vec3) CompositeConstruct 437 437 437
+             441:202(i16vec3) Select 440 438 435
+                              Store 370(u16v) 441
+             443: 52(i16vec2) Load 357(i16v)
+             444:     27(int) Bitcast 443
+                              Store 442(i32) 444
+             449:446(i16vec4) Load 448(i16v4)
+             450: 71(int64_t) Bitcast 449
+                              Store 445(i64) 450
+             453: 57(i16vec2) Load 452(u16v2)
+             454:     17(int) Bitcast 453
+                              Store 451(u32) 454
+             460:457(i16vec4) Load 459(u16v4)
+             461: 77(int64_t) Bitcast 460
+                              Store 456(u64) 461
+             462:     27(int) Load 442(i32)
+             463: 52(i16vec2) Bitcast 462
+                              Store 357(i16v) 463
+             464: 71(int64_t) Load 445(i64)
+             465:446(i16vec4) Bitcast 464
+                              Store 448(i16v4) 465
+             466:     17(int) Load 451(u32)
+             467: 57(i16vec2) Bitcast 466
+                              Store 452(u16v2) 467
+             468: 77(int64_t) Load 456(u64)
+             469:457(i16vec4) Bitcast 468
+                              Store 459(u16v4) 469
+             472:202(i16vec3) Load 370(u16v)
+             473: 36(int16_t) Load 372(u16)
+             474:202(i16vec3) CompositeConstruct 473 473 473
+             475:  439(bvec3) ULessThan 472 474
+                              Store 471(bv) 475
+             476: 52(i16vec2) Load 357(i16v)
+             477: 14(int16_t) Load 360(i16)
+             478: 52(i16vec2) CompositeConstruct 477 477
+             479:  174(bvec2) SLessThan 476 478
+             480:    289(ptr) AccessChain 471(bv) 291
+             481:   173(bool) CompositeExtract 479 0
                               Store 480 481
-             482:193(i16vec3) Load 356(u16v)
-             483: 36(int16_t) Load 358(u16)
-             484:193(i16vec3) CompositeConstruct 483 483 483
-             485:  425(bvec3) UGreaterThan 482 484
-                              Store 457(bv) 485
-             486: 52(i16vec2) Load 343(i16v)
-             487: 14(int16_t) Load 346(i16)
-             488: 52(i16vec2) CompositeConstruct 487 487
-             489:  174(bvec2) SGreaterThan 486 488
-             490:    280(ptr) AccessChain 457(bv) 282
-             491:   173(bool) CompositeExtract 489 0
-                              Store 490 491
-             492:    280(ptr) AccessChain 457(bv) 264
-             493:   173(bool) CompositeExtract 489 1
+             482:    289(ptr) AccessChain 471(bv) 273
+             483:   173(bool) CompositeExtract 479 1
+                              Store 482 483
+             484:202(i16vec3) Load 370(u16v)
+             485: 36(int16_t) Load 372(u16)
+             486:202(i16vec3) CompositeConstruct 485 485 485
+             487:  439(bvec3) ULessThanEqual 484 486
+                              Store 471(bv) 487
+             488: 52(i16vec2) Load 357(i16v)
+             489: 14(int16_t) Load 360(i16)
+             490: 52(i16vec2) CompositeConstruct 489 489
+             491:  174(bvec2) SLessThanEqual 488 490
+             492:    289(ptr) AccessChain 471(bv) 291
+             493:   173(bool) CompositeExtract 491 0
                               Store 492 493
-             494:193(i16vec3) Load 356(u16v)
-             495: 36(int16_t) Load 358(u16)
-             496:193(i16vec3) CompositeConstruct 495 495 495
-             497:  425(bvec3) UGreaterThanEqual 494 496
-                              Store 457(bv) 497
-             498: 52(i16vec2) Load 343(i16v)
-             499: 14(int16_t) Load 346(i16)
-             500: 52(i16vec2) CompositeConstruct 499 499
-             501:  174(bvec2) SGreaterThanEqual 498 500
-             502:    280(ptr) AccessChain 457(bv) 282
-             503:   173(bool) CompositeExtract 501 0
-                              Store 502 503
-             504:    280(ptr) AccessChain 457(bv) 264
-             505:   173(bool) CompositeExtract 501 1
+             494:    289(ptr) AccessChain 471(bv) 273
+             495:   173(bool) CompositeExtract 491 1
+                              Store 494 495
+             496:202(i16vec3) Load 370(u16v)
+             497: 36(int16_t) Load 372(u16)
+             498:202(i16vec3) CompositeConstruct 497 497 497
+             499:  439(bvec3) UGreaterThan 496 498
+                              Store 471(bv) 499
+             500: 52(i16vec2) Load 357(i16v)
+             501: 14(int16_t) Load 360(i16)
+             502: 52(i16vec2) CompositeConstruct 501 501
+             503:  174(bvec2) SGreaterThan 500 502
+             504:    289(ptr) AccessChain 471(bv) 291
+             505:   173(bool) CompositeExtract 503 0
                               Store 504 505
-             506:193(i16vec3) Load 356(u16v)
-             507: 36(int16_t) Load 358(u16)
-             508:193(i16vec3) CompositeConstruct 507 507 507
-             509:  425(bvec3) IEqual 506 508
-                              Store 457(bv) 509
-             510: 52(i16vec2) Load 343(i16v)
-             511: 14(int16_t) Load 346(i16)
-             512: 52(i16vec2) CompositeConstruct 511 511
-             513:  174(bvec2) IEqual 510 512
-             514:    280(ptr) AccessChain 457(bv) 282
-             515:   173(bool) CompositeExtract 513 0
-                              Store 514 515
-             516:    280(ptr) AccessChain 457(bv) 264
-             517:   173(bool) CompositeExtract 513 1
+             506:    289(ptr) AccessChain 471(bv) 273
+             507:   173(bool) CompositeExtract 503 1
+                              Store 506 507
+             508:202(i16vec3) Load 370(u16v)
+             509: 36(int16_t) Load 372(u16)
+             510:202(i16vec3) CompositeConstruct 509 509 509
+             511:  439(bvec3) UGreaterThanEqual 508 510
+                              Store 471(bv) 511
+             512: 52(i16vec2) Load 357(i16v)
+             513: 14(int16_t) Load 360(i16)
+             514: 52(i16vec2) CompositeConstruct 513 513
+             515:  174(bvec2) SGreaterThanEqual 512 514
+             516:    289(ptr) AccessChain 471(bv) 291
+             517:   173(bool) CompositeExtract 515 0
                               Store 516 517
-             518:193(i16vec3) Load 356(u16v)
-             519: 36(int16_t) Load 358(u16)
-             520:193(i16vec3) CompositeConstruct 519 519 519
-             521:  425(bvec3) INotEqual 518 520
-                              Store 457(bv) 521
-             522: 52(i16vec2) Load 343(i16v)
-             523: 14(int16_t) Load 346(i16)
-             524: 52(i16vec2) CompositeConstruct 523 523
-             525:  174(bvec2) INotEqual 522 524
-             526:    280(ptr) AccessChain 457(bv) 282
-             527:   173(bool) CompositeExtract 525 0
-                              Store 526 527
-             528:    280(ptr) AccessChain 457(bv) 264
-             529:   173(bool) CompositeExtract 525 1
+             518:    289(ptr) AccessChain 471(bv) 273
+             519:   173(bool) CompositeExtract 515 1
+                              Store 518 519
+             520:202(i16vec3) Load 370(u16v)
+             521: 36(int16_t) Load 372(u16)
+             522:202(i16vec3) CompositeConstruct 521 521 521
+             523:  439(bvec3) IEqual 520 522
+                              Store 471(bv) 523
+             524: 52(i16vec2) Load 357(i16v)
+             525: 14(int16_t) Load 360(i16)
+             526: 52(i16vec2) CompositeConstruct 525 525
+             527:  174(bvec2) IEqual 524 526
+             528:    289(ptr) AccessChain 471(bv) 291
+             529:   173(bool) CompositeExtract 527 0
                               Store 528 529
+             530:    289(ptr) AccessChain 471(bv) 273
+             531:   173(bool) CompositeExtract 527 1
+                              Store 530 531
+             532:202(i16vec3) Load 370(u16v)
+             533: 36(int16_t) Load 372(u16)
+             534:202(i16vec3) CompositeConstruct 533 533 533
+             535:  439(bvec3) INotEqual 532 534
+                              Store 471(bv) 535
+             536: 52(i16vec2) Load 357(i16v)
+             537: 14(int16_t) Load 360(i16)
+             538: 52(i16vec2) CompositeConstruct 537 537
+             539:  174(bvec2) INotEqual 536 538
+             540:    289(ptr) AccessChain 471(bv) 291
+             541:   173(bool) CompositeExtract 539 0
+                              Store 540 541
+             542:    289(ptr) AccessChain 471(bv) 273
+             543:   173(bool) CompositeExtract 539 1
+                              Store 542 543
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.int8.frag.out b/Test/baseResults/spv.int8.frag.out
index a0da3e9..e9cd5f8 100644
--- a/Test/baseResults/spv.int8.frag.out
+++ b/Test/baseResults/spv.int8.frag.out
@@ -1,7 +1,7 @@
 spv.int8.frag
 // Module Version 10300
 // Generated by (magic number): 8000a
-// Id's are bound by 530
+// Id's are bound by 544
 
                               Capability Shader
                               Capability Float16
@@ -48,53 +48,55 @@
                               Name 117  "f64v"
                               Name 144  "u16v"
                               Name 174  "bv"
-                              Name 192  "u8v"
-                              Name 197  "i8"
-                              Name 217  "i"
-                              Name 224  "uv"
-                              Name 240  "i16"
-                              Name 276  "b"
-                              Name 338  "i8v"
-                              Name 341  "i8"
-                              Name 351  "u8v"
-                              Name 353  "u8"
-                              Name 423  "i16"
-                              Name 426  "i32"
-                              Name 429  "i8v4"
-                              Name 433  "u16"
-                              Name 434  "u8v2"
-                              Name 437  "u32"
-                              Name 440  "u8v4"
-                              Name 452  "bv"
-                              Name 525  "Block"
-                              MemberName 525(Block) 0  "i8"
-                              MemberName 525(Block) 1  "i8v2"
-                              MemberName 525(Block) 2  "i8v3"
-                              MemberName 525(Block) 3  "i8v4"
-                              MemberName 525(Block) 4  "u8"
-                              MemberName 525(Block) 5  "u8v2"
-                              MemberName 525(Block) 6  "u8v3"
-                              MemberName 525(Block) 7  "u8v4"
-                              Name 527  "block"
-                              Name 528  "si8"
-                              Name 529  "su8"
+                              Name 193  "arr"
+                              Name 201  "u8v"
+                              Name 206  "i8"
+                              Name 226  "i"
+                              Name 233  "uv"
+                              Name 249  "i16"
+                              Name 285  "b"
+                              Name 348  "f"
+                              Name 352  "i8v"
+                              Name 355  "i8"
+                              Name 365  "u8v"
+                              Name 367  "u8"
+                              Name 437  "i16"
+                              Name 440  "i32"
+                              Name 443  "i8v4"
+                              Name 447  "u16"
+                              Name 448  "u8v2"
+                              Name 451  "u32"
+                              Name 454  "u8v4"
+                              Name 466  "bv"
+                              Name 539  "Block"
+                              MemberName 539(Block) 0  "i8"
+                              MemberName 539(Block) 1  "i8v2"
+                              MemberName 539(Block) 2  "i8v3"
+                              MemberName 539(Block) 3  "i8v4"
+                              MemberName 539(Block) 4  "u8"
+                              MemberName 539(Block) 5  "u8v2"
+                              MemberName 539(Block) 6  "u8v3"
+                              MemberName 539(Block) 7  "u8v4"
+                              Name 541  "block"
+                              Name 542  "si8"
+                              Name 543  "su8"
                               MemberDecorate 24(Uniforms) 0 Offset 0
                               Decorate 24(Uniforms) Block
                               Decorate 26 DescriptorSet 0
                               Decorate 26 Binding 0
-                              MemberDecorate 525(Block) 0 Offset 0
-                              MemberDecorate 525(Block) 1 Offset 2
-                              MemberDecorate 525(Block) 2 Offset 4
-                              MemberDecorate 525(Block) 3 Offset 8
-                              MemberDecorate 525(Block) 4 Offset 12
-                              MemberDecorate 525(Block) 5 Offset 14
-                              MemberDecorate 525(Block) 6 Offset 16
-                              MemberDecorate 525(Block) 7 Offset 20
-                              Decorate 525(Block) Block
-                              Decorate 527(block) DescriptorSet 0
-                              Decorate 527(block) Binding 1
-                              Decorate 528(si8) SpecId 100
-                              Decorate 529(su8) SpecId 101
+                              MemberDecorate 539(Block) 0 Offset 0
+                              MemberDecorate 539(Block) 1 Offset 2
+                              MemberDecorate 539(Block) 2 Offset 4
+                              MemberDecorate 539(Block) 3 Offset 8
+                              MemberDecorate 539(Block) 4 Offset 12
+                              MemberDecorate 539(Block) 5 Offset 14
+                              MemberDecorate 539(Block) 6 Offset 16
+                              MemberDecorate 539(Block) 7 Offset 20
+                              Decorate 539(Block) Block
+                              Decorate 541(block) DescriptorSet 0
+                              Decorate 541(block) Binding 1
+                              Decorate 542(si8) SpecId 100
+                              Decorate 543(su8) SpecId 101
                2:             TypeVoid
                3:             TypeFunction 2
               14:             TypeInt 8 1
@@ -159,36 +161,45 @@
              182:  36(int8_t) Constant 1
              183:  49(i8vec2) ConstantComposite 181 181
              184:  49(i8vec2) ConstantComposite 182 182
-             190:             TypeVector 36(int8_t) 3
-             191:             TypePointer Function 190(i8vec3)
-             194:             TypeVector 14(int8_t) 3
-             216:             TypePointer Function 27(int)
-             222:             TypeVector 17(int) 3
-             223:             TypePointer Function 222(ivec3)
-             239:             TypePointer Function 57(int16_t)
-             261:     17(int) Constant 1
-             267:     17(int) Constant 2
-             275:             TypePointer Function 171(bool)
-             277:     17(int) Constant 0
-             291:             TypePointer Function 17(int)
-             349:  52(i8vec2) ConstantComposite 21 21
-             358: 190(i8vec3) ConstantComposite 181 181 181
-             400:   171(bool) ConstantTrue
-             407:   171(bool) ConstantFalse
-             408:  172(bvec2) ConstantComposite 407 407
-             420:             TypeVector 171(bool) 3
-             421:  420(bvec3) ConstantComposite 407 407 407
-             427:             TypeVector 14(int8_t) 4
-             428:             TypePointer Function 427(i8vec4)
-             432:             TypePointer Function 64(int16_t)
-             438:             TypeVector 36(int8_t) 4
-             439:             TypePointer Function 438(i8vec4)
-             451:             TypePointer Function 420(bvec3)
-      525(Block):             TypeStruct 14(int8_t) 52(i8vec2) 194(i8vec3) 427(i8vec4) 36(int8_t) 49(i8vec2) 190(i8vec3) 438(i8vec4)
-             526:             TypePointer Uniform 525(Block)
-      527(block):    526(ptr) Variable Uniform
-        528(si8):  14(int8_t) SpecConstant 4294967286
-        529(su8):  36(int8_t) SpecConstant 20
+             190:     17(int) Constant 4
+             191:             TypeArray 108(float) 190
+             192:             TypePointer Function 191
+             194:  108(float) Constant 1065353216
+             195:  108(float) Constant 1073741824
+             196:  108(float) Constant 1077936128
+             197:  108(float) Constant 1082130432
+             198:         191 ConstantComposite 194 195 196 197
+             199:             TypeVector 36(int8_t) 3
+             200:             TypePointer Function 199(i8vec3)
+             203:             TypeVector 14(int8_t) 3
+             225:             TypePointer Function 27(int)
+             231:             TypeVector 17(int) 3
+             232:             TypePointer Function 231(ivec3)
+             248:             TypePointer Function 57(int16_t)
+             270:     17(int) Constant 1
+             276:     17(int) Constant 2
+             284:             TypePointer Function 171(bool)
+             286:     17(int) Constant 0
+             300:             TypePointer Function 17(int)
+             347:             TypePointer Function 108(float)
+             363:  52(i8vec2) ConstantComposite 21 21
+             372: 199(i8vec3) ConstantComposite 181 181 181
+             414:   171(bool) ConstantTrue
+             421:   171(bool) ConstantFalse
+             422:  172(bvec2) ConstantComposite 421 421
+             434:             TypeVector 171(bool) 3
+             435:  434(bvec3) ConstantComposite 421 421 421
+             441:             TypeVector 14(int8_t) 4
+             442:             TypePointer Function 441(i8vec4)
+             446:             TypePointer Function 64(int16_t)
+             452:             TypeVector 36(int8_t) 4
+             453:             TypePointer Function 452(i8vec4)
+             465:             TypePointer Function 434(bvec3)
+      539(Block):             TypeStruct 14(int8_t) 52(i8vec2) 203(i8vec3) 441(i8vec4) 36(int8_t) 49(i8vec2) 199(i8vec3) 452(i8vec4)
+             540:             TypePointer Uniform 539(Block)
+      541(block):    540(ptr) Variable Uniform
+        542(si8):  14(int8_t) SpecConstant 4294967286
+        543(su8):  36(int8_t) SpecConstant 20
          4(main):           2 Function None 3
                5:             Label
                               Return
@@ -360,396 +371,403 @@
                               FunctionEnd
   10(operators():           2 Function None 3
               11:             Label
-        192(u8v):    191(ptr) Variable Function
-         197(i8):     15(ptr) Variable Function
-          217(i):    216(ptr) Variable Function
-         224(uv):    223(ptr) Variable Function
-        240(i16):    239(ptr) Variable Function
-          276(b):    275(ptr) Variable Function
-             193: 190(i8vec3) Load 192(u8v)
-             195: 194(i8vec3) CompositeConstruct 176 176 176
-             196: 190(i8vec3) IAdd 193 195
-                              Store 192(u8v) 196
-             198:  14(int8_t) Load 197(i8)
-             199:  14(int8_t) ISub 198 176
-                              Store 197(i8) 199
-             200:  14(int8_t) Load 197(i8)
-             201:  14(int8_t) IAdd 200 176
-                              Store 197(i8) 201
-             202: 190(i8vec3) Load 192(u8v)
-             203: 194(i8vec3) CompositeConstruct 176 176 176
-             204: 190(i8vec3) ISub 202 203
-                              Store 192(u8v) 204
-             205: 190(i8vec3) Load 192(u8v)
-             206: 190(i8vec3) Not 205
-                              Store 192(u8v) 206
-             207:  14(int8_t) Load 197(i8)
-                              Store 197(i8) 207
-             208: 190(i8vec3) Load 192(u8v)
-             209: 190(i8vec3) SNegate 208
-                              Store 192(u8v) 209
-             210:  14(int8_t) Load 197(i8)
-             211:  14(int8_t) Load 197(i8)
-             212:  14(int8_t) IAdd 211 210
-                              Store 197(i8) 212
-             213: 190(i8vec3) Load 192(u8v)
-             214: 190(i8vec3) Load 192(u8v)
-             215: 190(i8vec3) ISub 214 213
-                              Store 192(u8v) 215
-             218:  14(int8_t) Load 197(i8)
-             219:     27(int) SConvert 218
-             220:     27(int) Load 217(i)
-             221:     27(int) IMul 220 219
-                              Store 217(i) 221
-             225: 190(i8vec3) Load 192(u8v)
-             226:  222(ivec3) UConvert 225
-             227:  222(ivec3) Load 224(uv)
-             228:  222(ivec3) UDiv 227 226
-                              Store 224(uv) 228
-             229:  14(int8_t) Load 197(i8)
-             230:     27(int) SConvert 229
-             231:     17(int) Bitcast 230
-             232:  222(ivec3) Load 224(uv)
-             233:  222(ivec3) CompositeConstruct 231 231 231
-             234:  222(ivec3) UMod 232 233
-                              Store 224(uv) 234
-             235: 190(i8vec3) Load 192(u8v)
-             236:  222(ivec3) UConvert 235
-             237:  222(ivec3) Load 224(uv)
-             238:  222(ivec3) IAdd 236 237
-                              Store 224(uv) 238
-             241:  14(int8_t) Load 197(i8)
-             242: 57(int16_t) SConvert 241
-             243: 57(int16_t) Load 240(i16)
-             244: 57(int16_t) ISub 242 243
-                              Store 240(i16) 244
-             245: 190(i8vec3) Load 192(u8v)
-             246:  222(ivec3) UConvert 245
-             247:  222(ivec3) Load 224(uv)
-             248:  222(ivec3) IMul 246 247
-                              Store 224(uv) 248
-             249:  14(int8_t) Load 197(i8)
-             250: 57(int16_t) SConvert 249
-             251: 57(int16_t) Load 240(i16)
-             252: 57(int16_t) IMul 250 251
-                              Store 240(i16) 252
-             253:  14(int8_t) Load 197(i8)
-             254:     27(int) SConvert 253
-             255:     27(int) Load 217(i)
-             256:     27(int) SMod 254 255
-                              Store 217(i) 256
-             257:  14(int8_t) Load 197(i8)
-             258: 190(i8vec3) Load 192(u8v)
-             259: 194(i8vec3) CompositeConstruct 257 257 257
-             260: 190(i8vec3) ShiftLeftLogical 258 259
-                              Store 192(u8v) 260
-             262:     37(ptr) AccessChain 192(u8v) 261
-             263:  36(int8_t) Load 262
-             264:  14(int8_t) Load 197(i8)
-             265:  14(int8_t) ShiftRightArithmetic 264 263
-                              Store 197(i8) 265
-             266:  14(int8_t) Load 197(i8)
-             268:     37(ptr) AccessChain 192(u8v) 267
-             269:  36(int8_t) Load 268
-             270:  14(int8_t) ShiftLeftLogical 266 269
-                              Store 197(i8) 270
-             271: 190(i8vec3) Load 192(u8v)
-             272:  14(int8_t) Load 197(i8)
-             273: 194(i8vec3) CompositeConstruct 272 272 272
-             274: 190(i8vec3) ShiftLeftLogical 271 273
-                              Store 192(u8v) 274
-             278:     37(ptr) AccessChain 192(u8v) 277
-             279:  36(int8_t) Load 278
-             280:  14(int8_t) Load 197(i8)
-             281:  36(int8_t) Bitcast 280
-             282:   171(bool) INotEqual 279 281
-                              Store 276(b) 282
-             283:  14(int8_t) Load 197(i8)
-             284:  36(int8_t) Bitcast 283
-             285:     37(ptr) AccessChain 192(u8v) 277
-             286:  36(int8_t) Load 285
-             287:   171(bool) IEqual 284 286
-                              Store 276(b) 287
-             288:     37(ptr) AccessChain 192(u8v) 277
-             289:  36(int8_t) Load 288
-             290:     17(int) UConvert 289
-             292:    291(ptr) AccessChain 224(uv) 261
-             293:     17(int) Load 292
-             294:   171(bool) UGreaterThan 290 293
-                              Store 276(b) 294
-             295:  14(int8_t) Load 197(i8)
-             296:     27(int) SConvert 295
-             297:     27(int) Load 217(i)
-             298:   171(bool) SLessThan 296 297
-                              Store 276(b) 298
-             299:     37(ptr) AccessChain 192(u8v) 261
-             300:  36(int8_t) Load 299
-             301:     17(int) UConvert 300
-             302:    291(ptr) AccessChain 224(uv) 277
-             303:     17(int) Load 302
-             304:   171(bool) UGreaterThanEqual 301 303
-                              Store 276(b) 304
-             305:  14(int8_t) Load 197(i8)
-             306:     27(int) SConvert 305
-             307:     27(int) Load 217(i)
-             308:   171(bool) SLessThanEqual 306 307
-                              Store 276(b) 308
-             309:  14(int8_t) Load 197(i8)
-             310:     27(int) SConvert 309
-             311:     17(int) Bitcast 310
-             312:  222(ivec3) Load 224(uv)
-             313:  222(ivec3) CompositeConstruct 311 311 311
-             314:  222(ivec3) BitwiseOr 312 313
-                              Store 224(uv) 314
-             315:  14(int8_t) Load 197(i8)
-             316:     27(int) SConvert 315
-             317:     27(int) Load 217(i)
-             318:     27(int) BitwiseOr 316 317
-                              Store 217(i) 318
-             319:  14(int8_t) Load 197(i8)
-             320: 57(int16_t) SConvert 319
-             321: 57(int16_t) Load 240(i16)
-             322: 57(int16_t) BitwiseAnd 321 320
-                              Store 240(i16) 322
-             323: 190(i8vec3) Load 192(u8v)
-             324:  222(ivec3) UConvert 323
-             325:  222(ivec3) Load 224(uv)
-             326:  222(ivec3) BitwiseAnd 324 325
-                              Store 224(uv) 326
-             327:  14(int8_t) Load 197(i8)
-             328:     27(int) SConvert 327
-             329:     17(int) Bitcast 328
-             330:  222(ivec3) Load 224(uv)
-             331:  222(ivec3) CompositeConstruct 329 329 329
-             332:  222(ivec3) BitwiseXor 330 331
-                              Store 224(uv) 332
-             333: 190(i8vec3) Load 192(u8v)
-             334:  14(int8_t) Load 197(i8)
-             335:  36(int8_t) Bitcast 334
-             336: 190(i8vec3) CompositeConstruct 335 335 335
-             337: 190(i8vec3) BitwiseXor 333 336
-                              Store 192(u8v) 337
+        193(arr):    192(ptr) Variable Function
+        201(u8v):    200(ptr) Variable Function
+         206(i8):     15(ptr) Variable Function
+          226(i):    225(ptr) Variable Function
+         233(uv):    232(ptr) Variable Function
+        249(i16):    248(ptr) Variable Function
+          285(b):    284(ptr) Variable Function
+          348(f):    347(ptr) Variable Function
+                              Store 193(arr) 198
+             202: 199(i8vec3) Load 201(u8v)
+             204: 203(i8vec3) CompositeConstruct 176 176 176
+             205: 199(i8vec3) IAdd 202 204
+                              Store 201(u8v) 205
+             207:  14(int8_t) Load 206(i8)
+             208:  14(int8_t) ISub 207 176
+                              Store 206(i8) 208
+             209:  14(int8_t) Load 206(i8)
+             210:  14(int8_t) IAdd 209 176
+                              Store 206(i8) 210
+             211: 199(i8vec3) Load 201(u8v)
+             212: 203(i8vec3) CompositeConstruct 176 176 176
+             213: 199(i8vec3) ISub 211 212
+                              Store 201(u8v) 213
+             214: 199(i8vec3) Load 201(u8v)
+             215: 199(i8vec3) Not 214
+                              Store 201(u8v) 215
+             216:  14(int8_t) Load 206(i8)
+                              Store 206(i8) 216
+             217: 199(i8vec3) Load 201(u8v)
+             218: 199(i8vec3) SNegate 217
+                              Store 201(u8v) 218
+             219:  14(int8_t) Load 206(i8)
+             220:  14(int8_t) Load 206(i8)
+             221:  14(int8_t) IAdd 220 219
+                              Store 206(i8) 221
+             222: 199(i8vec3) Load 201(u8v)
+             223: 199(i8vec3) Load 201(u8v)
+             224: 199(i8vec3) ISub 223 222
+                              Store 201(u8v) 224
+             227:  14(int8_t) Load 206(i8)
+             228:     27(int) SConvert 227
+             229:     27(int) Load 226(i)
+             230:     27(int) IMul 229 228
+                              Store 226(i) 230
+             234: 199(i8vec3) Load 201(u8v)
+             235:  231(ivec3) UConvert 234
+             236:  231(ivec3) Load 233(uv)
+             237:  231(ivec3) UDiv 236 235
+                              Store 233(uv) 237
+             238:  14(int8_t) Load 206(i8)
+             239:     27(int) SConvert 238
+             240:     17(int) Bitcast 239
+             241:  231(ivec3) Load 233(uv)
+             242:  231(ivec3) CompositeConstruct 240 240 240
+             243:  231(ivec3) UMod 241 242
+                              Store 233(uv) 243
+             244: 199(i8vec3) Load 201(u8v)
+             245:  231(ivec3) UConvert 244
+             246:  231(ivec3) Load 233(uv)
+             247:  231(ivec3) IAdd 245 246
+                              Store 233(uv) 247
+             250:  14(int8_t) Load 206(i8)
+             251: 57(int16_t) SConvert 250
+             252: 57(int16_t) Load 249(i16)
+             253: 57(int16_t) ISub 251 252
+                              Store 249(i16) 253
+             254: 199(i8vec3) Load 201(u8v)
+             255:  231(ivec3) UConvert 254
+             256:  231(ivec3) Load 233(uv)
+             257:  231(ivec3) IMul 255 256
+                              Store 233(uv) 257
+             258:  14(int8_t) Load 206(i8)
+             259: 57(int16_t) SConvert 258
+             260: 57(int16_t) Load 249(i16)
+             261: 57(int16_t) IMul 259 260
+                              Store 249(i16) 261
+             262:  14(int8_t) Load 206(i8)
+             263:     27(int) SConvert 262
+             264:     27(int) Load 226(i)
+             265:     27(int) SMod 263 264
+                              Store 226(i) 265
+             266:  14(int8_t) Load 206(i8)
+             267: 199(i8vec3) Load 201(u8v)
+             268: 203(i8vec3) CompositeConstruct 266 266 266
+             269: 199(i8vec3) ShiftLeftLogical 267 268
+                              Store 201(u8v) 269
+             271:     37(ptr) AccessChain 201(u8v) 270
+             272:  36(int8_t) Load 271
+             273:  14(int8_t) Load 206(i8)
+             274:  14(int8_t) ShiftRightArithmetic 273 272
+                              Store 206(i8) 274
+             275:  14(int8_t) Load 206(i8)
+             277:     37(ptr) AccessChain 201(u8v) 276
+             278:  36(int8_t) Load 277
+             279:  14(int8_t) ShiftLeftLogical 275 278
+                              Store 206(i8) 279
+             280: 199(i8vec3) Load 201(u8v)
+             281:  14(int8_t) Load 206(i8)
+             282: 203(i8vec3) CompositeConstruct 281 281 281
+             283: 199(i8vec3) ShiftLeftLogical 280 282
+                              Store 201(u8v) 283
+             287:     37(ptr) AccessChain 201(u8v) 286
+             288:  36(int8_t) Load 287
+             289:  14(int8_t) Load 206(i8)
+             290:  36(int8_t) Bitcast 289
+             291:   171(bool) INotEqual 288 290
+                              Store 285(b) 291
+             292:  14(int8_t) Load 206(i8)
+             293:  36(int8_t) Bitcast 292
+             294:     37(ptr) AccessChain 201(u8v) 286
+             295:  36(int8_t) Load 294
+             296:   171(bool) IEqual 293 295
+                              Store 285(b) 296
+             297:     37(ptr) AccessChain 201(u8v) 286
+             298:  36(int8_t) Load 297
+             299:     17(int) UConvert 298
+             301:    300(ptr) AccessChain 233(uv) 270
+             302:     17(int) Load 301
+             303:   171(bool) UGreaterThan 299 302
+                              Store 285(b) 303
+             304:  14(int8_t) Load 206(i8)
+             305:     27(int) SConvert 304
+             306:     27(int) Load 226(i)
+             307:   171(bool) SLessThan 305 306
+                              Store 285(b) 307
+             308:     37(ptr) AccessChain 201(u8v) 270
+             309:  36(int8_t) Load 308
+             310:     17(int) UConvert 309
+             311:    300(ptr) AccessChain 233(uv) 286
+             312:     17(int) Load 311
+             313:   171(bool) UGreaterThanEqual 310 312
+                              Store 285(b) 313
+             314:  14(int8_t) Load 206(i8)
+             315:     27(int) SConvert 314
+             316:     27(int) Load 226(i)
+             317:   171(bool) SLessThanEqual 315 316
+                              Store 285(b) 317
+             318:  14(int8_t) Load 206(i8)
+             319:     27(int) SConvert 318
+             320:     17(int) Bitcast 319
+             321:  231(ivec3) Load 233(uv)
+             322:  231(ivec3) CompositeConstruct 320 320 320
+             323:  231(ivec3) BitwiseOr 321 322
+                              Store 233(uv) 323
+             324:  14(int8_t) Load 206(i8)
+             325:     27(int) SConvert 324
+             326:     27(int) Load 226(i)
+             327:     27(int) BitwiseOr 325 326
+                              Store 226(i) 327
+             328:  14(int8_t) Load 206(i8)
+             329: 57(int16_t) SConvert 328
+             330: 57(int16_t) Load 249(i16)
+             331: 57(int16_t) BitwiseAnd 330 329
+                              Store 249(i16) 331
+             332: 199(i8vec3) Load 201(u8v)
+             333:  231(ivec3) UConvert 332
+             334:  231(ivec3) Load 233(uv)
+             335:  231(ivec3) BitwiseAnd 333 334
+                              Store 233(uv) 335
+             336:  14(int8_t) Load 206(i8)
+             337:     27(int) SConvert 336
+             338:     17(int) Bitcast 337
+             339:  231(ivec3) Load 233(uv)
+             340:  231(ivec3) CompositeConstruct 338 338 338
+             341:  231(ivec3) BitwiseXor 339 340
+                              Store 233(uv) 341
+             342: 199(i8vec3) Load 201(u8v)
+             343:  14(int8_t) Load 206(i8)
+             344:  36(int8_t) Bitcast 343
+             345: 199(i8vec3) CompositeConstruct 344 344 344
+             346: 199(i8vec3) BitwiseXor 342 345
+                              Store 201(u8v) 346
+             349:  14(int8_t) Load 206(i8)
+             350:    347(ptr) AccessChain 193(arr) 349
+             351:  108(float) Load 350
+                              Store 348(f) 351
                               Return
                               FunctionEnd
 12(builtinFuncs():           2 Function None 3
               13:             Label
-        338(i8v):     53(ptr) Variable Function
-         341(i8):     15(ptr) Variable Function
-        351(u8v):    191(ptr) Variable Function
-         353(u8):     37(ptr) Variable Function
-        423(i16):    239(ptr) Variable Function
-        426(i32):    216(ptr) Variable Function
-       429(i8v4):    428(ptr) Variable Function
-        433(u16):    432(ptr) Variable Function
-       434(u8v2):     50(ptr) Variable Function
-        437(u32):    291(ptr) Variable Function
-       440(u8v4):    439(ptr) Variable Function
-         452(bv):    451(ptr) Variable Function
-             339:  52(i8vec2) Load 338(i8v)
-             340:  52(i8vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 339
-                              Store 338(i8v) 340
-             342:  14(int8_t) Load 341(i8)
-             343:  14(int8_t) ExtInst 1(GLSL.std.450) 7(SSign) 342
-                              Store 341(i8) 343
-             344:  52(i8vec2) Load 338(i8v)
-             345:  14(int8_t) Load 341(i8)
-             346:  52(i8vec2) CompositeConstruct 345 345
-             347:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 344 346
-                              Store 338(i8v) 347
-             348:  52(i8vec2) Load 338(i8v)
-             350:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 348 349
-                              Store 338(i8v) 350
-             352: 190(i8vec3) Load 351(u8v)
-             354:  36(int8_t) Load 353(u8)
-             355: 190(i8vec3) CompositeConstruct 354 354 354
-             356: 190(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 352 355
-                              Store 351(u8v) 356
-             357: 190(i8vec3) Load 351(u8v)
-             359: 190(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 357 358
-                              Store 351(u8v) 359
-             360:  52(i8vec2) Load 338(i8v)
-             361:  14(int8_t) Load 341(i8)
-             362:  52(i8vec2) CompositeConstruct 361 361
-             363:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 360 362
-                              Store 338(i8v) 363
-             364:  52(i8vec2) Load 338(i8v)
-             365:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 364 349
-                              Store 338(i8v) 365
-             366: 190(i8vec3) Load 351(u8v)
-             367:  36(int8_t) Load 353(u8)
-             368: 190(i8vec3) CompositeConstruct 367 367 367
-             369: 190(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 366 368
-                              Store 351(u8v) 369
-             370: 190(i8vec3) Load 351(u8v)
-             371: 190(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 370 358
-                              Store 351(u8v) 371
-             372:  52(i8vec2) Load 338(i8v)
-             373:  14(int8_t) Load 341(i8)
-             374:  14(int8_t) SNegate 373
-             375:  14(int8_t) Load 341(i8)
-             376:  52(i8vec2) CompositeConstruct 374 374
-             377:  52(i8vec2) CompositeConstruct 375 375
-             378:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 372 376 377
-                              Store 338(i8v) 378
-             379:  52(i8vec2) Load 338(i8v)
-             380:  52(i8vec2) Load 338(i8v)
-             381:  52(i8vec2) SNegate 380
-             382:  52(i8vec2) Load 338(i8v)
-             383:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 379 381 382
-                              Store 338(i8v) 383
-             384: 190(i8vec3) Load 351(u8v)
-             385:  36(int8_t) Load 353(u8)
-             386:  36(int8_t) SNegate 385
-             387:  36(int8_t) Load 353(u8)
-             388: 190(i8vec3) CompositeConstruct 386 386 386
-             389: 190(i8vec3) CompositeConstruct 387 387 387
-             390: 190(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 384 388 389
-                              Store 351(u8v) 390
-             391: 190(i8vec3) Load 351(u8v)
-             392: 190(i8vec3) Load 351(u8v)
-             393: 190(i8vec3) SNegate 392
-             394: 190(i8vec3) Load 351(u8v)
-             395: 190(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 391 393 394
-                              Store 351(u8v) 395
-             396:     15(ptr) AccessChain 338(i8v) 277
-             397:  14(int8_t) Load 396
-             398:     15(ptr) AccessChain 338(i8v) 261
-             399:  14(int8_t) Load 398
-             401:  14(int8_t) Select 400 399 397
-                              Store 341(i8) 401
-             402:  14(int8_t) Load 341(i8)
-             403:  52(i8vec2) CompositeConstruct 402 402
-             404:  14(int8_t) Load 341(i8)
-             405:  14(int8_t) SNegate 404
-             406:  52(i8vec2) CompositeConstruct 405 405
-             409:  52(i8vec2) Select 408 406 403
-                              Store 338(i8v) 409
-             410:     37(ptr) AccessChain 351(u8v) 277
-             411:  36(int8_t) Load 410
-             412:     37(ptr) AccessChain 351(u8v) 261
-             413:  36(int8_t) Load 412
-             414:  36(int8_t) Select 400 413 411
-                              Store 353(u8) 414
-             415:  36(int8_t) Load 353(u8)
-             416: 190(i8vec3) CompositeConstruct 415 415 415
-             417:  36(int8_t) Load 353(u8)
-             418:  36(int8_t) SNegate 417
-             419: 190(i8vec3) CompositeConstruct 418 418 418
-             422: 190(i8vec3) Select 421 419 416
-                              Store 351(u8v) 422
-             424:  52(i8vec2) Load 338(i8v)
-             425: 57(int16_t) Bitcast 424
-                              Store 423(i16) 425
-             430: 427(i8vec4) Load 429(i8v4)
-             431:     27(int) Bitcast 430
-                              Store 426(i32) 431
-             435:  49(i8vec2) Load 434(u8v2)
-             436: 64(int16_t) Bitcast 435
-                              Store 433(u16) 436
-             441: 438(i8vec4) Load 440(u8v4)
-             442:     17(int) Bitcast 441
-                              Store 437(u32) 442
-             443: 57(int16_t) Load 423(i16)
-             444:  52(i8vec2) Bitcast 443
-                              Store 338(i8v) 444
-             445:     27(int) Load 426(i32)
-             446: 427(i8vec4) Bitcast 445
-                              Store 429(i8v4) 446
-             447: 64(int16_t) Load 433(u16)
-             448:  49(i8vec2) Bitcast 447
-                              Store 434(u8v2) 448
-             449:     17(int) Load 437(u32)
-             450: 438(i8vec4) Bitcast 449
-                              Store 440(u8v4) 450
-             453: 190(i8vec3) Load 351(u8v)
-             454:  36(int8_t) Load 353(u8)
-             455: 190(i8vec3) CompositeConstruct 454 454 454
-             456:  420(bvec3) ULessThan 453 455
-                              Store 452(bv) 456
-             457:  52(i8vec2) Load 338(i8v)
-             458:  14(int8_t) Load 341(i8)
-             459:  52(i8vec2) CompositeConstruct 458 458
-             460:  172(bvec2) SLessThan 457 459
-             461:    275(ptr) AccessChain 452(bv) 277
-             462:   171(bool) CompositeExtract 460 0
-                              Store 461 462
-             463:    275(ptr) AccessChain 452(bv) 261
-             464:   171(bool) CompositeExtract 460 1
-                              Store 463 464
-             465: 190(i8vec3) Load 351(u8v)
-             466:  36(int8_t) Load 353(u8)
-             467: 190(i8vec3) CompositeConstruct 466 466 466
-             468:  420(bvec3) ULessThanEqual 465 467
-                              Store 452(bv) 468
-             469:  52(i8vec2) Load 338(i8v)
-             470:  14(int8_t) Load 341(i8)
-             471:  52(i8vec2) CompositeConstruct 470 470
-             472:  172(bvec2) SLessThanEqual 469 471
-             473:    275(ptr) AccessChain 452(bv) 277
-             474:   171(bool) CompositeExtract 472 0
-                              Store 473 474
-             475:    275(ptr) AccessChain 452(bv) 261
-             476:   171(bool) CompositeExtract 472 1
+        352(i8v):     53(ptr) Variable Function
+         355(i8):     15(ptr) Variable Function
+        365(u8v):    200(ptr) Variable Function
+         367(u8):     37(ptr) Variable Function
+        437(i16):    248(ptr) Variable Function
+        440(i32):    225(ptr) Variable Function
+       443(i8v4):    442(ptr) Variable Function
+        447(u16):    446(ptr) Variable Function
+       448(u8v2):     50(ptr) Variable Function
+        451(u32):    300(ptr) Variable Function
+       454(u8v4):    453(ptr) Variable Function
+         466(bv):    465(ptr) Variable Function
+             353:  52(i8vec2) Load 352(i8v)
+             354:  52(i8vec2) ExtInst 1(GLSL.std.450) 5(SAbs) 353
+                              Store 352(i8v) 354
+             356:  14(int8_t) Load 355(i8)
+             357:  14(int8_t) ExtInst 1(GLSL.std.450) 7(SSign) 356
+                              Store 355(i8) 357
+             358:  52(i8vec2) Load 352(i8v)
+             359:  14(int8_t) Load 355(i8)
+             360:  52(i8vec2) CompositeConstruct 359 359
+             361:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 358 360
+                              Store 352(i8v) 361
+             362:  52(i8vec2) Load 352(i8v)
+             364:  52(i8vec2) ExtInst 1(GLSL.std.450) 39(SMin) 362 363
+                              Store 352(i8v) 364
+             366: 199(i8vec3) Load 365(u8v)
+             368:  36(int8_t) Load 367(u8)
+             369: 199(i8vec3) CompositeConstruct 368 368 368
+             370: 199(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 366 369
+                              Store 365(u8v) 370
+             371: 199(i8vec3) Load 365(u8v)
+             373: 199(i8vec3) ExtInst 1(GLSL.std.450) 38(UMin) 371 372
+                              Store 365(u8v) 373
+             374:  52(i8vec2) Load 352(i8v)
+             375:  14(int8_t) Load 355(i8)
+             376:  52(i8vec2) CompositeConstruct 375 375
+             377:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 374 376
+                              Store 352(i8v) 377
+             378:  52(i8vec2) Load 352(i8v)
+             379:  52(i8vec2) ExtInst 1(GLSL.std.450) 42(SMax) 378 363
+                              Store 352(i8v) 379
+             380: 199(i8vec3) Load 365(u8v)
+             381:  36(int8_t) Load 367(u8)
+             382: 199(i8vec3) CompositeConstruct 381 381 381
+             383: 199(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 380 382
+                              Store 365(u8v) 383
+             384: 199(i8vec3) Load 365(u8v)
+             385: 199(i8vec3) ExtInst 1(GLSL.std.450) 41(UMax) 384 372
+                              Store 365(u8v) 385
+             386:  52(i8vec2) Load 352(i8v)
+             387:  14(int8_t) Load 355(i8)
+             388:  14(int8_t) SNegate 387
+             389:  14(int8_t) Load 355(i8)
+             390:  52(i8vec2) CompositeConstruct 388 388
+             391:  52(i8vec2) CompositeConstruct 389 389
+             392:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 386 390 391
+                              Store 352(i8v) 392
+             393:  52(i8vec2) Load 352(i8v)
+             394:  52(i8vec2) Load 352(i8v)
+             395:  52(i8vec2) SNegate 394
+             396:  52(i8vec2) Load 352(i8v)
+             397:  52(i8vec2) ExtInst 1(GLSL.std.450) 45(SClamp) 393 395 396
+                              Store 352(i8v) 397
+             398: 199(i8vec3) Load 365(u8v)
+             399:  36(int8_t) Load 367(u8)
+             400:  36(int8_t) SNegate 399
+             401:  36(int8_t) Load 367(u8)
+             402: 199(i8vec3) CompositeConstruct 400 400 400
+             403: 199(i8vec3) CompositeConstruct 401 401 401
+             404: 199(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 398 402 403
+                              Store 365(u8v) 404
+             405: 199(i8vec3) Load 365(u8v)
+             406: 199(i8vec3) Load 365(u8v)
+             407: 199(i8vec3) SNegate 406
+             408: 199(i8vec3) Load 365(u8v)
+             409: 199(i8vec3) ExtInst 1(GLSL.std.450) 44(UClamp) 405 407 408
+                              Store 365(u8v) 409
+             410:     15(ptr) AccessChain 352(i8v) 286
+             411:  14(int8_t) Load 410
+             412:     15(ptr) AccessChain 352(i8v) 270
+             413:  14(int8_t) Load 412
+             415:  14(int8_t) Select 414 413 411
+                              Store 355(i8) 415
+             416:  14(int8_t) Load 355(i8)
+             417:  52(i8vec2) CompositeConstruct 416 416
+             418:  14(int8_t) Load 355(i8)
+             419:  14(int8_t) SNegate 418
+             420:  52(i8vec2) CompositeConstruct 419 419
+             423:  52(i8vec2) Select 422 420 417
+                              Store 352(i8v) 423
+             424:     37(ptr) AccessChain 365(u8v) 286
+             425:  36(int8_t) Load 424
+             426:     37(ptr) AccessChain 365(u8v) 270
+             427:  36(int8_t) Load 426
+             428:  36(int8_t) Select 414 427 425
+                              Store 367(u8) 428
+             429:  36(int8_t) Load 367(u8)
+             430: 199(i8vec3) CompositeConstruct 429 429 429
+             431:  36(int8_t) Load 367(u8)
+             432:  36(int8_t) SNegate 431
+             433: 199(i8vec3) CompositeConstruct 432 432 432
+             436: 199(i8vec3) Select 435 433 430
+                              Store 365(u8v) 436
+             438:  52(i8vec2) Load 352(i8v)
+             439: 57(int16_t) Bitcast 438
+                              Store 437(i16) 439
+             444: 441(i8vec4) Load 443(i8v4)
+             445:     27(int) Bitcast 444
+                              Store 440(i32) 445
+             449:  49(i8vec2) Load 448(u8v2)
+             450: 64(int16_t) Bitcast 449
+                              Store 447(u16) 450
+             455: 452(i8vec4) Load 454(u8v4)
+             456:     17(int) Bitcast 455
+                              Store 451(u32) 456
+             457: 57(int16_t) Load 437(i16)
+             458:  52(i8vec2) Bitcast 457
+                              Store 352(i8v) 458
+             459:     27(int) Load 440(i32)
+             460: 441(i8vec4) Bitcast 459
+                              Store 443(i8v4) 460
+             461: 64(int16_t) Load 447(u16)
+             462:  49(i8vec2) Bitcast 461
+                              Store 448(u8v2) 462
+             463:     17(int) Load 451(u32)
+             464: 452(i8vec4) Bitcast 463
+                              Store 454(u8v4) 464
+             467: 199(i8vec3) Load 365(u8v)
+             468:  36(int8_t) Load 367(u8)
+             469: 199(i8vec3) CompositeConstruct 468 468 468
+             470:  434(bvec3) ULessThan 467 469
+                              Store 466(bv) 470
+             471:  52(i8vec2) Load 352(i8v)
+             472:  14(int8_t) Load 355(i8)
+             473:  52(i8vec2) CompositeConstruct 472 472
+             474:  172(bvec2) SLessThan 471 473
+             475:    284(ptr) AccessChain 466(bv) 286
+             476:   171(bool) CompositeExtract 474 0
                               Store 475 476
-             477: 190(i8vec3) Load 351(u8v)
-             478:  36(int8_t) Load 353(u8)
-             479: 190(i8vec3) CompositeConstruct 478 478 478
-             480:  420(bvec3) UGreaterThan 477 479
-                              Store 452(bv) 480
-             481:  52(i8vec2) Load 338(i8v)
-             482:  14(int8_t) Load 341(i8)
-             483:  52(i8vec2) CompositeConstruct 482 482
-             484:  172(bvec2) SGreaterThan 481 483
-             485:    275(ptr) AccessChain 452(bv) 277
-             486:   171(bool) CompositeExtract 484 0
-                              Store 485 486
-             487:    275(ptr) AccessChain 452(bv) 261
-             488:   171(bool) CompositeExtract 484 1
+             477:    284(ptr) AccessChain 466(bv) 270
+             478:   171(bool) CompositeExtract 474 1
+                              Store 477 478
+             479: 199(i8vec3) Load 365(u8v)
+             480:  36(int8_t) Load 367(u8)
+             481: 199(i8vec3) CompositeConstruct 480 480 480
+             482:  434(bvec3) ULessThanEqual 479 481
+                              Store 466(bv) 482
+             483:  52(i8vec2) Load 352(i8v)
+             484:  14(int8_t) Load 355(i8)
+             485:  52(i8vec2) CompositeConstruct 484 484
+             486:  172(bvec2) SLessThanEqual 483 485
+             487:    284(ptr) AccessChain 466(bv) 286
+             488:   171(bool) CompositeExtract 486 0
                               Store 487 488
-             489: 190(i8vec3) Load 351(u8v)
-             490:  36(int8_t) Load 353(u8)
-             491: 190(i8vec3) CompositeConstruct 490 490 490
-             492:  420(bvec3) UGreaterThanEqual 489 491
-                              Store 452(bv) 492
-             493:  52(i8vec2) Load 338(i8v)
-             494:  14(int8_t) Load 341(i8)
-             495:  52(i8vec2) CompositeConstruct 494 494
-             496:  172(bvec2) SGreaterThanEqual 493 495
-             497:    275(ptr) AccessChain 452(bv) 277
-             498:   171(bool) CompositeExtract 496 0
-                              Store 497 498
-             499:    275(ptr) AccessChain 452(bv) 261
-             500:   171(bool) CompositeExtract 496 1
+             489:    284(ptr) AccessChain 466(bv) 270
+             490:   171(bool) CompositeExtract 486 1
+                              Store 489 490
+             491: 199(i8vec3) Load 365(u8v)
+             492:  36(int8_t) Load 367(u8)
+             493: 199(i8vec3) CompositeConstruct 492 492 492
+             494:  434(bvec3) UGreaterThan 491 493
+                              Store 466(bv) 494
+             495:  52(i8vec2) Load 352(i8v)
+             496:  14(int8_t) Load 355(i8)
+             497:  52(i8vec2) CompositeConstruct 496 496
+             498:  172(bvec2) SGreaterThan 495 497
+             499:    284(ptr) AccessChain 466(bv) 286
+             500:   171(bool) CompositeExtract 498 0
                               Store 499 500
-             501: 190(i8vec3) Load 351(u8v)
-             502:  36(int8_t) Load 353(u8)
-             503: 190(i8vec3) CompositeConstruct 502 502 502
-             504:  420(bvec3) IEqual 501 503
-                              Store 452(bv) 504
-             505:  52(i8vec2) Load 338(i8v)
-             506:  14(int8_t) Load 341(i8)
-             507:  52(i8vec2) CompositeConstruct 506 506
-             508:  172(bvec2) IEqual 505 507
-             509:    275(ptr) AccessChain 452(bv) 277
-             510:   171(bool) CompositeExtract 508 0
-                              Store 509 510
-             511:    275(ptr) AccessChain 452(bv) 261
-             512:   171(bool) CompositeExtract 508 1
+             501:    284(ptr) AccessChain 466(bv) 270
+             502:   171(bool) CompositeExtract 498 1
+                              Store 501 502
+             503: 199(i8vec3) Load 365(u8v)
+             504:  36(int8_t) Load 367(u8)
+             505: 199(i8vec3) CompositeConstruct 504 504 504
+             506:  434(bvec3) UGreaterThanEqual 503 505
+                              Store 466(bv) 506
+             507:  52(i8vec2) Load 352(i8v)
+             508:  14(int8_t) Load 355(i8)
+             509:  52(i8vec2) CompositeConstruct 508 508
+             510:  172(bvec2) SGreaterThanEqual 507 509
+             511:    284(ptr) AccessChain 466(bv) 286
+             512:   171(bool) CompositeExtract 510 0
                               Store 511 512
-             513: 190(i8vec3) Load 351(u8v)
-             514:  36(int8_t) Load 353(u8)
-             515: 190(i8vec3) CompositeConstruct 514 514 514
-             516:  420(bvec3) INotEqual 513 515
-                              Store 452(bv) 516
-             517:  52(i8vec2) Load 338(i8v)
-             518:  14(int8_t) Load 341(i8)
-             519:  52(i8vec2) CompositeConstruct 518 518
-             520:  172(bvec2) INotEqual 517 519
-             521:    275(ptr) AccessChain 452(bv) 277
-             522:   171(bool) CompositeExtract 520 0
-                              Store 521 522
-             523:    275(ptr) AccessChain 452(bv) 261
-             524:   171(bool) CompositeExtract 520 1
+             513:    284(ptr) AccessChain 466(bv) 270
+             514:   171(bool) CompositeExtract 510 1
+                              Store 513 514
+             515: 199(i8vec3) Load 365(u8v)
+             516:  36(int8_t) Load 367(u8)
+             517: 199(i8vec3) CompositeConstruct 516 516 516
+             518:  434(bvec3) IEqual 515 517
+                              Store 466(bv) 518
+             519:  52(i8vec2) Load 352(i8v)
+             520:  14(int8_t) Load 355(i8)
+             521:  52(i8vec2) CompositeConstruct 520 520
+             522:  172(bvec2) IEqual 519 521
+             523:    284(ptr) AccessChain 466(bv) 286
+             524:   171(bool) CompositeExtract 522 0
                               Store 523 524
+             525:    284(ptr) AccessChain 466(bv) 270
+             526:   171(bool) CompositeExtract 522 1
+                              Store 525 526
+             527: 199(i8vec3) Load 365(u8v)
+             528:  36(int8_t) Load 367(u8)
+             529: 199(i8vec3) CompositeConstruct 528 528 528
+             530:  434(bvec3) INotEqual 527 529
+                              Store 466(bv) 530
+             531:  52(i8vec2) Load 352(i8v)
+             532:  14(int8_t) Load 355(i8)
+             533:  52(i8vec2) CompositeConstruct 532 532
+             534:  172(bvec2) INotEqual 531 533
+             535:    284(ptr) AccessChain 466(bv) 286
+             536:   171(bool) CompositeExtract 534 0
+                              Store 535 536
+             537:    284(ptr) AccessChain 466(bv) 270
+             538:   171(bool) CompositeExtract 534 1
+                              Store 537 538
                               Return
                               FunctionEnd
diff --git a/Test/spv.int16.frag b/Test/spv.int16.frag
index 2feff4f..26a8c9b 100644
--- a/Test/spv.int16.frag
+++ b/Test/spv.int16.frag
@@ -116,6 +116,8 @@
     int32_t i;
     int64_t i64;
     bool    b;
+    float   f;
+    float   arr[4] = {1.0, 2.0, 3.0, 4.0};
 
     // Unary
     u16v++;
@@ -163,6 +165,9 @@
     uv = u16v & uv;
     uv ^= i16;
     u16v = u16v ^ i16;
+
+    // Index
+    f = arr[i16];
 }
 
 void builtinFuncs()
diff --git a/Test/spv.int8.frag b/Test/spv.int8.frag
index 80702b7..bd3de17 100644
--- a/Test/spv.int8.frag
+++ b/Test/spv.int8.frag
@@ -117,6 +117,8 @@
     int32_t i;
     int16_t i16;
     bool    b;
+    float   arr[4] = {1.0, 2.0, 3.0, 4.0};
+    float   f;
 
     // Unary
     u8v++;
@@ -164,6 +166,9 @@
     uv = u8v & uv;
     uv ^= i8;
     u8v = u8v ^ i8;
+
+    // Index
+    f = arr[i8];
 }
 
 void builtinFuncs()
diff --git a/glslang/MachineIndependent/ParseHelper.cpp b/glslang/MachineIndependent/ParseHelper.cpp
index b2b187b..ca37421 100644
--- a/glslang/MachineIndependent/ParseHelper.cpp
+++ b/glslang/MachineIndependent/ParseHelper.cpp
@@ -3029,11 +3029,14 @@
 
 //
 // Both test, and if necessary spit out an error, to see if the node is really
-// an integer.
+// a 32-bit integer or can implicitly convert to one.
 //
 void TParseContext::integerCheck(const TIntermTyped* node, const char* token)
 {
-    if ((node->getBasicType() == EbtInt || node->getBasicType() == EbtUint) && node->isScalar())
+    auto from_type = node->getBasicType();
+    if ((from_type == EbtInt || from_type == EbtUint ||
+         intermediate.canImplicitlyPromote(from_type, EbtInt, EOpNull) ||
+         intermediate.canImplicitlyPromote(from_type, EbtUint, EOpNull)) && node->isScalar())
         return;
 
     error(node->getLoc(), "scalar integer expression required", token, "");