noops_call.hlsl 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. // RUN: %dxc -preserve-intermediate-values -E main -T ps_6_0 %s -Od | FileCheck %s
  2. typedef float4 MyCoolFloat4;
  3. static float4 myStaticGlobalVar = float4(1.0, 1.0, 1.0, 1.0);
  4. // Local var with same name as outer scope
  5. float4 localScopeVar_func(float4 val)
  6. {
  7. float4 color = val * val;
  8. return color;
  9. }
  10. // Local var with same name as register
  11. float4 localRegVar_func(float4 val)
  12. {
  13. float4 r1 = val;
  14. return r1;
  15. }
  16. // Array
  17. float4 array_func(float4 val)
  18. {
  19. float result[4];
  20. result[0] = val.x;
  21. result[1] = val.y;
  22. result[2] = val.z;
  23. result[3] = val.w;
  24. return float4(result[0], result[1], result[2], result[3]);
  25. }
  26. // Typedef
  27. float4 typedef_func(float4 val)
  28. {
  29. MyCoolFloat4 result = val;
  30. return result;
  31. }
  32. // Global
  33. float4 global_func(float4 val)
  34. {
  35. myStaticGlobalVar *= val;
  36. return myStaticGlobalVar;
  37. }
  38. float4 depth4(float4 val)
  39. {
  40. val = val * val;
  41. return val;
  42. }
  43. float4 depth3(float4 val)
  44. {
  45. val = depth4(val) * val;
  46. return val;
  47. }
  48. float4 depth2(float4 val)
  49. {
  50. val = depth3(val) * val;
  51. return val;
  52. }
  53. [RootSignature("")]
  54. float4 main( float4 unused : SV_POSITION, float4 color : COLOR ) : SV_Target
  55. {
  56. // CHECK: %[[p_load:[0-9]+]] = load i32, i32*
  57. // CHECK-SAME: @dx.preserve.value
  58. // CHECK: %[[p:[0-9]+]] = trunc i32 %[[p_load]] to i1
  59. float4 ret1 = localScopeVar_func(color);
  60. // ** call **
  61. // CHECK: load i32, i32*
  62. // CHECK-SAME: @dx.nothing
  63. // CHECK: %[[v1:.+]] = fmul
  64. // CHECK: %[[v2:.+]] = fmul
  65. // CHECK: %[[v3:.+]] = fmul
  66. // CHECK: %[[v4:.+]] = fmul
  67. // CHECK: select i1 %[[p]], float %[[v1]], float %[[v1]]
  68. // CHECK: select i1 %[[p]], float %[[v2]], float %[[v2]]
  69. // CHECK: select i1 %[[p]], float %[[v3]], float %[[v3]]
  70. // CHECK: select i1 %[[p]], float %[[v4]], float %[[v4]]
  71. // ** return **
  72. float4 ret2 = localRegVar_func(ret1);
  73. // ** call **
  74. // CHECK: load i32, i32*
  75. // CHECK-SAME: @dx.nothing
  76. // ** copy **
  77. // CHECK: select i1 %[[p]],
  78. // CHECK: select i1 %[[p]],
  79. // CHECK: select i1 %[[p]],
  80. // CHECK: select i1 %[[p]],
  81. // ** return **
  82. float4 ret3 = array_func(ret2);
  83. // ** call **
  84. // CHECK: load i32, i32*
  85. // CHECK-SAME: @dx.nothing
  86. // CHECK: store
  87. // CHECK: store
  88. // CHECK: store
  89. // CHECK: store
  90. // CHECK: load
  91. // CHECK: load
  92. // CHECK: load
  93. // CHECK: load
  94. // ** return **
  95. float4 ret4 = typedef_func(ret3);
  96. // ** call **
  97. // CHECK: load i32, i32*
  98. // CHECK-SAME: @dx.nothing
  99. // ** copy **
  100. // CHECK: select i1 %[[p]], float %{{.+}}
  101. // CHECK: select i1 %[[p]], float %{{.+}}
  102. // CHECK: select i1 %[[p]], float %{{.+}}
  103. // CHECK: select i1 %[[p]], float %{{.+}}
  104. // ** return **
  105. float4 ret5 = global_func(ret4);
  106. // ** call **
  107. // CHECK: load i32, i32*
  108. // CHECK-SAME: @dx.nothing
  109. // CHECK: %[[a1:.+]] = fmul
  110. // CHECK: %[[a2:.+]] = fmul
  111. // CHECK: %[[a3:.+]] = fmul
  112. // CHECK: %[[a4:.+]] = fmul
  113. // CHECK: select i1 %[[p]], float %[[a1]], float %[[a1]]
  114. // CHECK: select i1 %[[p]], float %[[a2]], float %[[a2]]
  115. // CHECK: select i1 %[[p]], float %[[a3]], float %[[a3]]
  116. // CHECK: select i1 %[[p]], float %[[a4]], float %[[a4]]
  117. // ** return **
  118. float4 ret6 = depth2(ret5);
  119. // ** call **
  120. // CHECK: load i32, i32*
  121. // CHECK-SAME: @dx.nothing
  122. // depth2() {
  123. // ** call **
  124. // CHECK: load i32, i32*
  125. // CHECK-SAME: @dx.nothing
  126. // depth3() {
  127. // ** call **
  128. // CHECK: load i32, i32*
  129. // CHECK-SAME: @dx.nothing
  130. // depth4() {
  131. // CHECK: %[[b1:.+]] = fmul
  132. // CHECK: %[[b2:.+]] = fmul
  133. // CHECK: %[[b3:.+]] = fmul
  134. // CHECK: %[[b4:.+]] = fmul
  135. // CHECK: load i32, i32*
  136. // CHECK-SAME: @dx.nothing
  137. // }
  138. // CHECK: %[[c1:.+]] = fmul
  139. // CHECK: %[[c2:.+]] = fmul
  140. // CHECK: %[[c3:.+]] = fmul
  141. // CHECK: %[[c4:.+]] = fmul
  142. // CHECK: load i32, i32*
  143. // CHECK-SAME: @dx.nothing
  144. // }
  145. // CHECK: %[[d1:.+]] = fmul
  146. // CHECK: %[[d2:.+]] = fmul
  147. // CHECK: %[[d3:.+]] = fmul
  148. // CHECK: %[[d4:.+]] = fmul
  149. // }
  150. // CHECK: select i1 %[[p]], float %{{.+}}, float %[[d1]]
  151. // CHECK: select i1 %[[p]], float %{{.+}}, float %[[d2]]
  152. // CHECK: select i1 %[[p]], float %{{.+}}, float %[[d3]]
  153. // CHECK: select i1 %[[p]], float %{{.+}}, float %[[d4]]
  154. return max(ret6, color);
  155. // CHECK: call float @dx.op.binary.f32(i32 35
  156. // CHECK: call float @dx.op.binary.f32(i32 35
  157. // CHECK: call float @dx.op.binary.f32(i32 35
  158. // CHECK: call float @dx.op.binary.f32(i32 35
  159. }