SPV: Implement short circuiting of && and || when emitting SPIR-V.

This commit is contained in:
John Kessenich
2015-10-15 13:29:11 -06:00
parent da581a2b95
commit 7c1aa1026e
9 changed files with 1942 additions and 1429 deletions

View File

@@ -5,7 +5,7 @@ Linked fragment stage:
// Module Version 99
// Generated by (magic number): 51a00bb
// Id's are bound by 398
// Id's are bound by 416
Source GLSL 130
Capability Shader
@@ -20,15 +20,15 @@ Linked fragment stage:
Name 22 "ui"
Name 169 "uf"
Name 216 "b"
Name 242 "ub41"
Name 244 "ub42"
Name 301 "f"
Name 377 "gl_FragColor"
Name 395 "uiv4"
Name 397 "ub"
Decorate 377(gl_FragColor) BuiltIn FragColor
Decorate 395(uiv4) NoStaticUse
Decorate 397(ub) NoStaticUse
Name 250 "ub41"
Name 252 "ub42"
Name 316 "f"
Name 395 "gl_FragColor"
Name 413 "uiv4"
Name 415 "ub"
Decorate 395(gl_FragColor) BuiltIn FragColor
Decorate 413(uiv4) NoStaticUse
Decorate 415(ub) NoStaticUse
2: TypeVoid
3: TypeFunction 2
6: TypeFloat 32
@@ -45,31 +45,31 @@ Linked fragment stage:
214: TypeBool
215: TypePointer Function 214(bool)
219: TypeVector 214(bool) 4
241: TypePointer UniformConstant 219(bvec4)
242(ub41): 241(ptr) Variable UniformConstant
244(ub42): 241(ptr) Variable UniformConstant
291: 18(int) Constant 2
298: 18(int) Constant 1
300: TypePointer Function 6(float)
330: TypeVector 6(float) 3
346: 6(float) Constant 1073741824
353: 6(float) Constant 1065353216
358: 18(int) Constant 66
364: 18(int) Constant 17
376: TypePointer Output 7(fvec4)
377(gl_FragColor): 376(ptr) Variable Output
393: TypeVector 18(int) 4
394: TypePointer UniformConstant 393(ivec4)
395(uiv4): 394(ptr) Variable UniformConstant
396: TypePointer UniformConstant 214(bool)
397(ub): 396(ptr) Variable UniformConstant
249: TypePointer UniformConstant 219(bvec4)
250(ub41): 249(ptr) Variable UniformConstant
252(ub42): 249(ptr) Variable UniformConstant
306: 18(int) Constant 2
313: 18(int) Constant 1
315: TypePointer Function 6(float)
345: TypeVector 6(float) 3
364: 6(float) Constant 1073741824
371: 6(float) Constant 1065353216
376: 18(int) Constant 66
382: 18(int) Constant 17
394: TypePointer Output 7(fvec4)
395(gl_FragColor): 394(ptr) Variable Output
411: TypeVector 18(int) 4
412: TypePointer UniformConstant 411(ivec4)
413(uiv4): 412(ptr) Variable UniformConstant
414: TypePointer UniformConstant 214(bool)
415(ub): 414(ptr) Variable UniformConstant
4(main): 2 Function None 3
5: Label
9(v): 8(ptr) Variable Function
20(i): 19(ptr) Variable Function
216(b): 215(ptr) Variable Function
301(f): 300(ptr) Variable Function
378: 8(ptr) Variable Function
316(f): 315(ptr) Variable Function
396: 8(ptr) Variable Function
12: 7(fvec4) Load 11(uv4)
13: 7(fvec4) ExtInst 1(GLSL.std.450) 11(Radians) 12
Store 9(v) 13
@@ -315,199 +315,241 @@ Linked fragment stage:
221: 214(bool) Any 220
Store 216(b) 221
222: 214(bool) Load 216(b)
223: 7(fvec4) Load 9(v)
224: 7(fvec4) Load 11(uv4)
225: 219(bvec4) FOrdLessThanEqual 223 224
226: 214(bool) Any 225
227: 214(bool) LogicalAnd 222 226
Store 216(b) 227
228: 214(bool) Load 216(b)
229: 7(fvec4) Load 9(v)
230: 7(fvec4) Load 11(uv4)
231: 219(bvec4) FOrdGreaterThan 229 230
232: 214(bool) Any 231
233: 214(bool) LogicalAnd 228 232
Store 216(b) 233
234: 214(bool) Load 216(b)
235: 7(fvec4) Load 9(v)
236: 7(fvec4) Load 11(uv4)
237: 219(bvec4) FOrdGreaterThanEqual 235 236
238: 214(bool) Any 237
239: 214(bool) LogicalAnd 234 238
Store 216(b) 239
240: 214(bool) Load 216(b)
243: 219(bvec4) Load 242(ub41)
245: 219(bvec4) Load 244(ub42)
246: 219(bvec4) IEqual 243 245
247: 214(bool) Any 246
248: 214(bool) LogicalAnd 240 247
Store 216(b) 248
249: 214(bool) Load 216(b)
250: 219(bvec4) Load 242(ub41)
251: 219(bvec4) Load 244(ub42)
252: 219(bvec4) INotEqual 250 251
253: 214(bool) Any 252
254: 214(bool) LogicalAnd 249 253
Store 216(b) 254
255: 214(bool) Load 216(b)
256: 219(bvec4) Load 242(ub41)
257: 214(bool) Any 256
258: 214(bool) LogicalAnd 255 257
Store 216(b) 258
259: 214(bool) Load 216(b)
260: 219(bvec4) Load 242(ub41)
261: 214(bool) All 260
262: 214(bool) LogicalAnd 259 261
Store 216(b) 262
263: 214(bool) Load 216(b)
264: 219(bvec4) Load 242(ub41)
265: 219(bvec4) LogicalNot 264
266: 214(bool) Any 265
267: 214(bool) LogicalAnd 263 266
Store 216(b) 267
268: 18(int) Load 20(i)
269: 18(int) Load 22(ui)
270: 18(int) IAdd 268 269
271: 18(int) Load 20(i)
272: 18(int) IMul 270 271
273: 18(int) Load 22(ui)
274: 18(int) ISub 272 273
275: 18(int) Load 20(i)
276: 18(int) SDiv 274 275
Store 20(i) 276
277: 18(int) Load 20(i)
278: 18(int) Load 22(ui)
279: 18(int) SMod 277 278
Store 20(i) 279
SelectionMerge 224 None
BranchConditional 222 223 224
223: Label
225: 7(fvec4) Load 9(v)
226: 7(fvec4) Load 11(uv4)
227: 219(bvec4) FOrdLessThanEqual 225 226
228: 214(bool) Any 227
Branch 224
224: Label
229: 214(bool) Phi 222 5 228 223
Store 216(b) 229
230: 214(bool) Load 216(b)
SelectionMerge 232 None
BranchConditional 230 231 232
231: Label
233: 7(fvec4) Load 9(v)
234: 7(fvec4) Load 11(uv4)
235: 219(bvec4) FOrdGreaterThan 233 234
236: 214(bool) Any 235
Branch 232
232: Label
237: 214(bool) Phi 230 224 236 231
Store 216(b) 237
238: 214(bool) Load 216(b)
SelectionMerge 240 None
BranchConditional 238 239 240
239: Label
241: 7(fvec4) Load 9(v)
242: 7(fvec4) Load 11(uv4)
243: 219(bvec4) FOrdGreaterThanEqual 241 242
244: 214(bool) Any 243
Branch 240
240: Label
245: 214(bool) Phi 238 232 244 239
Store 216(b) 245
246: 214(bool) Load 216(b)
SelectionMerge 248 None
BranchConditional 246 247 248
247: Label
251: 219(bvec4) Load 250(ub41)
253: 219(bvec4) Load 252(ub42)
254: 219(bvec4) IEqual 251 253
255: 214(bool) Any 254
Branch 248
248: Label
256: 214(bool) Phi 246 240 255 247
Store 216(b) 256
257: 214(bool) Load 216(b)
SelectionMerge 259 None
BranchConditional 257 258 259
258: Label
260: 219(bvec4) Load 250(ub41)
261: 219(bvec4) Load 252(ub42)
262: 219(bvec4) INotEqual 260 261
263: 214(bool) Any 262
Branch 259
259: Label
264: 214(bool) Phi 257 248 263 258
Store 216(b) 264
265: 214(bool) Load 216(b)
266: 219(bvec4) Load 250(ub41)
267: 214(bool) Any 266
268: 214(bool) LogicalAnd 265 267
Store 216(b) 268
269: 214(bool) Load 216(b)
270: 219(bvec4) Load 250(ub41)
271: 214(bool) All 270
272: 214(bool) LogicalAnd 269 271
Store 216(b) 272
273: 214(bool) Load 216(b)
SelectionMerge 275 None
BranchConditional 273 274 275
274: Label
276: 219(bvec4) Load 250(ub41)
277: 219(bvec4) LogicalNot 276
278: 214(bool) Any 277
Branch 275
275: Label
279: 214(bool) Phi 273 259 278 274
Store 216(b) 279
280: 18(int) Load 20(i)
281: 18(int) Load 22(ui)
282: 214(bool) IEqual 280 281
282: 18(int) IAdd 280 281
283: 18(int) Load 20(i)
284: 18(int) Load 22(ui)
285: 214(bool) INotEqual 283 284
286: 18(int) Load 20(i)
287: 18(int) Load 22(ui)
288: 214(bool) IEqual 286 287
289: 214(bool) LogicalAnd 285 288
290: 18(int) Load 20(i)
292: 214(bool) INotEqual 290 291
293: 214(bool) LogicalNotEqual 289 292
294: 214(bool) LogicalOr 282 293
SelectionMerge 296 None
BranchConditional 294 295 296
295: Label
297: 18(int) Load 20(i)
299: 18(int) IAdd 297 298
Store 20(i) 299
Branch 296
296: Label
302: 6(float) Load 169(uf)
303: 6(float) Load 169(uf)
304: 6(float) FAdd 302 303
305: 6(float) Load 169(uf)
306: 6(float) FMul 304 305
307: 6(float) Load 169(uf)
308: 6(float) FSub 306 307
309: 6(float) Load 169(uf)
310: 6(float) FDiv 308 309
Store 301(f) 310
311: 7(fvec4) Load 9(v)
312: 6(float) ExtInst 1(GLSL.std.450) 65(Length) 311
313: 6(float) Load 301(f)
314: 6(float) FAdd 313 312
Store 301(f) 314
315: 7(fvec4) Load 9(v)
316: 7(fvec4) Load 9(v)
317: 6(float) ExtInst 1(GLSL.std.450) 66(Distance) 315 316
318: 6(float) Load 301(f)
319: 6(float) FAdd 318 317
Store 301(f) 319
320: 7(fvec4) Load 9(v)
321: 7(fvec4) Load 9(v)
322: 6(float) Dot 320 321
323: 6(float) Load 301(f)
324: 6(float) FAdd 323 322
Store 301(f) 324
325: 6(float) Load 301(f)
326: 6(float) Load 169(uf)
327: 6(float) FMul 325 326
328: 6(float) Load 301(f)
284: 18(int) IMul 282 283
285: 18(int) Load 22(ui)
286: 18(int) ISub 284 285
287: 18(int) Load 20(i)
288: 18(int) SDiv 286 287
Store 20(i) 288
289: 18(int) Load 20(i)
290: 18(int) Load 22(ui)
291: 18(int) SMod 289 290
Store 20(i) 291
292: 18(int) Load 20(i)
293: 18(int) Load 22(ui)
294: 214(bool) IEqual 292 293
295: 214(bool) LogicalNot 294
SelectionMerge 297 None
BranchConditional 295 296 297
296: Label
298: 18(int) Load 20(i)
299: 18(int) Load 22(ui)
300: 214(bool) INotEqual 298 299
301: 18(int) Load 20(i)
302: 18(int) Load 22(ui)
303: 214(bool) IEqual 301 302
304: 214(bool) LogicalAnd 300 303
305: 18(int) Load 20(i)
307: 214(bool) INotEqual 305 306
308: 214(bool) LogicalNotEqual 304 307
Branch 297
297: Label
309: 214(bool) Phi 294 275 308 296
SelectionMerge 311 None
BranchConditional 309 310 311
310: Label
312: 18(int) Load 20(i)
314: 18(int) IAdd 312 313
Store 20(i) 314
Branch 311
311: Label
317: 6(float) Load 169(uf)
318: 6(float) Load 169(uf)
319: 6(float) FAdd 317 318
320: 6(float) Load 169(uf)
321: 6(float) FMul 319 320
322: 6(float) Load 169(uf)
323: 6(float) FSub 321 322
324: 6(float) Load 169(uf)
325: 6(float) FDiv 323 324
Store 316(f) 325
326: 7(fvec4) Load 9(v)
327: 6(float) ExtInst 1(GLSL.std.450) 65(Length) 326
328: 6(float) Load 316(f)
329: 6(float) FAdd 328 327
Store 301(f) 329
Store 316(f) 329
330: 7(fvec4) Load 9(v)
331: 7(fvec4) Load 9(v)
332: 330(fvec3) VectorShuffle 331 331 0 1 2
333: 7(fvec4) Load 9(v)
334: 330(fvec3) VectorShuffle 333 333 0 1 2
335: 330(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 332 334
336: 6(float) CompositeExtract 335 0
337: 6(float) Load 301(f)
338: 6(float) FAdd 337 336
Store 301(f) 338
339: 6(float) Load 301(f)
340: 6(float) Load 169(uf)
341: 214(bool) FOrdEqual 339 340
342: 6(float) Load 301(f)
343: 6(float) Load 169(uf)
344: 214(bool) FOrdNotEqual 342 343
345: 6(float) Load 301(f)
347: 214(bool) FOrdNotEqual 345 346
348: 214(bool) LogicalAnd 344 347
349: 214(bool) LogicalOr 341 348
SelectionMerge 351 None
BranchConditional 349 350 351
350: Label
352: 6(float) Load 301(f)
354: 6(float) FAdd 352 353
Store 301(f) 354
Branch 351
351: Label
355: 18(int) Load 22(ui)
356: 18(int) Load 20(i)
357: 18(int) BitwiseAnd 356 355
Store 20(i) 357
359: 18(int) Load 20(i)
360: 18(int) BitwiseOr 359 358
Store 20(i) 360
361: 18(int) Load 22(ui)
362: 18(int) Load 20(i)
363: 18(int) BitwiseXor 362 361
Store 20(i) 363
365: 18(int) Load 20(i)
366: 18(int) SMod 365 364
Store 20(i) 366
367: 18(int) Load 20(i)
368: 18(int) ShiftRightArithmetic 367 291
Store 20(i) 368
369: 18(int) Load 22(ui)
370: 18(int) Load 20(i)
371: 18(int) ShiftLeftLogical 370 369
Store 20(i) 371
372: 18(int) Load 20(i)
373: 18(int) Not 372
Store 20(i) 373
374: 214(bool) Load 216(b)
375: 214(bool) LogicalNot 374
Store 216(b) 375
379: 214(bool) Load 216(b)
SelectionMerge 381 None
BranchConditional 379 380 390
380: Label
382: 18(int) Load 20(i)
383: 6(float) ConvertSToF 382
384: 7(fvec4) CompositeConstruct 383 383 383 383
385: 6(float) Load 301(f)
386: 7(fvec4) CompositeConstruct 385 385 385 385
387: 7(fvec4) FAdd 384 386
388: 7(fvec4) Load 9(v)
389: 7(fvec4) FAdd 387 388
Store 378 389
Branch 381
390: Label
391: 7(fvec4) Load 9(v)
Store 378 391
Branch 381
381: Label
392: 7(fvec4) Load 378
Store 377(gl_FragColor) 392
332: 6(float) ExtInst 1(GLSL.std.450) 66(Distance) 330 331
333: 6(float) Load 316(f)
334: 6(float) FAdd 333 332
Store 316(f) 334
335: 7(fvec4) Load 9(v)
336: 7(fvec4) Load 9(v)
337: 6(float) Dot 335 336
338: 6(float) Load 316(f)
339: 6(float) FAdd 338 337
Store 316(f) 339
340: 6(float) Load 316(f)
341: 6(float) Load 169(uf)
342: 6(float) FMul 340 341
343: 6(float) Load 316(f)
344: 6(float) FAdd 343 342
Store 316(f) 344
346: 7(fvec4) Load 9(v)
347: 345(fvec3) VectorShuffle 346 346 0 1 2
348: 7(fvec4) Load 9(v)
349: 345(fvec3) VectorShuffle 348 348 0 1 2
350: 345(fvec3) ExtInst 1(GLSL.std.450) 67(Cross) 347 349
351: 6(float) CompositeExtract 350 0
352: 6(float) Load 316(f)
353: 6(float) FAdd 352 351
Store 316(f) 353
354: 6(float) Load 316(f)
355: 6(float) Load 169(uf)
356: 214(bool) FOrdEqual 354 355
357: 214(bool) LogicalNot 356
SelectionMerge 359 None
BranchConditional 357 358 359
358: Label
360: 6(float) Load 316(f)
361: 6(float) Load 169(uf)
362: 214(bool) FOrdNotEqual 360 361
363: 6(float) Load 316(f)
365: 214(bool) FOrdNotEqual 363 364
366: 214(bool) LogicalAnd 362 365
Branch 359
359: Label
367: 214(bool) Phi 356 311 366 358
SelectionMerge 369 None
BranchConditional 367 368 369
368: Label
370: 6(float) Load 316(f)
372: 6(float) FAdd 370 371
Store 316(f) 372
Branch 369
369: Label
373: 18(int) Load 22(ui)
374: 18(int) Load 20(i)
375: 18(int) BitwiseAnd 374 373
Store 20(i) 375
377: 18(int) Load 20(i)
378: 18(int) BitwiseOr 377 376
Store 20(i) 378
379: 18(int) Load 22(ui)
380: 18(int) Load 20(i)
381: 18(int) BitwiseXor 380 379
Store 20(i) 381
383: 18(int) Load 20(i)
384: 18(int) SMod 383 382
Store 20(i) 384
385: 18(int) Load 20(i)
386: 18(int) ShiftRightArithmetic 385 306
Store 20(i) 386
387: 18(int) Load 22(ui)
388: 18(int) Load 20(i)
389: 18(int) ShiftLeftLogical 388 387
Store 20(i) 389
390: 18(int) Load 20(i)
391: 18(int) Not 390
Store 20(i) 391
392: 214(bool) Load 216(b)
393: 214(bool) LogicalNot 392
Store 216(b) 393
397: 214(bool) Load 216(b)
SelectionMerge 399 None
BranchConditional 397 398 408
398: Label
400: 18(int) Load 20(i)
401: 6(float) ConvertSToF 400
402: 7(fvec4) CompositeConstruct 401 401 401 401
403: 6(float) Load 316(f)
404: 7(fvec4) CompositeConstruct 403 403 403 403
405: 7(fvec4) FAdd 402 404
406: 7(fvec4) Load 9(v)
407: 7(fvec4) FAdd 405 406
Store 396 407
Branch 399
408: Label
409: 7(fvec4) Load 9(v)
Store 396 409
Branch 399
399: Label
410: 7(fvec4) Load 396
Store 395(gl_FragColor) 410
Return
FunctionEnd