// Run: %dxc -T ps_6_0 -E main int foo() { return true; } void main() { int val = 0; int i = 0; // CHECK: OpBranch %while_check // CHECK: %while_check = OpLabel // CHECK: [[i_lt_10:%\d+]] = OpSLessThan %bool {{%\d+}} %int_10 // CHECK-NEXT: OpLoopMerge %while_merge %while_continue None // CHECK-NEXT: OpBranchConditional [[i_lt_10]] %while_body %while_merge while (i < 10) { // CHECK-NEXT: %while_body = OpLabel val = i; // CHECK: [[val_gt_5:%\d+]] = OpSGreaterThan %bool {{%\d+}} %int_5 // CHECK-NEXT: OpSelectionMerge %if_merge None // CHECK-NEXT: OpBranchConditional [[val_gt_5]] %if_true %if_merge if (val > 5) { // CHECK-NEXT: %if_true = OpLabel // CHECK-NEXT: OpBranch %while_continue continue; } // CHECK-NEXT: %if_merge = OpLabel // CHECK: [[val_gt_6:%\d+]] = OpSGreaterThan %bool {{%\d+}} %int_6 // CHECK-NEXT: OpSelectionMerge %if_merge_0 None // CHECK-NEXT: OpBranchConditional [[val_gt_6]] %if_true_0 %if_merge_0 if (val > 6) { // CHECK-NEXT: %if_true_0 = OpLabel // CHECK-NEXT: OpBranch %while_continue {{continue;}} val++; // No SPIR-V should be emitted for this statement. continue; // No SPIR-V should be emitted for this statement. while(true); // No SPIR-V should be emitted for this statement. --i; // No SPIR-V should be emitted for this statement. } // CHECK-NEXT: %if_merge_0 = OpLabel // CHECK-NEXT: OpBranch %while_continue // CHECK-NEXT: %while_continue = OpLabel // CHECK-NEXT: OpBranch %while_check } // CHECK-NEXT: %while_merge = OpLabel ////////////////////////////////////////////////////////////////////////////////////// // Nested while loops with continue statements // // Each continue statement should branch to the corresponding loop's continue block // ////////////////////////////////////////////////////////////////////////////////////// // CHECK-NEXT: OpBranch %while_check_0 // CHECK-NEXT: %while_check_0 = OpLabel // CHECK-NEXT: OpLoopMerge %while_merge_1 %while_continue_1 None // CHECK-NEXT: OpBranchConditional %true %while_body_0 %while_merge_1 while (true) { // CHECK-NEXT: %while_body_0 = OpLabel i++; // CHECK: OpBranch %while_check_1 // CHECK-NEXT: %while_check_1 = OpLabel // CHECK: [[i_lt_20:%\d+]] = OpSLessThan %bool {{%\d+}} %int_20 // CHECK-NEXT: OpLoopMerge %while_merge_0 %while_continue_0 None // CHECK-NEXT: OpBranchConditional [[i_lt_20]] %while_body_1 %while_merge_0 while(i<20) { // CHECK-NEXT: %while_body_1 = OpLabel val = i; // CHECK: OpBranch %while_continue_0 continue; // CHECK-NEXT: %while_continue_0 = OpLabel // CHECK-NEXT: OpBranch %while_check_1 } // CHECK-NEXT: %while_merge_0 = OpLabel --i; // CHECK: OpBranch %while_continue_1 continue; continue; // No SPIR-V should be emitted for this statement. // CHECK-NEXT: %while_continue_1 = OpLabel // CHECK-NEXT: OpBranch %while_check_0 } // CHECK-NEXT: %while_merge_1 = OpLabel }