cf.while.plain.hlsl 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. //////////////////////////
  7. //// Basic while loop ////
  8. //////////////////////////
  9. // CHECK: OpBranch %while_check
  10. // CHECK-NEXT: %while_check = OpLabel
  11. // CHECK-NEXT: [[i:%\d+]] = OpLoad %int %i
  12. // CHECK-NEXT: [[i_lt_10:%\d+]] = OpSLessThan %bool [[i]] %int_10
  13. // CHECK-NEXT: OpLoopMerge %while_merge %while_continue None
  14. // CHECK-NEXT: OpBranchConditional [[i_lt_10]] %while_body %while_merge
  15. while (i < 10) {
  16. // CHECK-NEXT: %while_body = OpLabel
  17. // CHECK-NEXT: [[i1:%\d+]] = OpLoad %int %i
  18. // CHECK-NEXT: OpStore %val [[i1]]
  19. val = i;
  20. // CHECK-NEXT: OpBranch %while_continue
  21. // CHECK-NEXT: %while_continue = OpLabel
  22. // CHECK-NEXT: OpBranch %while_check
  23. }
  24. // CHECK-NEXT: %while_merge = OpLabel
  25. //////////////////////////
  26. //// infinite loop ////
  27. //////////////////////////
  28. // CHECK-NEXT: OpBranch %while_check_0
  29. // CHECK-NEXT: %while_check_0 = OpLabel
  30. // CHECK-NEXT: OpLoopMerge %while_merge_0 %while_continue_0 None
  31. // CHECK-NEXT: OpBranchConditional %true %while_body_0 %while_merge_0
  32. while (true) {
  33. // CHECK-NEXT: %while_body_0 = OpLabel
  34. // CHECK-NEXT: OpStore %val %int_0
  35. val = 0;
  36. // CHECK-NEXT: OpBranch %while_continue_0
  37. // CHECK-NEXT: %while_continue_0 = OpLabel
  38. // CHECK-NEXT: OpBranch %while_check_0
  39. }
  40. // CHECK-NEXT: %while_merge_0 = OpLabel
  41. // CHECK-NEXT: OpBranch %while_check_1
  42. //////////////////////////
  43. //// Null Body ////
  44. //////////////////////////
  45. // CHECK-NEXT: %while_check_1 = OpLabel
  46. // CHECK-NEXT: [[val1:%\d+]] = OpLoad %int %val
  47. // CHECK-NEXT: [[val_lt_20:%\d+]] = OpSLessThan %bool [[val1]] %int_20
  48. // CHECK-NEXT: OpLoopMerge %while_merge_1 %while_continue_1 None
  49. // CHECK-NEXT: OpBranchConditional [[val_lt_20]] %while_body_1 %while_merge_1
  50. while (val < 20)
  51. // CHECK-NEXT: %while_body_1 = OpLabel
  52. // CHECK-NEXT: OpBranch %while_continue_1
  53. // CHECK-NEXT: %while_continue_1 = OpLabel
  54. // CHECK-NEXT: OpBranch %while_check_1
  55. ;
  56. // CHECK-NEXT: %while_merge_1 = OpLabel
  57. // CHECK-NEXT: OpBranch %while_check_2
  58. ////////////////////////////////////////////////////////////////
  59. //// Condition variable has VarDecl ////
  60. //// foo() returns an integer which must be cast to boolean ////
  61. ////////////////////////////////////////////////////////////////
  62. // CHECK-NEXT: %while_check_2 = OpLabel
  63. // CHECK-NEXT: [[foo:%\d+]] = OpFunctionCall %int %foo
  64. // CHECK-NEXT: OpStore %a [[foo]]
  65. // CHECK-NEXT: [[a:%\d+]] = OpLoad %int %a
  66. // CHECK-NEXT: [[is_a_true:%\d+]] = OpINotEqual %bool [[a]] %int_0
  67. // CHECK-NEXT: OpLoopMerge %while_merge_2 %while_continue_2 None
  68. // CHECK-NEXT: OpBranchConditional [[is_a_true]] %while_body_2 %while_merge_2
  69. while (int a = foo()) {
  70. // CHECK-NEXT: %while_body_2 = OpLabel
  71. // CHECK-NEXT: [[a1:%\d+]] = OpLoad %int %a
  72. // CHECK-NEXT: OpStore %val [[a1]]
  73. val = a;
  74. // CHECK-NEXT: OpBranch %while_continue_2
  75. // CHECK-NEXT: %while_continue_2 = OpLabel
  76. // CHECK-NEXT: OpBranch %while_check_2
  77. }
  78. // CHECK-NEXT: %while_merge_2 = OpLabel
  79. // CHECK-NEXT: OpReturn
  80. // CHECK-NEXT: OpFunctionEnd
  81. }