cf.while.nested.hlsl 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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 %while_check
  5. // CHECK-NEXT: %while_check = OpLabel
  6. // CHECK-NEXT: [[i0:%\d+]] = OpLoad %int %i
  7. // CHECK-NEXT: [[i_lt_10:%\d+]] = OpSLessThan %bool [[i0]] %int_10
  8. // CHECK-NEXT: OpLoopMerge %while_merge_1 %while_continue_1 DontUnroll
  9. // CHECK-NEXT: OpBranchConditional [[i_lt_10]] %while_body %while_merge_1
  10. [loop] while (i < 10) {
  11. // CHECK-NEXT: %while_body = OpLabel
  12. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %int %val
  13. // CHECK-NEXT: [[i1:%\d+]] = OpLoad %int %i
  14. // CHECK-NEXT: [[val_plus_i:%\d+]] = OpIAdd %int [[val1]] [[i1]]
  15. // CHECK-NEXT: OpStore %val [[val_plus_i]]
  16. // CHECK-NEXT: OpBranch %while_check_0
  17. val = val + i;
  18. // CHECK-NEXT: %while_check_0 = OpLabel
  19. // CHECK-NEXT: [[j0:%\d+]] = OpLoad %int %j
  20. // CHECK-NEXT: [[j_lt_20:%\d+]] = OpSLessThan %bool [[j0]] %int_20
  21. // CHECK-NEXT: OpLoopMerge %while_merge_0 %while_continue_0 Unroll
  22. // CHECK-NEXT: OpBranchConditional [[j_lt_20]] %while_body_0 %while_merge_0
  23. [unroll(20)] while (j < 20) {
  24. // CHECK-NEXT: %while_body_0 = OpLabel
  25. // CHECK-NEXT: OpBranch %while_check_1
  26. // CHECK-NEXT: %while_check_1 = OpLabel
  27. // CHECK-NEXT: [[k0:%\d+]] = OpLoad %int %k
  28. // CHECK-NEXT: [[k_lt_30:%\d+]] = OpSLessThan %bool [[k0]] %int_30
  29. // CHECK-NEXT: OpLoopMerge %while_merge %while_continue DontUnroll
  30. // CHECK-NEXT: OpBranchConditional [[k_lt_30]] %while_body_1 %while_merge
  31. [fastopt] while (k < 30) {
  32. // CHECK-NEXT: %while_body_1 = OpLabel
  33. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %int %val
  34. // CHECK-NEXT: [[k2:%\d+]] = OpLoad %int %k
  35. // CHECK-NEXT: [[val_plus_k:%\d+]] = OpIAdd %int [[val2]] [[k2]]
  36. // CHECK-NEXT: OpStore %val [[val_plus_k]]
  37. val = val + k;
  38. // CHECK-NEXT: [[k3:%\d+]] = OpLoad %int %k
  39. // CHECK-NEXT: [[k_plus_1:%\d+]] = OpIAdd %int [[k3]] %int_1
  40. // CHECK-NEXT: OpStore %k [[k_plus_1]]
  41. ++k;
  42. // CHECK-NEXT: OpBranch %while_continue
  43. // CHECK-NEXT: %while_continue = OpLabel
  44. // CHECK-NEXT: OpBranch %while_check_1
  45. }
  46. // CHECK-NEXT: %while_merge = OpLabel
  47. // CHECK-NEXT: [[val3:%\d+]] = OpLoad %int %val
  48. // CHECK-NEXT: [[val_mult_2:%\d+]] = OpIMul %int [[val3]] %int_2
  49. // CHECK-NEXT: OpStore %val [[val_mult_2]]
  50. val = val * 2;
  51. // CHECK-NEXT: [[j1:%\d+]] = OpLoad %int %j
  52. // CHECK-NEXT: [[j_plus_1:%\d+]] = OpIAdd %int [[j1]] %int_1
  53. // CHECK-NEXT: OpStore %j [[j_plus_1]]
  54. ++j;
  55. // CHECK-NEXT: OpBranch %while_continue_0
  56. // CHECK-NEXT: %while_continue_0 = OpLabel
  57. // CHECK-NEXT: OpBranch %while_check_0
  58. }
  59. // CHECK-NEXT: %while_merge_0 = OpLabel
  60. // CHECK-NEXT: [[i2:%\d+]] = OpLoad %int %i
  61. // CHECK-NEXT: [[i_plus_1:%\d+]] = OpIAdd %int [[i2]] %int_1
  62. // CHECK-NEXT: OpStore %i [[i_plus_1]]
  63. ++i;
  64. // CHECK-NEXT: OpBranch %while_continue_1
  65. // CHECK-NEXT: %while_continue_1 = OpLabel
  66. // CHECK-NEXT: OpBranch %while_check
  67. }
  68. // CHECK-NEXT: %while_merge_1 = OpLabel
  69. // CHECK-NEXT: OpReturn
  70. // CHECK-NEXT: OpFunctionEnd
  71. }