cf.for.continue.hlsl 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Run: %dxc -T ps_6_0 -E main
  2. void main() {
  3. int val = 0;
  4. // CHECK: OpBranch %for_check
  5. // CHECK-NEXT: %for_check = OpLabel
  6. // CHECK: OpLoopMerge %for_merge %for_continue None
  7. // CHECK-NEXT: OpBranchConditional {{%\d+}} %for_body %for_merge
  8. for (int i = 0; i < 10; ++i) {
  9. // CHECK-NEXT: %for_body = OpLabel
  10. // CHECK: OpSelectionMerge %if_merge None
  11. // CHECK-NEXT: OpBranchConditional {{%\d+}} %if_true %if_merge
  12. if (i < 5) {
  13. // CHECK-NEXT: %if_true = OpLabel
  14. // CHECK-NEXT: OpBranch %for_continue
  15. continue;
  16. }
  17. // CHECK-NEXT: %if_merge = OpLabel
  18. val = i;
  19. // CHECK: OpBranch %for_continue
  20. {continue;}
  21. val++; // No SPIR-V should be emitted for this statement.
  22. continue; // No SPIR-V should be emitted for this statement.
  23. while(true); // No SPIR-V should be emitted for this statement.
  24. // CHECK-NEXT: %for_continue = OpLabel
  25. // CHECK: OpBranch %for_check
  26. }
  27. // CHECK-NEXT: %for_merge = OpLabel
  28. // CHECK-NEXT: OpStore %j %int_0
  29. // CHECK-NEXT: OpBranch %for_check_0
  30. //////////////////////////////////////////////////////////////////////////////////////
  31. // Nested for loops with continue statements //
  32. // Each continue statement should branch to the corresponding loop's continue block //
  33. //////////////////////////////////////////////////////////////////////////////////////
  34. // CHECK-NEXT: %for_check_0 = OpLabel
  35. // CHECK: OpLoopMerge %for_merge_1 %for_continue_1 None
  36. // CHECK-NEXT: OpBranchConditional {{%\d+}} %for_body_0 %for_merge_1
  37. for (int j = 0; j < 10; ++j) {
  38. // CHECK-NEXT: %for_body_0 = OpLabel
  39. val = j+5;
  40. // CHECK: OpBranch %for_check_1
  41. // CHECK-NEXT: %for_check_1 = OpLabel
  42. // CHECK: OpLoopMerge %for_merge_0 %for_continue_0 None
  43. // CHECK-NEXT: OpBranchConditional {{%\d+}} %for_body_1 %for_merge_0
  44. for ( ; val < 20; ++val) {
  45. // CHECK-NEXT: %for_body_1 = OpLabel
  46. int k = val + j;
  47. // CHECK: OpBranch %for_continue_0
  48. continue;
  49. k++; // No SPIR-V should be emitted for this statement.
  50. // CHECK-NEXT: %for_continue_0 = OpLabel
  51. // CHECK: OpBranch %for_check_1
  52. }
  53. // CHECK-NEXT: %for_merge_0 = OpLabel
  54. val--;
  55. // CHECK: OpBranch %for_continue_1
  56. continue;
  57. continue; // No SPIR-V should be emitted for this statement.
  58. val = val*10; // No SPIR-V should be emitted for this statement.
  59. // CHECK-NEXT: %for_continue_1 = OpLabel
  60. // CHECK: OpBranch %for_check_0
  61. }
  62. // CHECK-NEXT: %for_merge_1 = OpLabel
  63. }