cf.do.nested.hlsl 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. // Run: %dxc -T ps_6_0 -E main
  2. void main() {
  3. int val=0, i=0, j=0, k=0;
  4. // CHECK: OpBranch %do_while_header
  5. // CHECK-NEXT: %do_while_header = OpLabel
  6. // CHECK-NEXT: OpLoopMerge %do_while_merge_1 %do_while_continue_1 DontUnroll
  7. [loop] do {
  8. // CHECK-NEXT: OpBranch %do_while_body
  9. // CHECK-NEXT: %do_while_body = OpLabel
  10. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %int %val
  11. // CHECK-NEXT: [[i0:%\d+]] = OpLoad %int %i
  12. // CHECK-NEXT: [[val_plus_i:%\d+]] = OpIAdd %int [[val0]] [[i0]]
  13. // CHECK-NEXT: OpStore %val [[val_plus_i]]
  14. // CHECK-NEXT: OpBranch %do_while_header_0
  15. val = val + i;
  16. // CHECK-NEXT: %do_while_header_0 = OpLabel
  17. // CHECK-NEXT: OpLoopMerge %do_while_merge_0 %do_while_continue_0 Unroll
  18. // CHECK-NEXT: OpBranch %do_while_body_0
  19. [unroll(20)] do {
  20. // CHECK-NEXT: %do_while_body_0 = OpLabel
  21. // CHECK-NEXT: OpBranch %do_while_header_1
  22. // CHECK-NEXT: %do_while_header_1 = OpLabel
  23. // CHECK-NEXT: OpLoopMerge %do_while_merge %do_while_continue DontUnroll
  24. // CHECK-NEXT: OpBranch %do_while_body_1
  25. [fastopt] do {
  26. // CHECK-NEXT: %do_while_body_1 = OpLabel
  27. // CHECK-NEXT: [[k0:%\d+]] = OpLoad %int %k
  28. // CHECK-NEXT: [[k_plus_1:%\d+]] = OpIAdd %int [[k0]] %int_1
  29. // CHECK-NEXT: OpStore %k [[k_plus_1]]
  30. // CHECK-NEXT: OpBranch %do_while_continue
  31. ++k;
  32. // CHECK-NEXT: %do_while_continue = OpLabel
  33. // CHECK-NEXT: [[k1:%\d+]] = OpLoad %int %k
  34. // CHECK-NEXT: [[k_lt_30:%\d+]] = OpSLessThan %bool [[k1]] %int_30
  35. // CHECK-NEXT: OpBranchConditional [[k_lt_30]] %do_while_header_1 %do_while_merge
  36. } while (k < 30);
  37. // CHECK-NEXT: %do_while_merge = OpLabel
  38. // CHECK-NEXT: [[j0:%\d+]] = OpLoad %int %j
  39. // CHECK-NEXT: [[j_plus_1:%\d+]] = OpIAdd %int [[j0]] %int_1
  40. // CHECK-NEXT: OpStore %j [[j_plus_1]]
  41. // CHECK-NEXT: OpBranch %do_while_continue_0
  42. ++j;
  43. // CHECK-NEXT: %do_while_continue_0 = OpLabel
  44. // CHECK-NEXT: [[j1:%\d+]] = OpLoad %int %j
  45. // CHECK-NEXT: [[j_lt_20:%\d+]] = OpSLessThan %bool [[j1]] %int_20
  46. // CHECK-NEXT: OpBranchConditional [[j_lt_20]] %do_while_header_0 %do_while_merge_0
  47. } while (j < 20);
  48. // CHECK-NEXT: %do_while_merge_0 = OpLabel
  49. // CHECK-NEXT: [[i0:%\d+]] = OpLoad %int %i
  50. // CHECK-NEXT: [[i_plus_1:%\d+]] = OpIAdd %int [[i0]] %int_1
  51. // CHECK-NEXT: OpStore %i [[i_plus_1]]
  52. // CHECK-NEXT: OpBranch %do_while_continue_1
  53. ++i;
  54. // CHECK-NEXT: %do_while_continue_1 = OpLabel
  55. // CHECK-NEXT: [[i1:%\d+]] = OpLoad %int %i
  56. // CHECK-NEXT: [[i_lt_10:%\d+]] = OpSLessThan %bool [[i1]] %int_10
  57. // CHECK-NEXT: OpBranchConditional [[i_lt_10]] %do_while_header %do_while_merge_1
  58. } while (i < 10);
  59. // CHECK-NEXT: %do_while_merge_1 = OpLabel
  60. // CHECK-NEXT: OpReturn
  61. // CHECK-NEXT: OpFunctionEnd
  62. }