cf.if.plain.hlsl 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // Run: %dxc -T ps_6_0 -E main
  2. void main() {
  3. // CHECK-LABEL: %bb_entry = OpLabel
  4. bool c;
  5. int val;
  6. // Both then and else
  7. // CHECK: [[c0:%\d+]] = OpLoad %bool %c
  8. // CHECK-NEXT: OpSelectionMerge %if_merge None
  9. // CHECK-NEXT: OpBranchConditional [[c0]] %if_true %if_false
  10. if (c) {
  11. // CHECK-LABEL: %if_true = OpLabel
  12. // CHECK-NEXT: [[val0:%\d+]] = OpLoad %int %val
  13. // CHECK-NEXT: [[val1:%\d+]] = OpIAdd %int [[val0]] %int_1
  14. // CHECK-NEXT: OpStore %val [[val1]]
  15. // CHECK-NEXT: OpBranch %if_merge
  16. val = val + 1;
  17. } else {
  18. // CHECK-LABEL: %if_false = OpLabel
  19. // CHECK-NEXT: [[val2:%\d+]] = OpLoad %int %val
  20. // CHECK-NEXT: [[val3:%\d+]] = OpIAdd %int [[val2]] %int_2
  21. // CHECK-NEXT: OpStore %val [[val3]]
  22. // CHECK-NEXT: OpBranch %if_merge
  23. val = val + 2;
  24. }
  25. // CHECK-LABEL: %if_merge = OpLabel
  26. // No else
  27. // CHECK-NEXT: [[c1:%\d+]] = OpLoad %bool %c
  28. // CHECK-NEXT: OpSelectionMerge %if_merge_0 None
  29. // CHECK-NEXT: OpBranchConditional [[c1]] %if_true_0 %if_merge_0
  30. if (c)
  31. // CHECK-LABEL: %if_true_0 = OpLabel
  32. // CHECK-NEXT: OpStore %val %int_1
  33. // CHECK-NEXT: OpBranch %if_merge_0
  34. val = 1;
  35. // CHECK-LABEL: %if_merge_0 = OpLabel
  36. // Empty then
  37. // CHECK-NEXT: [[c2:%\d+]] = OpLoad %bool %c
  38. // CHECK-NEXT: OpSelectionMerge %if_merge_1 None
  39. // CHECK-NEXT: OpBranchConditional [[c2]] %if_true_1 %if_false_0
  40. if (c) {
  41. // CHECK-LABEL: %if_true_1 = OpLabel
  42. // CHECK-NEXT: OpBranch %if_merge_1
  43. } else {
  44. // CHECK-LABEL: %if_false_0 = OpLabel
  45. // CHECK-NEXT: OpStore %val %int_2
  46. // CHECK-NEXT: OpBranch %if_merge_1
  47. val = 2;
  48. }
  49. // CHECK-LABEL: %if_merge_1 = OpLabel
  50. // Null body
  51. // CHECK-NEXT: [[c3:%\d+]] = OpLoad %bool %c
  52. // CHECK-NEXT: OpSelectionMerge %if_merge_2 None
  53. // CHECK-NEXT: OpBranchConditional [[c3]] %if_true_2 %if_merge_2
  54. if (c)
  55. // CHECK-LABEL: %if_true_2 = OpLabel
  56. // CHECK-NEXT: OpBranch %if_merge_2
  57. ;
  58. // CHECK-LABEL: %if_merge_2 = OpLabel
  59. // CHECK-NEXT: [[val4:%\d+]] = OpLoad %int %val
  60. // CHECK-NEXT: OpStore %d [[val4]]
  61. // CHECK-NEXT: [[d:%\d+]] = OpLoad %int %d
  62. // CHECK-NEXT: [[cmp:%\d+]] = OpINotEqual %bool [[d]] %int_0
  63. // CHECK-NEXT: OpSelectionMerge %if_merge_3 None
  64. // CHECK-NEXT: OpBranchConditional [[cmp]] %if_true_3 %if_merge_3
  65. if (int d = val) {
  66. // CHECK-LABEL: %if_true_3 = OpLabel
  67. // CHECK-NEXT: OpStore %c %true
  68. c = true;
  69. // CHECK-NEXT: OpBranch %if_merge_3
  70. // CHECK-LABEL:%if_merge_3 = OpLabel
  71. }
  72. // CHECK-NEXT: OpReturn
  73. }