Jelajahi Sumber

[spirv] Accept parentheses around LHS in assignments (#1280)

Lei Zhang 7 tahun lalu
induk
melakukan
7e3fef5cca

+ 2 - 0
tools/clang/lib/SPIRV/SPIRVEmitter.cpp

@@ -4777,6 +4777,8 @@ SpirvEvalInfo SPIRVEmitter::processAssignment(const Expr *lhs,
                                               const SpirvEvalInfo &rhs,
                                               const bool isCompoundAssignment,
                                               SpirvEvalInfo lhsPtr) {
+  lhs = lhs->IgnoreParenNoopCasts(astContext);
+
   // Assigning to vector swizzling should be handled differently.
   if (SpirvEvalInfo result = tryToAssignToVectorElements(lhs, rhs))
     return result;

+ 7 - 0
tools/clang/test/CodeGenSPIRV/op.vector.swizzle.const-scalar.hlsl

@@ -3,6 +3,7 @@
 // CHECK:  [[v4f1:%\d+]] = OpConstantComposite %v4float %float_1 %float_1 %float_1 %float_1
 // CHECK: [[v4f25:%\d+]] = OpConstantComposite %v4float %float_2_5 %float_2_5 %float_2_5 %float_2_5
 // CHECK:  [[v4f0:%\d+]] = OpConstantComposite %v4float %float_0 %float_0 %float_0 %float_0
+// CHECK:  [[v3f1:%\d+]] = OpConstantComposite %v3float %float_1 %float_1 %float_1
 
 float4 main(float input: INPUT) : SV_Target {
 
@@ -22,6 +23,12 @@ float4 main(float input: INPUT) : SV_Target {
 // CHECK-NEXT:                OpStore %d [[rhs]]
   float4 d = float4(input, input, 0.0.xx);
 
+// CHECK:        [[e:%\d+]] = OpLoad %v4float %e
+// CHECK-NEXT: [[val:%\d+]] = OpVectorShuffle %v4float [[e]] [[v3f1]] 4 5 6 3
+// CHECK-NEXT:                OpStore %e [[val]]
+  float4 e;
+  (e.xyz)  = 1.0.xxx; // Parentheses
+
 // CHECK: OpReturnValue [[v4f0]]
   return 0.0.xxxx;
 }