cf.for.nested.hlsl 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // Run: %dxc -T ps_6_0 -E main
  2. void main() {
  3. // CHECK-LABEL: %bb_entry = OpLabel
  4. int val = 0;
  5. // CHECK: OpStore %val %int_0
  6. // CHECK-NEXT: OpStore %i %int_0
  7. // CHECK-NEXT: OpBranch %for_check
  8. // CHECK-LABEL: %for_check = OpLabel
  9. // CHECK-NEXT: [[i0:%\d+]] = OpLoad %int %i
  10. // CHECK-NEXT: [[lt0:%\d+]] = OpSLessThan %bool [[i0]] %int_10
  11. // CHECK-NEXT: OpLoopMerge %for_merge_1 %for_continue_1 Unroll
  12. // CHECK-NEXT: OpBranchConditional [[lt0]] %for_body %for_merge_1
  13. [unroll] for (int i = 0; i < 10; ++i) {
  14. // CHECK-LABEL: %for_body = OpLabel
  15. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %int %val
  16. // CHECK-NEXT: [[i1:%\d+]] = OpLoad %int %i
  17. // CHECK-NEXT: [[add0:%\d+]] = OpIAdd %int [[val0]] [[i1]]
  18. // CHECK-NEXT: OpStore %val [[add0]]
  19. val = val + i;
  20. // CHECK-NEXT: OpStore %j %int_0
  21. // CHECK-NEXT: OpBranch %for_check_0
  22. // CHECK-LABEL: %for_check_0 = OpLabel
  23. // CHECK-NEXT: [[j0:%\d+]] = OpLoad %int %j
  24. // CHECK-NEXT: [[lt1:%\d+]] = OpSLessThan %bool [[j0]] %int_10
  25. // CHECK-NEXT: OpLoopMerge %for_merge_0 %for_continue_0 DontUnroll
  26. // CHECK-NEXT: OpBranchConditional [[lt1]] %for_body_0 %for_merge_0
  27. [loop] for (int j = 0; j < 10; ++j) {
  28. // CHECK-LABEL: %for_body_0 = OpLabel
  29. // CHECK-NEXT: OpStore %k %int_0
  30. // CHECK-NEXT: OpBranch %for_check_1
  31. // CHECK-LABEL: %for_check_1 = OpLabel
  32. // CHECK-NEXT: [[k0:%\d+]] = OpLoad %int %k
  33. // CHECK-NEXT: [[lt2:%\d+]] = OpSLessThan %bool [[k0]] %int_10
  34. // CHECK-NEXT: OpLoopMerge %for_merge %for_continue DontUnroll
  35. // CHECK-NEXT: OpBranchConditional [[lt2]] %for_body_1 %for_merge
  36. [fastopt] for (int k = 0; k < 10; ++k) {
  37. // CHECK-LABEL: %for_body_1 = OpLabel
  38. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %int %val
  39. // CHECK-NEXT: [[k1:%\d+]] = OpLoad %int %k
  40. // CHECK-NEXT: [[add1:%\d+]] = OpIAdd %int [[val1]] [[k1]]
  41. // CHECK-NEXT: OpStore %val [[add1]]
  42. // CHECK-NEXT: OpBranch %for_continue
  43. val = val + k;
  44. // CHECK-LABEL: %for_continue = OpLabel
  45. // CHECK-NEXT: [[k2:%\d+]] = OpLoad %int %k
  46. // CHECK-NEXT: [[add2:%\d+]] = OpIAdd %int [[k2]] %int_1
  47. // CHECK-NEXT: OpStore %k [[add2]]
  48. // CHECK-NEXT: OpBranch %for_check_1
  49. }
  50. // CHECK-LABEL: %for_merge = OpLabel
  51. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %int %val
  52. // CHECK-NEXT: [[mul0:%\d+]] = OpIMul %int [[val2]] %int_2
  53. // CHECK-NEXT: OpStore %val [[mul0]]
  54. // CHECK-NEXT: OpBranch %for_continue_0
  55. val = val * 2;
  56. // CHECK-LABEL: %for_continue_0 = OpLabel
  57. // CHECK-NEXT: [[j1:%\d+]] = OpLoad %int %j
  58. // CHECK-NEXT: [[add3:%\d+]] = OpIAdd %int [[j1]] %int_1
  59. // CHECK-NEXT: OpStore %j [[add3]]
  60. // CHECK-NEXT: OpBranch %for_check_0
  61. }
  62. // CHECK-LABEL: %for_merge_0 = OpLabel
  63. // CHECK-NEXT: OpBranch %for_continue_1
  64. // CHECK-LABEL: %for_continue_1 = OpLabel
  65. // CHECK-NEXT: [[i2:%\d+]] = OpLoad %int %i
  66. // CHECK-NEXT: [[add4:%\d+]] = OpIAdd %int [[i2]] %int_1
  67. // CHECK-NEXT: OpStore %i [[add4]]
  68. // CHECK-NEXT: OpBranch %for_check
  69. }
  70. // CHECK-LABEL: %for_merge_1 = OpLabel
  71. // CHECK-NEXT: OpReturn
  72. }