diff --git a/SPIRV/InReadableOrder.cpp b/SPIRV/InReadableOrder.cpp index 4eb56d64..9180dc8c 100644 --- a/SPIRV/InReadableOrder.cpp +++ b/SPIRV/InReadableOrder.cpp @@ -67,8 +67,9 @@ class ReadableOrderTraverser { public: explicit ReadableOrderTraverser(std::function callback) : callback_(callback) {} // Visits the block if it hasn't been visited already and isn't currently - // being delayed. Invokes callback(block), then descends into its successors. - // Delays merge-block processing until all the branches have been completed. + // being delayed. Invokes callback(block), then descends into its + // successors. Delays merge-block and continue-block processing until all + // the branches have been completed. void visit(Block* block) { assert(block); @@ -77,14 +78,25 @@ public: callback_(block); visited_[block] = true; Block* mergeBlock = nullptr; + Block* continueBlock = nullptr; auto mergeInst = block->getMergeInstruction(); if (mergeInst) { Id mergeId = mergeInst->getIdOperand(0); mergeBlock = block->getParent().getParent().getInstruction(mergeId)->getBlock(); delayed_[mergeBlock] = true; + if (mergeInst->getOpCode() == spv::OpLoopMerge) { + Id continueId = mergeInst->getIdOperand(1); + continueBlock = + block->getParent().getParent().getInstruction(continueId)->getBlock(); + delayed_[continueBlock] = true; + } } for (const auto succ : block->getSuccessors()) visit(succ); + if (continueBlock) { + delayed_[continueBlock] = false; + visit(continueBlock); + } if (mergeBlock) { delayed_[mergeBlock] = false; visit(mergeBlock); diff --git a/Test/baseResults/spv.do-while-continue-break.vert.out b/Test/baseResults/spv.do-while-continue-break.vert.out index 1b5ff62b..c8f0b2f9 100644 --- a/Test/baseResults/spv.do-while-continue-break.vert.out +++ b/Test/baseResults/spv.do-while-continue-break.vert.out @@ -66,12 +66,6 @@ Linked vertex stage: 19: Label Store 21(B) 22 Branch 13 - 13: Label - 37: 6(int) Load 8(i) - 38: 6(int) IAdd 37 22 - Store 8(i) 38 - 40: 17(bool) SLessThan 38 39 - BranchConditional 40 10 12 20: Label 25: 6(int) Load 8(i) 27: 17(bool) IEqual 25 26 @@ -83,6 +77,12 @@ Linked vertex stage: 29: Label Store 35(F) 36 Branch 13 + 13: Label + 37: 6(int) Load 8(i) + 38: 6(int) IAdd 37 22 + Store 8(i) 38 + 40: 17(bool) SLessThan 38 39 + BranchConditional 40 10 12 12: Label Store 41(G) 42 Return diff --git a/Test/baseResults/spv.for-continue-break.vert.out b/Test/baseResults/spv.for-continue-break.vert.out index 6aaf82a3..33c61386 100644 --- a/Test/baseResults/spv.for-continue-break.vert.out +++ b/Test/baseResults/spv.for-continue-break.vert.out @@ -67,11 +67,6 @@ Linked vertex stage: 24: Label Store 26(B) 19 Branch 13 - 13: Label - 40: 6(int) Load 8(i) - 41: 6(int) IAdd 40 19 - Store 8(i) 41 - Branch 10 25: Label 29: 6(int) Load 8(i) 31: 6(int) SMod 29 30 @@ -84,6 +79,11 @@ Linked vertex stage: 34: Label Store 38(F) 39 Branch 13 + 13: Label + 40: 6(int) Load 8(i) + 41: 6(int) IAdd 40 19 + Store 8(i) 41 + Branch 10 12: Label Store 42(G) 43 Return diff --git a/Test/baseResults/spv.loops.frag.out b/Test/baseResults/spv.loops.frag.out index a4556933..98d2878b 100755 --- a/Test/baseResults/spv.loops.frag.out +++ b/Test/baseResults/spv.loops.frag.out @@ -197,6 +197,8 @@ Linked fragment stage: 43: 7(fvec4) FAdd 42 28 Store 9(color) 43 Branch 15 + 16: Label + Branch 13 15: Label Branch 45 45: Label @@ -236,14 +238,14 @@ Linked fragment stage: BranchConditional 77 78 79 78: Label Branch 63 - 63: Label - Branch 60 79: Label 81: 7(fvec4) Load 69(bigColor1_1) 82: 7(fvec4) Load 9(color) 83: 7(fvec4) FAdd 82 81 Store 9(color) 83 Branch 63 + 63: Label + Branch 60 62: Label Branch 84 84: Label @@ -482,17 +484,17 @@ Linked fragment stage: BranchConditional 260 261 262 261: Label Branch 249 - 249: Label - 267: 141(int) Load 245(i) - 268: 141(int) IAdd 267 159 - Store 245(i) 268 - Branch 246 262: Label 264: 21(ptr) AccessChain 9(color) 73 265: 6(float) Load 264 266: 6(float) FAdd 265 93 Store 264 266 Branch 249 + 249: Label + 267: 141(int) Load 245(i) + 268: 141(int) IAdd 267 159 + Store 245(i) 268 + Branch 246 248: Label Store 269(i) 144 Branch 270 @@ -545,12 +547,6 @@ Linked fragment stage: BranchConditional 304 305 306 305: Label Branch 296 - 296: Label - 325: 21(ptr) AccessChain 9(color) 64 - 326: 6(float) Load 325 - 327: 6(float) Load 132(d4) - 328: 17(bool) FOrdLessThan 326 327 - BranchConditional 328 293 295 306: Label 308: 21(ptr) AccessChain 9(color) 107 309: 6(float) Load 308 @@ -576,6 +572,12 @@ Linked fragment stage: Branch 313 313: Label Branch 296 + 296: Label + 325: 21(ptr) AccessChain 9(color) 64 + 326: 6(float) Load 325 + 327: 6(float) Load 132(d4) + 328: 17(bool) FOrdLessThan 326 327 + BranchConditional 328 293 295 295: Label Branch 329 329: Label @@ -891,14 +893,14 @@ Linked fragment stage: Branch 549 549: Label Branch 524 - 524: Label - Branch 521 539: Label 558: 7(fvec4) Load 9(color) 559: 7(fvec4) CompositeConstruct 93 93 93 93 560: 7(fvec4) FAdd 558 559 Store 9(color) 560 Branch 523 + 524: Label + Branch 521 523: Label Branch 562 562: Label @@ -927,8 +929,6 @@ Linked fragment stage: BranchConditional 583 584 585 584: Label Branch 565 - 565: Label - Branch 562 585: Label Branch 579 579: Label @@ -940,6 +940,8 @@ Linked fragment stage: 592: 21(ptr) AccessChain 9(color) 107 Store 592 591 Branch 565 + 565: Label + Branch 562 564: Label 593: 7(fvec4) Load 9(color) 594: 7(fvec4) CompositeConstruct 93 93 93 93 diff --git a/Test/baseResults/spv.loopsArtificial.frag.out b/Test/baseResults/spv.loopsArtificial.frag.out index dd700ca0..e1bf0859 100755 --- a/Test/baseResults/spv.loopsArtificial.frag.out +++ b/Test/baseResults/spv.loopsArtificial.frag.out @@ -171,12 +171,6 @@ Linked fragment stage: 49: 6(float) FAdd 47 48 Store 46 49 Branch 16 - 16: Label - 69: 24(ptr) AccessChain 9(color) 35 - 70: 6(float) Load 69 - 71: 6(float) Load 28(d4) - 72: 30(bool) FOrdLessThan 70 71 - BranchConditional 72 13 15 45: Label Branch 33 33: Label @@ -204,6 +198,12 @@ Linked fragment stage: Branch 57 57: Label Branch 16 + 16: Label + 69: 24(ptr) AccessChain 9(color) 35 + 70: 6(float) Load 69 + 71: 6(float) Load 28(d4) + 72: 30(bool) FOrdLessThan 70 71 + BranchConditional 72 13 15 15: Label Branch 73 73: Label @@ -261,8 +261,6 @@ Linked fragment stage: 117: 6(float) FAdd 116 48 Store 115 117 Branch 76 - 76: Label - Branch 73 114: Label Branch 104 104: Label @@ -290,6 +288,8 @@ Linked fragment stage: Branch 124 124: Label Branch 76 + 76: Label + Branch 73 75: Label 136: 7(fvec4) Load 9(color) 137: 7(fvec4) CompositeConstruct 48 48 48 48 diff --git a/Test/baseResults/spv.while-continue-break.vert.out b/Test/baseResults/spv.while-continue-break.vert.out index 3f13b7c8..aedd4371 100644 --- a/Test/baseResults/spv.while-continue-break.vert.out +++ b/Test/baseResults/spv.while-continue-break.vert.out @@ -60,8 +60,6 @@ Linked vertex stage: 24: Label Store 26(B) 21 Branch 13 - 13: Label - Branch 10 25: Label 29: 6(int) Load 8(i) 31: 6(int) SMod 29 30 @@ -76,6 +74,8 @@ Linked vertex stage: 37: 6(int) IAdd 36 19 Store 8(i) 37 Branch 13 + 13: Label + Branch 10 12: Label Store 38(D) 39 Return