op.vector.access.hlsl 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // Run: %dxc -T vs_6_0 -E main
  2. void main() {
  3. // CHECK-LABEL: %bb_entry = OpLabel
  4. float4 a;
  5. float1 b;
  6. float s;
  7. uint index;
  8. // Vector with more than one elements
  9. // CHECK: [[access0:%\d+]] = OpAccessChain %_ptr_Function_float %a %uint_0
  10. // CHECK-NEXT: [[a0:%\d+]] = OpLoad %float [[access0]]
  11. // CHECK-NEXT: OpStore %s [[a0]]
  12. s = a[0];
  13. // CHECK-NEXT: [[s0:%\d+]] = OpLoad %float %s
  14. // CHECK-NEXT: [[access1:%\d+]] = OpAccessChain %_ptr_Function_float %a %uint_2
  15. // CHECK-NEXT: OpStore [[access1]] [[s0]]
  16. a[2] = s;
  17. // CHECK-NEXT: [[index0:%\d+]] = OpLoad %uint %index
  18. // CHECK-NEXT: [[access2:%\d+]] = OpAccessChain %_ptr_Function_float %a [[index0]]
  19. // CHECK-NEXT: [[a1:%\d+]] = OpLoad %float [[access2]]
  20. // CHECK-NEXT: OpStore %s [[a1]]
  21. s = a[index];
  22. // CHECK-NEXT: [[s1:%\d+]] = OpLoad %float %s
  23. // CHECK-NEXT: [[index1:%\d+]] = OpLoad %uint %index
  24. // CHECK-NEXT: [[access3:%\d+]] = OpAccessChain %_ptr_Function_float %a [[index1]]
  25. // CHECK-NEXT: OpStore [[access3]] [[s1]]
  26. a[index] = s;
  27. // Vector with one elements
  28. // CHECK-NEXT: [[b0:%\d+]] = OpLoad %float %b
  29. // CHECK-NEXT: OpStore %s [[b0]]
  30. s = b[0];
  31. // CHECK-NEXT: [[s2:%\d+]] = OpLoad %float %s
  32. // CHECK-NEXT: OpStore %b [[s2]]
  33. b[0] = s;
  34. // CHECK-NEXT: [[b1:%\d+]] = OpLoad %float %b
  35. // CHECK-NEXT: OpStore %s [[b1]]
  36. s = b[index];
  37. // CHECK-NEXT: [[s3:%\d+]] = OpLoad %float %s
  38. // CHECK-NEXT: OpStore %b [[s3]]
  39. b[index] = s;
  40. // From rvalue
  41. // CHECK-NEXT: [[a2:%\d+]] = OpLoad %v4float %a
  42. // CHECK-NEXT: [[a3:%\d+]] = OpLoad %v4float %a
  43. // CHECK-NEXT: [[add:%\d+]] = OpFAdd %v4float [[a2]] [[a3]]
  44. // CHECK-NEXT: OpStore %temp_var_vector [[add]]
  45. // CHECK-NEXT: [[access4:%\d+]] = OpAccessChain %_ptr_Function_float %temp_var_vector %uint_0
  46. // CHECK-NEXT: [[s4:%\d+]] = OpLoad %float [[access4]]
  47. // CHECK-NEXT: OpStore %s [[s4]]
  48. s = (a + a)[0];
  49. // CHECK-NEXT: [[index2:%\d+]] = OpLoad %uint %index
  50. // CHECK-NEXT: [[a4:%\d+]] = OpLoad %v4float %a
  51. // CHECK-NEXT: [[a5:%\d+]] = OpLoad %v4float %a
  52. // CHECK-NEXT: [[mul:%\d+]] = OpFMul %v4float [[a4]] [[a5]]
  53. // CHECK-NEXT: OpStore %temp_var_vector_0 [[mul]]
  54. // CHECK-NEXT: [[access5:%\d+]] = OpAccessChain %_ptr_Function_float %temp_var_vector_0 [[index2]]
  55. // CHECK-NEXT: [[s5:%\d+]] = OpLoad %float [[access5]]
  56. // CHECK-NEXT: OpStore %s [[s5]]
  57. s = (a * a)[index];
  58. // The following will trigger frontend errors:
  59. // subscripted value is not an array, matrix, or vector
  60. //s = (b + b)[0];
  61. //s = (b * b)[index];
  62. }