cf.while.continue.hlsl 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // Run: %dxc -T ps_6_0 -E main
  2. int foo() { return true; }
  3. void main() {
  4. int val = 0;
  5. int i = 0;
  6. // CHECK: OpBranch %while_check
  7. // CHECK: %while_check = OpLabel
  8. // CHECK: [[i_lt_10:%\d+]] = OpSLessThan %bool {{%\d+}} %int_10
  9. // CHECK-NEXT: OpLoopMerge %while_merge %while_continue None
  10. // CHECK-NEXT: OpBranchConditional [[i_lt_10]] %while_body %while_merge
  11. while (i < 10) {
  12. // CHECK-NEXT: %while_body = OpLabel
  13. val = i;
  14. // CHECK: [[val_gt_5:%\d+]] = OpSGreaterThan %bool {{%\d+}} %int_5
  15. // CHECK-NEXT: OpSelectionMerge %if_merge None
  16. // CHECK-NEXT: OpBranchConditional [[val_gt_5]] %if_true %if_merge
  17. if (val > 5) {
  18. // CHECK-NEXT: %if_true = OpLabel
  19. // CHECK-NEXT: OpBranch %while_continue
  20. continue;
  21. }
  22. // CHECK-NEXT: %if_merge = OpLabel
  23. // CHECK: [[val_gt_6:%\d+]] = OpSGreaterThan %bool {{%\d+}} %int_6
  24. // CHECK-NEXT: OpSelectionMerge %if_merge_0 None
  25. // CHECK-NEXT: OpBranchConditional [[val_gt_6]] %if_true_0 %if_merge_0
  26. if (val > 6) {
  27. // CHECK-NEXT: %if_true_0 = OpLabel
  28. // CHECK-NEXT: OpBranch %while_continue
  29. {{continue;}}
  30. val++; // No SPIR-V should be emitted for this statement.
  31. continue; // No SPIR-V should be emitted for this statement.
  32. while(true); // No SPIR-V should be emitted for this statement.
  33. --i; // No SPIR-V should be emitted for this statement.
  34. }
  35. // CHECK-NEXT: %if_merge_0 = OpLabel
  36. // CHECK-NEXT: OpBranch %while_continue
  37. // CHECK-NEXT: %while_continue = OpLabel
  38. // CHECK-NEXT: OpBranch %while_check
  39. }
  40. // CHECK-NEXT: %while_merge = OpLabel
  41. //////////////////////////////////////////////////////////////////////////////////////
  42. // Nested while loops with continue statements //
  43. // Each continue statement should branch to the corresponding loop's continue block //
  44. //////////////////////////////////////////////////////////////////////////////////////
  45. // CHECK-NEXT: OpBranch %while_check_0
  46. // CHECK-NEXT: %while_check_0 = OpLabel
  47. // CHECK-NEXT: OpLoopMerge %while_merge_1 %while_continue_1 None
  48. // CHECK-NEXT: OpBranchConditional %true %while_body_0 %while_merge_1
  49. while (true) {
  50. // CHECK-NEXT: %while_body_0 = OpLabel
  51. i++;
  52. // CHECK: OpBranch %while_check_1
  53. // CHECK-NEXT: %while_check_1 = OpLabel
  54. // CHECK: [[i_lt_20:%\d+]] = OpSLessThan %bool {{%\d+}} %int_20
  55. // CHECK-NEXT: OpLoopMerge %while_merge_0 %while_continue_0 None
  56. // CHECK-NEXT: OpBranchConditional [[i_lt_20]] %while_body_1 %while_merge_0
  57. while(i<20) {
  58. // CHECK-NEXT: %while_body_1 = OpLabel
  59. val = i;
  60. // CHECK: OpBranch %while_continue_0
  61. continue;
  62. // CHECK-NEXT: %while_continue_0 = OpLabel
  63. // CHECK-NEXT: OpBranch %while_check_1
  64. }
  65. // CHECK-NEXT: %while_merge_0 = OpLabel
  66. --i;
  67. // CHECK: OpBranch %while_continue_1
  68. continue;
  69. continue; // No SPIR-V should be emitted for this statement.
  70. // CHECK-NEXT: %while_continue_1 = OpLabel
  71. // CHECK-NEXT: OpBranch %while_check_0
  72. }
  73. // CHECK-NEXT: %while_merge_1 = OpLabel
  74. }