From aa22301b4b2fa22ae2c7521a38d16eb3533f3803 Mon Sep 17 00:00:00 2001 From: Erich Gubler Date: Thu, 17 Nov 2022 05:43:56 -0500 Subject: [PATCH] Parenthesize unary negations to avoid `--` (#2087) * fix(glsl-out,hlsl-out,msl-out): parenthesize unary negations a la `wgsl` everywhere Unify parenthesization of unary negations across all backends with what the `wgsl` backend does, which is `()`. This avoids ambiguity with output languages for which `--` is a different operation; in this case, we've been accidentally emitting prefix decrements. * build: update `rspirv` 0.11 -> 0.12 (FIXME: use upstream release) * test: add `operators::negation_avoids_prefix_decrement` test Co-authored-by: Dzmitry Malyshau --- Cargo.toml | 2 +- src/back/glsl/mod.rs | 2 +- src/back/hlsl/writer.rs | 3 +- src/back/msl/writer.rs | 3 +- tests/in/operators.wgsl | 13 +- tests/out/glsl/operators.main.Compute.glsl | 24 +- tests/out/hlsl/operators.hlsl | 27 +- tests/out/msl/operators.msl | 27 +- tests/out/spv/operators.spvasm | 1136 ++++++++++---------- tests/out/wgsl/operators.wgsl | 10 + 10 files changed, 666 insertions(+), 581 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 80a4915b5..c9f589421 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -73,7 +73,7 @@ diff = "0.1" ron = "~0.7.1" serde = { version = "1.0", features = ["derive"] } spirv = { version = "0.2", features = ["deserialize"] } -rspirv = "0.11" +rspirv = { version = "0.11", git = "https://github.com/gfx-rs/rspirv", rev = "b969f175d5663258b4891e44b76c1544da9661ab" } env_logger = "0.9" [workspace] diff --git a/src/back/glsl/mod.rs b/src/back/glsl/mod.rs index a3f2a5383..3698b7978 100644 --- a/src/back/glsl/mod.rs +++ b/src/back/glsl/mod.rs @@ -2519,7 +2519,7 @@ impl<'a, W: Write> Writer<'a, W> { }, }; - write!(self.out, "({}", operator)?; + write!(self.out, "{}(", operator)?; } } diff --git a/src/back/hlsl/writer.rs b/src/back/hlsl/writer.rs index e29d2c41d..c0f244230 100644 --- a/src/back/hlsl/writer.rs +++ b/src/back/hlsl/writer.rs @@ -2395,8 +2395,9 @@ impl<'a, W: fmt::Write> super::Writer<'a, W> { } }, }; - write!(self.out, "{}", op_str)?; + write!(self.out, "{}(", op_str)?; self.write_expr(module, expr, func_ctx)?; + write!(self.out, ")")?; } Expression::As { expr, diff --git a/src/back/msl/writer.rs b/src/back/msl/writer.rs index bee66fc68..7617ca9a6 100644 --- a/src/back/msl/writer.rs +++ b/src/back/msl/writer.rs @@ -1500,8 +1500,9 @@ impl Writer { _ => return Err(Error::Validation), }, }; - write!(self.out, "{}", op_str)?; + write!(self.out, "{}(", op_str)?; self.put_expression(expr, context, false)?; + write!(self.out, ")")?; } crate::Expression::Binary { op, left, right } => { let op_str = crate::back::binary_operation_str(op); diff --git a/tests/in/operators.wgsl b/tests/in/operators.wgsl index 1f6155397..be185399e 100644 --- a/tests/in/operators.wgsl +++ b/tests/in/operators.wgsl @@ -105,8 +105,6 @@ fn logical() { fn arithmetic() { // unary - // TODO: uncomment when we get the changes from https://github.com/gfx-rs/rspirv/pull/231 - // _ = -1; _ = -1.0; _ = -vec2(1); _ = -vec2(1.0); @@ -314,3 +312,14 @@ fn main() { comparison(); assignment(); } + +fn negation_avoids_prefix_decrement() { + _ = -1; + _ = - -2; + _ = -(-3); + _ = -(- 4); + _ = - - -5; + _ = - - - - 6; + _ = - - -(- -7); + _ = (- - - - -8); +} diff --git a/tests/out/glsl/operators.main.Compute.glsl b/tests/out/glsl/operators.main.Compute.glsl index 32716658f..30d7c53a3 100644 --- a/tests/out/glsl/operators.main.Compute.glsl +++ b/tests/out/glsl/operators.main.Compute.glsl @@ -67,7 +67,7 @@ float constructors() { } void logical() { - bool unnamed_11 = (!true); + bool unnamed_11 = !(true); bvec2 unnamed_12 = not(bvec2(true)); bool unnamed_13 = (true || false); bool unnamed_14 = (true && false); @@ -78,8 +78,8 @@ void logical() { } void arithmetic() { - ivec2 unnamed_19 = (-ivec2(1)); - vec2 unnamed_20 = (-vec2(1.0)); + ivec2 unnamed_19 = -(ivec2(1)); + vec2 unnamed_20 = -(vec2(1.0)); int unnamed_21 = (2 + 1); uint unnamed_22 = (2u + 1u); float unnamed_23 = (2.0 + 1.0); @@ -150,10 +150,10 @@ void arithmetic() { } void bit() { - int unnamed_88 = (~1); - uint unnamed_89 = (~1u); - ivec2 unnamed_90 = (~ivec2(1)); - uvec3 unnamed_91 = (~uvec3(1u)); + int unnamed_88 = ~(1); + uint unnamed_89 = ~(1u); + ivec2 unnamed_90 = ~(ivec2(1)); + uvec3 unnamed_91 = ~(uvec3(1u)); int unnamed_92 = (2 | 1); uint unnamed_93 = (2u | 1u); ivec2 unnamed_94 = (ivec2(2) | ivec2(1)); @@ -251,6 +251,16 @@ void assignment() { return; } +void negation_avoids_prefix_decrement() { + int unnamed_148 = -(-2); + int unnamed_149 = -(-3); + int unnamed_150 = -(-(4)); + int unnamed_151 = -(-(-5)); + int unnamed_152 = -(-(-(-(6)))); + int unnamed_153 = -(-(-(-(-7)))); + int unnamed_154 = -(-(-(-(-8)))); +} + void main() { vec4 _e4 = builtins(); vec4 _e5 = splat(); diff --git a/tests/out/hlsl/operators.hlsl b/tests/out/hlsl/operators.hlsl index 62e028f80..743ca2813 100644 --- a/tests/out/hlsl/operators.hlsl +++ b/tests/out/hlsl/operators.hlsl @@ -95,8 +95,8 @@ float constructors() void logical() { - bool unnamed_11 = !true; - bool2 unnamed_12 = !(true).xx; + bool unnamed_11 = !(true); + bool2 unnamed_12 = !((true).xx); bool unnamed_13 = (true || false); bool unnamed_14 = (true && false); bool unnamed_15 = (true | false); @@ -107,8 +107,8 @@ void logical() void arithmetic() { - int2 unnamed_19 = -(1).xx; - float2 unnamed_20 = -(1.0).xx; + int2 unnamed_19 = -((1).xx); + float2 unnamed_20 = -((1.0).xx); int unnamed_21 = (2 + 1); uint unnamed_22 = (2u + 1u); float unnamed_23 = (2.0 + 1.0); @@ -180,10 +180,10 @@ void arithmetic() void bit() { - int unnamed_88 = ~1; - uint unnamed_89 = ~1u; - int2 unnamed_90 = ~(1).xx; - uint3 unnamed_91 = ~(1u).xxx; + int unnamed_88 = ~(1); + uint unnamed_89 = ~(1u); + int2 unnamed_90 = ~((1).xx); + uint3 unnamed_91 = ~((1u).xxx); int unnamed_92 = (2 | 1); uint unnamed_93 = (2u | 1u); int2 unnamed_94 = ((2).xx | (1).xx); @@ -284,6 +284,17 @@ void assignment() return; } +void negation_avoids_prefix_decrement() +{ + int unnamed_148 = -(-2); + int unnamed_149 = -(-3); + int unnamed_150 = -(-(4)); + int unnamed_151 = -(-(-5)); + int unnamed_152 = -(-(-(-(6)))); + int unnamed_153 = -(-(-(-(-7)))); + int unnamed_154 = -(-(-(-(-8)))); +} + [numthreads(1, 1, 1)] void main() { diff --git a/tests/out/msl/operators.msl b/tests/out/msl/operators.msl index 0c3872000..72a0c3025 100644 --- a/tests/out/msl/operators.msl +++ b/tests/out/msl/operators.msl @@ -95,8 +95,8 @@ float constructors( void logical( ) { - bool unnamed_11 = !true; - metal::bool2 unnamed_12 = !metal::bool2(true); + bool unnamed_11 = !(true); + metal::bool2 unnamed_12 = !(metal::bool2(true)); bool unnamed_13 = true || false; bool unnamed_14 = true && false; bool unnamed_15 = true | false; @@ -107,8 +107,8 @@ void logical( void arithmetic( ) { - metal::int2 unnamed_19 = -metal::int2(1); - metal::float2 unnamed_20 = -metal::float2(1.0); + metal::int2 unnamed_19 = -(metal::int2(1)); + metal::float2 unnamed_20 = -(metal::float2(1.0)); int unnamed_21 = 2 + 1; uint unnamed_22 = 2u + 1u; float unnamed_23 = 2.0 + 1.0; @@ -180,10 +180,10 @@ void arithmetic( void bit( ) { - int unnamed_88 = ~1; - uint unnamed_89 = ~1u; - metal::int2 unnamed_90 = ~metal::int2(1); - metal::uint3 unnamed_91 = ~metal::uint3(1u); + int unnamed_88 = ~(1); + uint unnamed_89 = ~(1u); + metal::int2 unnamed_90 = ~(metal::int2(1)); + metal::uint3 unnamed_91 = ~(metal::uint3(1u)); int unnamed_92 = 2 | 1; uint unnamed_93 = 2u | 1u; metal::int2 unnamed_94 = metal::int2(2) | metal::int2(1); @@ -283,6 +283,17 @@ void assignment( return; } +void negation_avoids_prefix_decrement( +) { + int unnamed_148 = -(-2); + int unnamed_149 = -(-3); + int unnamed_150 = -(-(4)); + int unnamed_151 = -(-(-5)); + int unnamed_152 = -(-(-(-(6)))); + int unnamed_153 = -(-(-(-(-7)))); + int unnamed_154 = -(-(-(-(-8)))); +} + kernel void main_( ) { metal::float4 _e4 = builtins(); diff --git a/tests/out/spv/operators.spvasm b/tests/out/spv/operators.spvasm index 0fde0a707..87f6ce309 100644 --- a/tests/out/spv/operators.spvasm +++ b/tests/out/spv/operators.spvasm @@ -1,16 +1,16 @@ ; SPIR-V ; Version: 1.1 ; Generator: rspirv -; Bound: 543 +; Bound: 572 OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 -OpEntryPoint GLCompute %531 "main" -OpExecutionMode %531 LocalSize 1 1 1 -OpMemberDecorate %31 0 Offset 0 -OpMemberDecorate %31 1 Offset 16 -OpDecorate %35 ArrayStride 32 -OpDecorate %36 ArrayStride 4 +OpEntryPoint GLCompute %560 "main" +OpExecutionMode %560 LocalSize 1 1 1 +OpMemberDecorate %39 0 Offset 0 +OpMemberDecorate %39 1 Offset 16 +OpDecorate %43 ArrayStride 32 +OpDecorate %44 ArrayStride 4 %2 = OpTypeVoid %4 = OpTypeFloat 32 %3 = OpConstant %4 1.0 @@ -35,566 +35,598 @@ OpDecorate %36 ArrayStride 4 %23 = OpConstant %4 -1.0 %24 = OpConstant %20 2 %25 = OpConstant %20 1 -%26 = OpTypeVector %4 4 -%27 = OpTypeVector %8 4 -%28 = OpTypeVector %10 4 -%29 = OpTypeVector %4 2 -%30 = OpTypeVector %4 3 -%31 = OpTypeStruct %26 %8 -%32 = OpTypeMatrix %29 2 -%33 = OpTypeMatrix %26 4 -%34 = OpTypeVector %20 2 -%35 = OpTypeArray %31 %21 -%36 = OpTypeArray %8 %22 -%37 = OpTypeMatrix %30 2 -%38 = OpTypeMatrix %30 3 -%39 = OpTypeMatrix %30 4 -%40 = OpTypeMatrix %26 3 -%41 = OpTypeVector %8 3 -%42 = OpConstantComposite %26 %3 %3 %3 %3 -%43 = OpConstantComposite %26 %5 %5 %5 %5 -%44 = OpConstantComposite %26 %6 %6 %6 %6 -%45 = OpConstantComposite %27 %7 %7 %7 %7 -%46 = OpConstantComposite %34 %19 %19 -%47 = OpConstantComposite %29 %5 %5 -%48 = OpConstantComposite %32 %47 %47 -%49 = OpConstantComposite %26 %5 %5 %5 %5 -%50 = OpConstantComposite %31 %49 %11 -%51 = OpConstantComposite %35 %50 %50 %50 -%52 = OpConstantComposite %30 %5 %5 %5 -%53 = OpConstantComposite %37 %52 %52 -%54 = OpConstantComposite %38 %52 %52 %52 -%55 = OpConstantComposite %39 %52 %52 %52 %52 -%56 = OpConstantComposite %40 %49 %49 %49 -%57 = OpConstantComposite %41 %11 %11 %11 -%60 = OpTypeFunction %26 -%100 = OpTypePointer Function %29 -%101 = OpConstantNull %29 -%104 = OpTypeFunction %29 -%120 = OpTypeFunction %30 %30 -%122 = OpTypeVector %10 3 -%129 = OpTypePointer Function %31 -%130 = OpConstantNull %31 -%133 = OpTypeFunction %4 -%158 = OpTypePointer Function %26 -%159 = OpTypePointer Function %4 -%164 = OpTypeFunction %2 -%167 = OpTypeVector %10 2 -%183 = OpTypeVector %8 2 -%194 = OpTypeVector %20 3 -%489 = OpTypePointer Function %8 -%491 = OpTypePointer Function %41 -%521 = OpTypePointer Function %8 -%59 = OpFunction %26 None %60 -%58 = OpLabel -OpBranch %61 -%61 = OpLabel -%62 = OpSelect %8 %9 %7 %11 -%64 = OpCompositeConstruct %28 %9 %9 %9 %9 -%63 = OpSelect %26 %64 %42 %43 -%65 = OpCompositeConstruct %28 %12 %12 %12 %12 -%66 = OpSelect %26 %65 %43 %42 -%67 = OpExtInst %26 %1 FMix %43 %42 %44 -%69 = OpCompositeConstruct %26 %13 %13 %13 %13 -%68 = OpExtInst %26 %1 FMix %43 %42 %69 -%70 = OpCompositeExtract %8 %45 0 -%71 = OpBitcast %4 %70 -%72 = OpBitcast %26 %45 -%73 = OpConvertFToS %27 %43 -%74 = OpCompositeConstruct %27 %62 %62 %62 %62 -%75 = OpIAdd %27 %74 %73 -%76 = OpConvertSToF %26 %75 -%77 = OpFAdd %26 %76 %63 -%78 = OpFAdd %26 %77 %67 -%79 = OpFAdd %26 %78 %68 -%80 = OpCompositeConstruct %26 %71 %71 %71 %71 -%81 = OpFAdd %26 %79 %80 -%82 = OpFAdd %26 %81 %72 -OpReturnValue %82 +%26 = OpConstant %8 -1 +%27 = OpConstant %8 -2 +%28 = OpConstant %8 -3 +%29 = OpConstant %8 4 +%30 = OpConstant %8 -5 +%31 = OpConstant %8 6 +%32 = OpConstant %8 -7 +%33 = OpConstant %8 -8 +%34 = OpTypeVector %4 4 +%35 = OpTypeVector %8 4 +%36 = OpTypeVector %10 4 +%37 = OpTypeVector %4 2 +%38 = OpTypeVector %4 3 +%39 = OpTypeStruct %34 %8 +%40 = OpTypeMatrix %37 2 +%41 = OpTypeMatrix %34 4 +%42 = OpTypeVector %20 2 +%43 = OpTypeArray %39 %21 +%44 = OpTypeArray %8 %22 +%45 = OpTypeMatrix %38 2 +%46 = OpTypeMatrix %38 3 +%47 = OpTypeMatrix %38 4 +%48 = OpTypeMatrix %34 3 +%49 = OpTypeVector %8 3 +%50 = OpConstantComposite %34 %3 %3 %3 %3 +%51 = OpConstantComposite %34 %5 %5 %5 %5 +%52 = OpConstantComposite %34 %6 %6 %6 %6 +%53 = OpConstantComposite %35 %7 %7 %7 %7 +%54 = OpConstantComposite %42 %19 %19 +%55 = OpConstantComposite %37 %5 %5 +%56 = OpConstantComposite %40 %55 %55 +%57 = OpConstantComposite %34 %5 %5 %5 %5 +%58 = OpConstantComposite %39 %57 %11 +%59 = OpConstantComposite %43 %58 %58 %58 +%60 = OpConstantComposite %38 %5 %5 %5 +%61 = OpConstantComposite %45 %60 %60 +%62 = OpConstantComposite %46 %60 %60 %60 +%63 = OpConstantComposite %47 %60 %60 %60 %60 +%64 = OpConstantComposite %48 %57 %57 %57 +%65 = OpConstantComposite %49 %11 %11 %11 +%68 = OpTypeFunction %34 +%108 = OpTypePointer Function %37 +%109 = OpConstantNull %37 +%112 = OpTypeFunction %37 +%128 = OpTypeFunction %38 %38 +%130 = OpTypeVector %10 3 +%137 = OpTypePointer Function %39 +%138 = OpConstantNull %39 +%141 = OpTypeFunction %4 +%166 = OpTypePointer Function %34 +%167 = OpTypePointer Function %4 +%172 = OpTypeFunction %2 +%175 = OpTypeVector %10 2 +%191 = OpTypeVector %8 2 +%202 = OpTypeVector %20 3 +%497 = OpTypePointer Function %8 +%499 = OpTypePointer Function %49 +%529 = OpTypePointer Function %8 +%67 = OpFunction %34 None %68 +%66 = OpLabel +OpBranch %69 +%69 = OpLabel +%70 = OpSelect %8 %9 %7 %11 +%72 = OpCompositeConstruct %36 %9 %9 %9 %9 +%71 = OpSelect %34 %72 %50 %51 +%73 = OpCompositeConstruct %36 %12 %12 %12 %12 +%74 = OpSelect %34 %73 %51 %50 +%75 = OpExtInst %34 %1 FMix %51 %50 %52 +%77 = OpCompositeConstruct %34 %13 %13 %13 %13 +%76 = OpExtInst %34 %1 FMix %51 %50 %77 +%78 = OpCompositeExtract %8 %53 0 +%79 = OpBitcast %4 %78 +%80 = OpBitcast %34 %53 +%81 = OpConvertFToS %35 %51 +%82 = OpCompositeConstruct %35 %70 %70 %70 %70 +%83 = OpIAdd %35 %82 %81 +%84 = OpConvertSToF %34 %83 +%85 = OpFAdd %34 %84 %71 +%86 = OpFAdd %34 %85 %75 +%87 = OpFAdd %34 %86 %76 +%88 = OpCompositeConstruct %34 %79 %79 %79 %79 +%89 = OpFAdd %34 %87 %88 +%90 = OpFAdd %34 %89 %80 +OpReturnValue %90 OpFunctionEnd -%84 = OpFunction %26 None %60 -%83 = OpLabel -OpBranch %85 -%85 = OpLabel -%86 = OpCompositeConstruct %29 %14 %14 -%87 = OpCompositeConstruct %29 %3 %3 -%88 = OpFAdd %29 %87 %86 -%89 = OpCompositeConstruct %29 %15 %15 -%90 = OpFSub %29 %88 %89 -%91 = OpCompositeConstruct %29 %16 %16 -%92 = OpFDiv %29 %90 %91 -%93 = OpCompositeConstruct %27 %17 %17 %17 %17 -%94 = OpCompositeConstruct %27 %18 %18 %18 %18 -%95 = OpSRem %27 %93 %94 -%96 = OpVectorShuffle %26 %92 %92 0 1 0 1 -%97 = OpConvertSToF %26 %95 -%98 = OpFAdd %26 %96 %97 -OpReturnValue %98 +%92 = OpFunction %34 None %68 +%91 = OpLabel +OpBranch %93 +%93 = OpLabel +%94 = OpCompositeConstruct %37 %14 %14 +%95 = OpCompositeConstruct %37 %3 %3 +%96 = OpFAdd %37 %95 %94 +%97 = OpCompositeConstruct %37 %15 %15 +%98 = OpFSub %37 %96 %97 +%99 = OpCompositeConstruct %37 %16 %16 +%100 = OpFDiv %37 %98 %99 +%101 = OpCompositeConstruct %35 %17 %17 %17 %17 +%102 = OpCompositeConstruct %35 %18 %18 %18 %18 +%103 = OpSRem %35 %101 %102 +%104 = OpVectorShuffle %34 %100 %100 0 1 0 1 +%105 = OpConvertSToF %34 %103 +%106 = OpFAdd %34 %104 %105 +OpReturnValue %106 OpFunctionEnd -%103 = OpFunction %29 None %104 -%102 = OpLabel -%99 = OpVariable %100 Function %101 -OpBranch %105 -%105 = OpLabel -%106 = OpCompositeConstruct %29 %14 %14 -OpStore %99 %106 -%107 = OpLoad %29 %99 -%108 = OpCompositeConstruct %29 %3 %3 -%109 = OpFAdd %29 %107 %108 -OpStore %99 %109 -%110 = OpLoad %29 %99 -%111 = OpCompositeConstruct %29 %15 %15 -%112 = OpFSub %29 %110 %111 -OpStore %99 %112 -%113 = OpLoad %29 %99 -%114 = OpCompositeConstruct %29 %16 %16 -%115 = OpFDiv %29 %113 %114 -OpStore %99 %115 -%116 = OpLoad %29 %99 -OpReturnValue %116 +%111 = OpFunction %37 None %112 +%110 = OpLabel +%107 = OpVariable %108 Function %109 +OpBranch %113 +%113 = OpLabel +%114 = OpCompositeConstruct %37 %14 %14 +OpStore %107 %114 +%115 = OpLoad %37 %107 +%116 = OpCompositeConstruct %37 %3 %3 +%117 = OpFAdd %37 %115 %116 +OpStore %107 %117 +%118 = OpLoad %37 %107 +%119 = OpCompositeConstruct %37 %15 %15 +%120 = OpFSub %37 %118 %119 +OpStore %107 %120 +%121 = OpLoad %37 %107 +%122 = OpCompositeConstruct %37 %16 %16 +%123 = OpFDiv %37 %121 %122 +OpStore %107 %123 +%124 = OpLoad %37 %107 +OpReturnValue %124 OpFunctionEnd -%119 = OpFunction %30 None %120 -%118 = OpFunctionParameter %30 -%117 = OpLabel -OpBranch %121 -%121 = OpLabel -%123 = OpCompositeConstruct %30 %5 %5 %5 -%124 = OpFUnordNotEqual %122 %118 %123 -%125 = OpCompositeConstruct %30 %5 %5 %5 -%126 = OpCompositeConstruct %30 %3 %3 %3 -%127 = OpSelect %30 %124 %126 %125 -OpReturnValue %127 +%127 = OpFunction %38 None %128 +%126 = OpFunctionParameter %38 +%125 = OpLabel +OpBranch %129 +%129 = OpLabel +%131 = OpCompositeConstruct %38 %5 %5 %5 +%132 = OpFUnordNotEqual %130 %126 %131 +%133 = OpCompositeConstruct %38 %5 %5 %5 +%134 = OpCompositeConstruct %38 %3 %3 %3 +%135 = OpSelect %38 %132 %134 %133 +OpReturnValue %135 OpFunctionEnd -%132 = OpFunction %4 None %133 -%131 = OpLabel -%128 = OpVariable %129 Function %130 -OpBranch %134 -%134 = OpLabel -%135 = OpCompositeConstruct %26 %3 %3 %3 %3 -%136 = OpCompositeConstruct %31 %135 %7 -OpStore %128 %136 -%137 = OpCompositeConstruct %29 %3 %5 -%138 = OpCompositeConstruct %29 %5 %3 -%139 = OpCompositeConstruct %32 %137 %138 -%140 = OpCompositeConstruct %26 %3 %5 %5 %5 -%141 = OpCompositeConstruct %26 %5 %3 %5 %5 -%142 = OpCompositeConstruct %26 %5 %5 %3 %5 -%143 = OpCompositeConstruct %26 %5 %5 %5 %3 -%144 = OpCompositeConstruct %33 %140 %141 %142 %143 -%145 = OpCompositeConstruct %34 %19 %19 -%146 = OpCompositeConstruct %29 %5 %5 -%147 = OpCompositeConstruct %29 %5 %5 -%148 = OpCompositeConstruct %32 %146 %147 -%149 = OpCompositeConstruct %36 %11 %7 %18 %21 -%155 = OpCopyObject %37 %53 -%157 = OpCopyObject %37 %53 -%160 = OpAccessChain %159 %128 %19 %19 -%161 = OpLoad %4 %160 -OpReturnValue %161 +%140 = OpFunction %4 None %141 +%139 = OpLabel +%136 = OpVariable %137 Function %138 +OpBranch %142 +%142 = OpLabel +%143 = OpCompositeConstruct %34 %3 %3 %3 %3 +%144 = OpCompositeConstruct %39 %143 %7 +OpStore %136 %144 +%145 = OpCompositeConstruct %37 %3 %5 +%146 = OpCompositeConstruct %37 %5 %3 +%147 = OpCompositeConstruct %40 %145 %146 +%148 = OpCompositeConstruct %34 %3 %5 %5 %5 +%149 = OpCompositeConstruct %34 %5 %3 %5 %5 +%150 = OpCompositeConstruct %34 %5 %5 %3 %5 +%151 = OpCompositeConstruct %34 %5 %5 %5 %3 +%152 = OpCompositeConstruct %41 %148 %149 %150 %151 +%153 = OpCompositeConstruct %42 %19 %19 +%154 = OpCompositeConstruct %37 %5 %5 +%155 = OpCompositeConstruct %37 %5 %5 +%156 = OpCompositeConstruct %40 %154 %155 +%157 = OpCompositeConstruct %44 %11 %7 %18 %21 +%163 = OpCopyObject %45 %61 +%165 = OpCopyObject %45 %61 +%168 = OpAccessChain %167 %136 %19 %19 +%169 = OpLoad %4 %168 +OpReturnValue %169 OpFunctionEnd -%163 = OpFunction %2 None %164 -%162 = OpLabel -OpBranch %165 -%165 = OpLabel -%166 = OpLogicalNot %10 %9 -%168 = OpCompositeConstruct %167 %9 %9 -%169 = OpLogicalNot %167 %168 -%170 = OpLogicalOr %10 %9 %12 -%171 = OpLogicalAnd %10 %9 %12 -%172 = OpLogicalOr %10 %9 %12 -%173 = OpCompositeConstruct %122 %9 %9 %9 -%174 = OpCompositeConstruct %122 %12 %12 %12 -%175 = OpLogicalOr %122 %173 %174 -%176 = OpLogicalAnd %10 %9 %12 -%177 = OpCompositeConstruct %28 %9 %9 %9 %9 -%178 = OpCompositeConstruct %28 %12 %12 %12 %12 -%179 = OpLogicalAnd %28 %177 %178 +%171 = OpFunction %2 None %172 +%170 = OpLabel +OpBranch %173 +%173 = OpLabel +%174 = OpLogicalNot %10 %9 +%176 = OpCompositeConstruct %175 %9 %9 +%177 = OpLogicalNot %175 %176 +%178 = OpLogicalOr %10 %9 %12 +%179 = OpLogicalAnd %10 %9 %12 +%180 = OpLogicalOr %10 %9 %12 +%181 = OpCompositeConstruct %130 %9 %9 %9 +%182 = OpCompositeConstruct %130 %12 %12 %12 +%183 = OpLogicalOr %130 %181 %182 +%184 = OpLogicalAnd %10 %9 %12 +%185 = OpCompositeConstruct %36 %9 %9 %9 %9 +%186 = OpCompositeConstruct %36 %12 %12 %12 %12 +%187 = OpLogicalAnd %36 %185 %186 OpReturn OpFunctionEnd -%181 = OpFunction %2 None %164 -%180 = OpLabel -OpBranch %182 -%182 = OpLabel -%184 = OpCompositeConstruct %183 %7 %7 -%185 = OpSNegate %183 %184 -%186 = OpCompositeConstruct %29 %3 %3 -%187 = OpFNegate %29 %186 -%188 = OpIAdd %8 %18 %7 -%189 = OpIAdd %20 %24 %25 -%190 = OpFAdd %4 %14 %3 -%191 = OpCompositeConstruct %183 %18 %18 -%192 = OpCompositeConstruct %183 %7 %7 -%193 = OpIAdd %183 %191 %192 -%195 = OpCompositeConstruct %194 %24 %24 %24 -%196 = OpCompositeConstruct %194 %25 %25 %25 -%197 = OpIAdd %194 %195 %196 -%198 = OpCompositeConstruct %26 %14 %14 %14 %14 -%199 = OpCompositeConstruct %26 %3 %3 %3 %3 -%200 = OpFAdd %26 %198 %199 -%201 = OpISub %8 %18 %7 -%202 = OpISub %20 %24 %25 -%203 = OpFSub %4 %14 %3 -%204 = OpCompositeConstruct %183 %18 %18 -%205 = OpCompositeConstruct %183 %7 %7 -%206 = OpISub %183 %204 %205 -%207 = OpCompositeConstruct %194 %24 %24 %24 -%208 = OpCompositeConstruct %194 %25 %25 %25 -%209 = OpISub %194 %207 %208 -%210 = OpCompositeConstruct %26 %14 %14 %14 %14 -%211 = OpCompositeConstruct %26 %3 %3 %3 %3 -%212 = OpFSub %26 %210 %211 -%213 = OpIMul %8 %18 %7 -%214 = OpIMul %20 %24 %25 -%215 = OpFMul %4 %14 %3 -%216 = OpCompositeConstruct %183 %18 %18 -%217 = OpCompositeConstruct %183 %7 %7 -%218 = OpIMul %183 %216 %217 -%219 = OpCompositeConstruct %194 %24 %24 %24 -%220 = OpCompositeConstruct %194 %25 %25 %25 -%221 = OpIMul %194 %219 %220 -%222 = OpCompositeConstruct %26 %14 %14 %14 %14 -%223 = OpCompositeConstruct %26 %3 %3 %3 %3 -%224 = OpFMul %26 %222 %223 -%225 = OpSDiv %8 %18 %7 -%226 = OpUDiv %20 %24 %25 -%227 = OpFDiv %4 %14 %3 -%228 = OpCompositeConstruct %183 %18 %18 -%229 = OpCompositeConstruct %183 %7 %7 -%230 = OpSDiv %183 %228 %229 -%231 = OpCompositeConstruct %194 %24 %24 %24 -%232 = OpCompositeConstruct %194 %25 %25 %25 -%233 = OpUDiv %194 %231 %232 -%234 = OpCompositeConstruct %26 %14 %14 %14 %14 -%235 = OpCompositeConstruct %26 %3 %3 %3 %3 -%236 = OpFDiv %26 %234 %235 -%237 = OpSRem %8 %18 %7 -%238 = OpUMod %20 %24 %25 -%239 = OpFRem %4 %14 %3 -%240 = OpCompositeConstruct %183 %18 %18 -%241 = OpCompositeConstruct %183 %7 %7 -%242 = OpSRem %183 %240 %241 -%243 = OpCompositeConstruct %194 %24 %24 %24 -%244 = OpCompositeConstruct %194 %25 %25 %25 -%245 = OpUMod %194 %243 %244 -%246 = OpCompositeConstruct %26 %14 %14 %14 %14 -%247 = OpCompositeConstruct %26 %3 %3 %3 %3 -%248 = OpFRem %26 %246 %247 -%249 = OpCompositeConstruct %183 %18 %18 -%250 = OpCompositeConstruct %183 %7 %7 -%251 = OpIAdd %183 %249 %250 -%252 = OpCompositeConstruct %183 %7 %7 -%253 = OpCompositeConstruct %183 %18 %18 -%254 = OpIAdd %183 %253 %252 -%255 = OpCompositeConstruct %34 %24 %24 -%256 = OpCompositeConstruct %34 %25 %25 -%257 = OpIAdd %34 %255 %256 -%258 = OpCompositeConstruct %34 %25 %25 -%259 = OpCompositeConstruct %34 %24 %24 -%260 = OpIAdd %34 %259 %258 -%261 = OpCompositeConstruct %29 %14 %14 -%262 = OpCompositeConstruct %29 %3 %3 -%263 = OpFAdd %29 %261 %262 -%264 = OpCompositeConstruct %29 %3 %3 -%265 = OpCompositeConstruct %29 %14 %14 -%266 = OpFAdd %29 %265 %264 -%267 = OpCompositeConstruct %183 %18 %18 -%268 = OpCompositeConstruct %183 %7 %7 -%269 = OpISub %183 %267 %268 -%270 = OpCompositeConstruct %183 %7 %7 -%271 = OpCompositeConstruct %183 %18 %18 -%272 = OpISub %183 %271 %270 -%273 = OpCompositeConstruct %34 %24 %24 -%274 = OpCompositeConstruct %34 %25 %25 -%275 = OpISub %34 %273 %274 -%276 = OpCompositeConstruct %34 %25 %25 -%277 = OpCompositeConstruct %34 %24 %24 -%278 = OpISub %34 %277 %276 -%279 = OpCompositeConstruct %29 %14 %14 -%280 = OpCompositeConstruct %29 %3 %3 -%281 = OpFSub %29 %279 %280 -%282 = OpCompositeConstruct %29 %3 %3 -%283 = OpCompositeConstruct %29 %14 %14 -%284 = OpFSub %29 %283 %282 -%285 = OpCompositeConstruct %183 %18 %18 -%287 = OpCompositeConstruct %183 %7 %7 -%286 = OpIMul %183 %285 %287 -%288 = OpCompositeConstruct %183 %7 %7 -%290 = OpCompositeConstruct %183 %18 %18 -%289 = OpIMul %183 %288 %290 -%291 = OpCompositeConstruct %34 %24 %24 -%293 = OpCompositeConstruct %34 %25 %25 -%292 = OpIMul %34 %291 %293 -%294 = OpCompositeConstruct %34 %25 %25 -%296 = OpCompositeConstruct %34 %24 %24 -%295 = OpIMul %34 %294 %296 -%297 = OpCompositeConstruct %29 %14 %14 -%298 = OpVectorTimesScalar %29 %297 %3 -%299 = OpCompositeConstruct %29 %3 %3 -%300 = OpVectorTimesScalar %29 %299 %14 -%301 = OpCompositeConstruct %183 %18 %18 -%302 = OpCompositeConstruct %183 %7 %7 -%303 = OpSDiv %183 %301 %302 -%304 = OpCompositeConstruct %183 %7 %7 -%305 = OpCompositeConstruct %183 %18 %18 -%306 = OpSDiv %183 %305 %304 -%307 = OpCompositeConstruct %34 %24 %24 -%308 = OpCompositeConstruct %34 %25 %25 -%309 = OpUDiv %34 %307 %308 -%310 = OpCompositeConstruct %34 %25 %25 -%311 = OpCompositeConstruct %34 %24 %24 -%312 = OpUDiv %34 %311 %310 -%313 = OpCompositeConstruct %29 %14 %14 -%314 = OpCompositeConstruct %29 %3 %3 -%315 = OpFDiv %29 %313 %314 -%316 = OpCompositeConstruct %29 %3 %3 -%317 = OpCompositeConstruct %29 %14 %14 -%318 = OpFDiv %29 %317 %316 -%319 = OpCompositeConstruct %183 %18 %18 -%320 = OpCompositeConstruct %183 %7 %7 -%321 = OpSRem %183 %319 %320 -%322 = OpCompositeConstruct %183 %7 %7 -%323 = OpCompositeConstruct %183 %18 %18 -%324 = OpSRem %183 %323 %322 -%325 = OpCompositeConstruct %34 %24 %24 -%326 = OpCompositeConstruct %34 %25 %25 -%327 = OpUMod %34 %325 %326 -%328 = OpCompositeConstruct %34 %25 %25 -%329 = OpCompositeConstruct %34 %24 %24 -%330 = OpUMod %34 %329 %328 -%331 = OpCompositeConstruct %29 %14 %14 -%332 = OpCompositeConstruct %29 %3 %3 -%333 = OpFRem %29 %331 %332 -%334 = OpCompositeConstruct %29 %3 %3 -%335 = OpCompositeConstruct %29 %14 %14 -%336 = OpFRem %29 %335 %334 -%338 = OpCompositeExtract %30 %54 0 -%339 = OpCompositeExtract %30 %54 0 -%340 = OpFAdd %30 %338 %339 -%341 = OpCompositeExtract %30 %54 1 -%342 = OpCompositeExtract %30 %54 1 -%343 = OpFAdd %30 %341 %342 -%344 = OpCompositeExtract %30 %54 2 -%345 = OpCompositeExtract %30 %54 2 -%346 = OpFAdd %30 %344 %345 -%337 = OpCompositeConstruct %38 %340 %343 %346 -%348 = OpCompositeExtract %30 %54 0 -%349 = OpCompositeExtract %30 %54 0 -%350 = OpFSub %30 %348 %349 -%351 = OpCompositeExtract %30 %54 1 -%352 = OpCompositeExtract %30 %54 1 -%353 = OpFSub %30 %351 %352 -%354 = OpCompositeExtract %30 %54 2 -%355 = OpCompositeExtract %30 %54 2 -%356 = OpFSub %30 %354 %355 -%347 = OpCompositeConstruct %38 %350 %353 %356 -%357 = OpMatrixTimesScalar %38 %54 %3 -%358 = OpMatrixTimesScalar %38 %54 %14 -%359 = OpCompositeConstruct %26 %3 %3 %3 %3 -%360 = OpMatrixTimesVector %30 %55 %359 -%361 = OpCompositeConstruct %30 %14 %14 %14 -%362 = OpVectorTimesMatrix %26 %361 %55 -%363 = OpMatrixTimesMatrix %38 %55 %56 +%189 = OpFunction %2 None %172 +%188 = OpLabel +OpBranch %190 +%190 = OpLabel +%192 = OpCompositeConstruct %191 %7 %7 +%193 = OpSNegate %191 %192 +%194 = OpCompositeConstruct %37 %3 %3 +%195 = OpFNegate %37 %194 +%196 = OpIAdd %8 %18 %7 +%197 = OpIAdd %20 %24 %25 +%198 = OpFAdd %4 %14 %3 +%199 = OpCompositeConstruct %191 %18 %18 +%200 = OpCompositeConstruct %191 %7 %7 +%201 = OpIAdd %191 %199 %200 +%203 = OpCompositeConstruct %202 %24 %24 %24 +%204 = OpCompositeConstruct %202 %25 %25 %25 +%205 = OpIAdd %202 %203 %204 +%206 = OpCompositeConstruct %34 %14 %14 %14 %14 +%207 = OpCompositeConstruct %34 %3 %3 %3 %3 +%208 = OpFAdd %34 %206 %207 +%209 = OpISub %8 %18 %7 +%210 = OpISub %20 %24 %25 +%211 = OpFSub %4 %14 %3 +%212 = OpCompositeConstruct %191 %18 %18 +%213 = OpCompositeConstruct %191 %7 %7 +%214 = OpISub %191 %212 %213 +%215 = OpCompositeConstruct %202 %24 %24 %24 +%216 = OpCompositeConstruct %202 %25 %25 %25 +%217 = OpISub %202 %215 %216 +%218 = OpCompositeConstruct %34 %14 %14 %14 %14 +%219 = OpCompositeConstruct %34 %3 %3 %3 %3 +%220 = OpFSub %34 %218 %219 +%221 = OpIMul %8 %18 %7 +%222 = OpIMul %20 %24 %25 +%223 = OpFMul %4 %14 %3 +%224 = OpCompositeConstruct %191 %18 %18 +%225 = OpCompositeConstruct %191 %7 %7 +%226 = OpIMul %191 %224 %225 +%227 = OpCompositeConstruct %202 %24 %24 %24 +%228 = OpCompositeConstruct %202 %25 %25 %25 +%229 = OpIMul %202 %227 %228 +%230 = OpCompositeConstruct %34 %14 %14 %14 %14 +%231 = OpCompositeConstruct %34 %3 %3 %3 %3 +%232 = OpFMul %34 %230 %231 +%233 = OpSDiv %8 %18 %7 +%234 = OpUDiv %20 %24 %25 +%235 = OpFDiv %4 %14 %3 +%236 = OpCompositeConstruct %191 %18 %18 +%237 = OpCompositeConstruct %191 %7 %7 +%238 = OpSDiv %191 %236 %237 +%239 = OpCompositeConstruct %202 %24 %24 %24 +%240 = OpCompositeConstruct %202 %25 %25 %25 +%241 = OpUDiv %202 %239 %240 +%242 = OpCompositeConstruct %34 %14 %14 %14 %14 +%243 = OpCompositeConstruct %34 %3 %3 %3 %3 +%244 = OpFDiv %34 %242 %243 +%245 = OpSRem %8 %18 %7 +%246 = OpUMod %20 %24 %25 +%247 = OpFRem %4 %14 %3 +%248 = OpCompositeConstruct %191 %18 %18 +%249 = OpCompositeConstruct %191 %7 %7 +%250 = OpSRem %191 %248 %249 +%251 = OpCompositeConstruct %202 %24 %24 %24 +%252 = OpCompositeConstruct %202 %25 %25 %25 +%253 = OpUMod %202 %251 %252 +%254 = OpCompositeConstruct %34 %14 %14 %14 %14 +%255 = OpCompositeConstruct %34 %3 %3 %3 %3 +%256 = OpFRem %34 %254 %255 +%257 = OpCompositeConstruct %191 %18 %18 +%258 = OpCompositeConstruct %191 %7 %7 +%259 = OpIAdd %191 %257 %258 +%260 = OpCompositeConstruct %191 %7 %7 +%261 = OpCompositeConstruct %191 %18 %18 +%262 = OpIAdd %191 %261 %260 +%263 = OpCompositeConstruct %42 %24 %24 +%264 = OpCompositeConstruct %42 %25 %25 +%265 = OpIAdd %42 %263 %264 +%266 = OpCompositeConstruct %42 %25 %25 +%267 = OpCompositeConstruct %42 %24 %24 +%268 = OpIAdd %42 %267 %266 +%269 = OpCompositeConstruct %37 %14 %14 +%270 = OpCompositeConstruct %37 %3 %3 +%271 = OpFAdd %37 %269 %270 +%272 = OpCompositeConstruct %37 %3 %3 +%273 = OpCompositeConstruct %37 %14 %14 +%274 = OpFAdd %37 %273 %272 +%275 = OpCompositeConstruct %191 %18 %18 +%276 = OpCompositeConstruct %191 %7 %7 +%277 = OpISub %191 %275 %276 +%278 = OpCompositeConstruct %191 %7 %7 +%279 = OpCompositeConstruct %191 %18 %18 +%280 = OpISub %191 %279 %278 +%281 = OpCompositeConstruct %42 %24 %24 +%282 = OpCompositeConstruct %42 %25 %25 +%283 = OpISub %42 %281 %282 +%284 = OpCompositeConstruct %42 %25 %25 +%285 = OpCompositeConstruct %42 %24 %24 +%286 = OpISub %42 %285 %284 +%287 = OpCompositeConstruct %37 %14 %14 +%288 = OpCompositeConstruct %37 %3 %3 +%289 = OpFSub %37 %287 %288 +%290 = OpCompositeConstruct %37 %3 %3 +%291 = OpCompositeConstruct %37 %14 %14 +%292 = OpFSub %37 %291 %290 +%293 = OpCompositeConstruct %191 %18 %18 +%295 = OpCompositeConstruct %191 %7 %7 +%294 = OpIMul %191 %293 %295 +%296 = OpCompositeConstruct %191 %7 %7 +%298 = OpCompositeConstruct %191 %18 %18 +%297 = OpIMul %191 %296 %298 +%299 = OpCompositeConstruct %42 %24 %24 +%301 = OpCompositeConstruct %42 %25 %25 +%300 = OpIMul %42 %299 %301 +%302 = OpCompositeConstruct %42 %25 %25 +%304 = OpCompositeConstruct %42 %24 %24 +%303 = OpIMul %42 %302 %304 +%305 = OpCompositeConstruct %37 %14 %14 +%306 = OpVectorTimesScalar %37 %305 %3 +%307 = OpCompositeConstruct %37 %3 %3 +%308 = OpVectorTimesScalar %37 %307 %14 +%309 = OpCompositeConstruct %191 %18 %18 +%310 = OpCompositeConstruct %191 %7 %7 +%311 = OpSDiv %191 %309 %310 +%312 = OpCompositeConstruct %191 %7 %7 +%313 = OpCompositeConstruct %191 %18 %18 +%314 = OpSDiv %191 %313 %312 +%315 = OpCompositeConstruct %42 %24 %24 +%316 = OpCompositeConstruct %42 %25 %25 +%317 = OpUDiv %42 %315 %316 +%318 = OpCompositeConstruct %42 %25 %25 +%319 = OpCompositeConstruct %42 %24 %24 +%320 = OpUDiv %42 %319 %318 +%321 = OpCompositeConstruct %37 %14 %14 +%322 = OpCompositeConstruct %37 %3 %3 +%323 = OpFDiv %37 %321 %322 +%324 = OpCompositeConstruct %37 %3 %3 +%325 = OpCompositeConstruct %37 %14 %14 +%326 = OpFDiv %37 %325 %324 +%327 = OpCompositeConstruct %191 %18 %18 +%328 = OpCompositeConstruct %191 %7 %7 +%329 = OpSRem %191 %327 %328 +%330 = OpCompositeConstruct %191 %7 %7 +%331 = OpCompositeConstruct %191 %18 %18 +%332 = OpSRem %191 %331 %330 +%333 = OpCompositeConstruct %42 %24 %24 +%334 = OpCompositeConstruct %42 %25 %25 +%335 = OpUMod %42 %333 %334 +%336 = OpCompositeConstruct %42 %25 %25 +%337 = OpCompositeConstruct %42 %24 %24 +%338 = OpUMod %42 %337 %336 +%339 = OpCompositeConstruct %37 %14 %14 +%340 = OpCompositeConstruct %37 %3 %3 +%341 = OpFRem %37 %339 %340 +%342 = OpCompositeConstruct %37 %3 %3 +%343 = OpCompositeConstruct %37 %14 %14 +%344 = OpFRem %37 %343 %342 +%346 = OpCompositeExtract %38 %62 0 +%347 = OpCompositeExtract %38 %62 0 +%348 = OpFAdd %38 %346 %347 +%349 = OpCompositeExtract %38 %62 1 +%350 = OpCompositeExtract %38 %62 1 +%351 = OpFAdd %38 %349 %350 +%352 = OpCompositeExtract %38 %62 2 +%353 = OpCompositeExtract %38 %62 2 +%354 = OpFAdd %38 %352 %353 +%345 = OpCompositeConstruct %46 %348 %351 %354 +%356 = OpCompositeExtract %38 %62 0 +%357 = OpCompositeExtract %38 %62 0 +%358 = OpFSub %38 %356 %357 +%359 = OpCompositeExtract %38 %62 1 +%360 = OpCompositeExtract %38 %62 1 +%361 = OpFSub %38 %359 %360 +%362 = OpCompositeExtract %38 %62 2 +%363 = OpCompositeExtract %38 %62 2 +%364 = OpFSub %38 %362 %363 +%355 = OpCompositeConstruct %46 %358 %361 %364 +%365 = OpMatrixTimesScalar %46 %62 %3 +%366 = OpMatrixTimesScalar %46 %62 %14 +%367 = OpCompositeConstruct %34 %3 %3 %3 %3 +%368 = OpMatrixTimesVector %38 %63 %367 +%369 = OpCompositeConstruct %38 %14 %14 %14 +%370 = OpVectorTimesMatrix %34 %369 %63 +%371 = OpMatrixTimesMatrix %46 %63 %64 OpReturn OpFunctionEnd -%365 = OpFunction %2 None %164 -%364 = OpLabel -OpBranch %366 -%366 = OpLabel -%367 = OpNot %8 %7 -%368 = OpNot %20 %25 -%369 = OpCompositeConstruct %183 %7 %7 -%370 = OpNot %183 %369 -%371 = OpCompositeConstruct %194 %25 %25 %25 -%372 = OpNot %194 %371 -%373 = OpBitwiseOr %8 %18 %7 -%374 = OpBitwiseOr %20 %24 %25 -%375 = OpCompositeConstruct %183 %18 %18 -%376 = OpCompositeConstruct %183 %7 %7 -%377 = OpBitwiseOr %183 %375 %376 -%378 = OpCompositeConstruct %194 %24 %24 %24 -%379 = OpCompositeConstruct %194 %25 %25 %25 -%380 = OpBitwiseOr %194 %378 %379 -%381 = OpBitwiseAnd %8 %18 %7 -%382 = OpBitwiseAnd %20 %24 %25 -%383 = OpCompositeConstruct %183 %18 %18 -%384 = OpCompositeConstruct %183 %7 %7 -%385 = OpBitwiseAnd %183 %383 %384 -%386 = OpCompositeConstruct %194 %24 %24 %24 -%387 = OpCompositeConstruct %194 %25 %25 %25 -%388 = OpBitwiseAnd %194 %386 %387 -%389 = OpBitwiseXor %8 %18 %7 -%390 = OpBitwiseXor %20 %24 %25 -%391 = OpCompositeConstruct %183 %18 %18 -%392 = OpCompositeConstruct %183 %7 %7 -%393 = OpBitwiseXor %183 %391 %392 -%394 = OpCompositeConstruct %194 %24 %24 %24 -%395 = OpCompositeConstruct %194 %25 %25 %25 -%396 = OpBitwiseXor %194 %394 %395 -%397 = OpShiftLeftLogical %8 %18 %25 -%398 = OpShiftLeftLogical %20 %24 %25 -%399 = OpCompositeConstruct %183 %18 %18 -%400 = OpCompositeConstruct %34 %25 %25 -%401 = OpShiftLeftLogical %183 %399 %400 -%402 = OpCompositeConstruct %194 %24 %24 %24 -%403 = OpCompositeConstruct %194 %25 %25 %25 -%404 = OpShiftLeftLogical %194 %402 %403 -%405 = OpShiftRightArithmetic %8 %18 %25 -%406 = OpShiftRightLogical %20 %24 %25 -%407 = OpCompositeConstruct %183 %18 %18 -%408 = OpCompositeConstruct %34 %25 %25 -%409 = OpShiftRightArithmetic %183 %407 %408 -%410 = OpCompositeConstruct %194 %24 %24 %24 -%411 = OpCompositeConstruct %194 %25 %25 %25 -%412 = OpShiftRightLogical %194 %410 %411 +%373 = OpFunction %2 None %172 +%372 = OpLabel +OpBranch %374 +%374 = OpLabel +%375 = OpNot %8 %7 +%376 = OpNot %20 %25 +%377 = OpCompositeConstruct %191 %7 %7 +%378 = OpNot %191 %377 +%379 = OpCompositeConstruct %202 %25 %25 %25 +%380 = OpNot %202 %379 +%381 = OpBitwiseOr %8 %18 %7 +%382 = OpBitwiseOr %20 %24 %25 +%383 = OpCompositeConstruct %191 %18 %18 +%384 = OpCompositeConstruct %191 %7 %7 +%385 = OpBitwiseOr %191 %383 %384 +%386 = OpCompositeConstruct %202 %24 %24 %24 +%387 = OpCompositeConstruct %202 %25 %25 %25 +%388 = OpBitwiseOr %202 %386 %387 +%389 = OpBitwiseAnd %8 %18 %7 +%390 = OpBitwiseAnd %20 %24 %25 +%391 = OpCompositeConstruct %191 %18 %18 +%392 = OpCompositeConstruct %191 %7 %7 +%393 = OpBitwiseAnd %191 %391 %392 +%394 = OpCompositeConstruct %202 %24 %24 %24 +%395 = OpCompositeConstruct %202 %25 %25 %25 +%396 = OpBitwiseAnd %202 %394 %395 +%397 = OpBitwiseXor %8 %18 %7 +%398 = OpBitwiseXor %20 %24 %25 +%399 = OpCompositeConstruct %191 %18 %18 +%400 = OpCompositeConstruct %191 %7 %7 +%401 = OpBitwiseXor %191 %399 %400 +%402 = OpCompositeConstruct %202 %24 %24 %24 +%403 = OpCompositeConstruct %202 %25 %25 %25 +%404 = OpBitwiseXor %202 %402 %403 +%405 = OpShiftLeftLogical %8 %18 %25 +%406 = OpShiftLeftLogical %20 %24 %25 +%407 = OpCompositeConstruct %191 %18 %18 +%408 = OpCompositeConstruct %42 %25 %25 +%409 = OpShiftLeftLogical %191 %407 %408 +%410 = OpCompositeConstruct %202 %24 %24 %24 +%411 = OpCompositeConstruct %202 %25 %25 %25 +%412 = OpShiftLeftLogical %202 %410 %411 +%413 = OpShiftRightArithmetic %8 %18 %25 +%414 = OpShiftRightLogical %20 %24 %25 +%415 = OpCompositeConstruct %191 %18 %18 +%416 = OpCompositeConstruct %42 %25 %25 +%417 = OpShiftRightArithmetic %191 %415 %416 +%418 = OpCompositeConstruct %202 %24 %24 %24 +%419 = OpCompositeConstruct %202 %25 %25 %25 +%420 = OpShiftRightLogical %202 %418 %419 OpReturn OpFunctionEnd -%414 = OpFunction %2 None %164 -%413 = OpLabel -OpBranch %415 -%415 = OpLabel -%416 = OpIEqual %10 %18 %7 -%417 = OpIEqual %10 %24 %25 -%418 = OpFOrdEqual %10 %14 %3 -%419 = OpCompositeConstruct %183 %18 %18 -%420 = OpCompositeConstruct %183 %7 %7 -%421 = OpIEqual %167 %419 %420 -%422 = OpCompositeConstruct %194 %24 %24 %24 -%423 = OpCompositeConstruct %194 %25 %25 %25 -%424 = OpIEqual %122 %422 %423 -%425 = OpCompositeConstruct %26 %14 %14 %14 %14 -%426 = OpCompositeConstruct %26 %3 %3 %3 %3 -%427 = OpFOrdEqual %28 %425 %426 -%428 = OpINotEqual %10 %18 %7 -%429 = OpINotEqual %10 %24 %25 -%430 = OpFOrdNotEqual %10 %14 %3 -%431 = OpCompositeConstruct %183 %18 %18 -%432 = OpCompositeConstruct %183 %7 %7 -%433 = OpINotEqual %167 %431 %432 -%434 = OpCompositeConstruct %194 %24 %24 %24 -%435 = OpCompositeConstruct %194 %25 %25 %25 -%436 = OpINotEqual %122 %434 %435 -%437 = OpCompositeConstruct %26 %14 %14 %14 %14 -%438 = OpCompositeConstruct %26 %3 %3 %3 %3 -%439 = OpFOrdNotEqual %28 %437 %438 -%440 = OpSLessThan %10 %18 %7 -%441 = OpULessThan %10 %24 %25 -%442 = OpFOrdLessThan %10 %14 %3 -%443 = OpCompositeConstruct %183 %18 %18 -%444 = OpCompositeConstruct %183 %7 %7 -%445 = OpSLessThan %167 %443 %444 -%446 = OpCompositeConstruct %194 %24 %24 %24 -%447 = OpCompositeConstruct %194 %25 %25 %25 -%448 = OpULessThan %122 %446 %447 -%449 = OpCompositeConstruct %26 %14 %14 %14 %14 -%450 = OpCompositeConstruct %26 %3 %3 %3 %3 -%451 = OpFOrdLessThan %28 %449 %450 -%452 = OpSLessThanEqual %10 %18 %7 -%453 = OpULessThanEqual %10 %24 %25 -%454 = OpFOrdLessThanEqual %10 %14 %3 -%455 = OpCompositeConstruct %183 %18 %18 -%456 = OpCompositeConstruct %183 %7 %7 -%457 = OpSLessThanEqual %167 %455 %456 -%458 = OpCompositeConstruct %194 %24 %24 %24 -%459 = OpCompositeConstruct %194 %25 %25 %25 -%460 = OpULessThanEqual %122 %458 %459 -%461 = OpCompositeConstruct %26 %14 %14 %14 %14 -%462 = OpCompositeConstruct %26 %3 %3 %3 %3 -%463 = OpFOrdLessThanEqual %28 %461 %462 -%464 = OpSGreaterThan %10 %18 %7 -%465 = OpUGreaterThan %10 %24 %25 -%466 = OpFOrdGreaterThan %10 %14 %3 -%467 = OpCompositeConstruct %183 %18 %18 -%468 = OpCompositeConstruct %183 %7 %7 -%469 = OpSGreaterThan %167 %467 %468 -%470 = OpCompositeConstruct %194 %24 %24 %24 -%471 = OpCompositeConstruct %194 %25 %25 %25 -%472 = OpUGreaterThan %122 %470 %471 -%473 = OpCompositeConstruct %26 %14 %14 %14 %14 -%474 = OpCompositeConstruct %26 %3 %3 %3 %3 -%475 = OpFOrdGreaterThan %28 %473 %474 -%476 = OpSGreaterThanEqual %10 %18 %7 -%477 = OpUGreaterThanEqual %10 %24 %25 -%478 = OpFOrdGreaterThanEqual %10 %14 %3 -%479 = OpCompositeConstruct %183 %18 %18 -%480 = OpCompositeConstruct %183 %7 %7 -%481 = OpSGreaterThanEqual %167 %479 %480 -%482 = OpCompositeConstruct %194 %24 %24 %24 -%483 = OpCompositeConstruct %194 %25 %25 %25 -%484 = OpUGreaterThanEqual %122 %482 %483 -%485 = OpCompositeConstruct %26 %14 %14 %14 %14 -%486 = OpCompositeConstruct %26 %3 %3 %3 %3 -%487 = OpFOrdGreaterThanEqual %28 %485 %486 +%422 = OpFunction %2 None %172 +%421 = OpLabel +OpBranch %423 +%423 = OpLabel +%424 = OpIEqual %10 %18 %7 +%425 = OpIEqual %10 %24 %25 +%426 = OpFOrdEqual %10 %14 %3 +%427 = OpCompositeConstruct %191 %18 %18 +%428 = OpCompositeConstruct %191 %7 %7 +%429 = OpIEqual %175 %427 %428 +%430 = OpCompositeConstruct %202 %24 %24 %24 +%431 = OpCompositeConstruct %202 %25 %25 %25 +%432 = OpIEqual %130 %430 %431 +%433 = OpCompositeConstruct %34 %14 %14 %14 %14 +%434 = OpCompositeConstruct %34 %3 %3 %3 %3 +%435 = OpFOrdEqual %36 %433 %434 +%436 = OpINotEqual %10 %18 %7 +%437 = OpINotEqual %10 %24 %25 +%438 = OpFOrdNotEqual %10 %14 %3 +%439 = OpCompositeConstruct %191 %18 %18 +%440 = OpCompositeConstruct %191 %7 %7 +%441 = OpINotEqual %175 %439 %440 +%442 = OpCompositeConstruct %202 %24 %24 %24 +%443 = OpCompositeConstruct %202 %25 %25 %25 +%444 = OpINotEqual %130 %442 %443 +%445 = OpCompositeConstruct %34 %14 %14 %14 %14 +%446 = OpCompositeConstruct %34 %3 %3 %3 %3 +%447 = OpFOrdNotEqual %36 %445 %446 +%448 = OpSLessThan %10 %18 %7 +%449 = OpULessThan %10 %24 %25 +%450 = OpFOrdLessThan %10 %14 %3 +%451 = OpCompositeConstruct %191 %18 %18 +%452 = OpCompositeConstruct %191 %7 %7 +%453 = OpSLessThan %175 %451 %452 +%454 = OpCompositeConstruct %202 %24 %24 %24 +%455 = OpCompositeConstruct %202 %25 %25 %25 +%456 = OpULessThan %130 %454 %455 +%457 = OpCompositeConstruct %34 %14 %14 %14 %14 +%458 = OpCompositeConstruct %34 %3 %3 %3 %3 +%459 = OpFOrdLessThan %36 %457 %458 +%460 = OpSLessThanEqual %10 %18 %7 +%461 = OpULessThanEqual %10 %24 %25 +%462 = OpFOrdLessThanEqual %10 %14 %3 +%463 = OpCompositeConstruct %191 %18 %18 +%464 = OpCompositeConstruct %191 %7 %7 +%465 = OpSLessThanEqual %175 %463 %464 +%466 = OpCompositeConstruct %202 %24 %24 %24 +%467 = OpCompositeConstruct %202 %25 %25 %25 +%468 = OpULessThanEqual %130 %466 %467 +%469 = OpCompositeConstruct %34 %14 %14 %14 %14 +%470 = OpCompositeConstruct %34 %3 %3 %3 %3 +%471 = OpFOrdLessThanEqual %36 %469 %470 +%472 = OpSGreaterThan %10 %18 %7 +%473 = OpUGreaterThan %10 %24 %25 +%474 = OpFOrdGreaterThan %10 %14 %3 +%475 = OpCompositeConstruct %191 %18 %18 +%476 = OpCompositeConstruct %191 %7 %7 +%477 = OpSGreaterThan %175 %475 %476 +%478 = OpCompositeConstruct %202 %24 %24 %24 +%479 = OpCompositeConstruct %202 %25 %25 %25 +%480 = OpUGreaterThan %130 %478 %479 +%481 = OpCompositeConstruct %34 %14 %14 %14 %14 +%482 = OpCompositeConstruct %34 %3 %3 %3 %3 +%483 = OpFOrdGreaterThan %36 %481 %482 +%484 = OpSGreaterThanEqual %10 %18 %7 +%485 = OpUGreaterThanEqual %10 %24 %25 +%486 = OpFOrdGreaterThanEqual %10 %14 %3 +%487 = OpCompositeConstruct %191 %18 %18 +%488 = OpCompositeConstruct %191 %7 %7 +%489 = OpSGreaterThanEqual %175 %487 %488 +%490 = OpCompositeConstruct %202 %24 %24 %24 +%491 = OpCompositeConstruct %202 %25 %25 %25 +%492 = OpUGreaterThanEqual %130 %490 %491 +%493 = OpCompositeConstruct %34 %14 %14 %14 %14 +%494 = OpCompositeConstruct %34 %3 %3 %3 %3 +%495 = OpFOrdGreaterThanEqual %36 %493 %494 OpReturn OpFunctionEnd -%493 = OpFunction %2 None %164 -%492 = OpLabel -%488 = OpVariable %489 Function %7 -%490 = OpVariable %491 Function %57 -OpBranch %494 -%494 = OpLabel -%495 = OpLoad %8 %488 -%496 = OpIAdd %8 %495 %7 -OpStore %488 %496 -%497 = OpLoad %8 %488 -%498 = OpISub %8 %497 %7 -OpStore %488 %498 -%499 = OpLoad %8 %488 -%500 = OpLoad %8 %488 -%501 = OpIMul %8 %499 %500 -OpStore %488 %501 -%502 = OpLoad %8 %488 -%503 = OpLoad %8 %488 -%504 = OpSDiv %8 %502 %503 -OpStore %488 %504 -%505 = OpLoad %8 %488 -%506 = OpSRem %8 %505 %7 -OpStore %488 %506 -%507 = OpLoad %8 %488 -%508 = OpBitwiseAnd %8 %507 %11 -OpStore %488 %508 -%509 = OpLoad %8 %488 -%510 = OpBitwiseOr %8 %509 %11 -OpStore %488 %510 -%511 = OpLoad %8 %488 -%512 = OpBitwiseXor %8 %511 %11 -OpStore %488 %512 -%513 = OpLoad %8 %488 -%514 = OpShiftLeftLogical %8 %513 %24 -OpStore %488 %514 -%515 = OpLoad %8 %488 -%516 = OpShiftRightArithmetic %8 %515 %25 -OpStore %488 %516 -%517 = OpLoad %8 %488 -%518 = OpIAdd %8 %517 %7 -OpStore %488 %518 -%519 = OpLoad %8 %488 -%520 = OpISub %8 %519 %7 -OpStore %488 %520 -%522 = OpAccessChain %521 %490 %25 -%523 = OpLoad %8 %522 -%524 = OpIAdd %8 %523 %7 -%525 = OpAccessChain %521 %490 %25 -OpStore %525 %524 -%526 = OpAccessChain %521 %490 %25 -%527 = OpLoad %8 %526 +%501 = OpFunction %2 None %172 +%500 = OpLabel +%496 = OpVariable %497 Function %7 +%498 = OpVariable %499 Function %65 +OpBranch %502 +%502 = OpLabel +%503 = OpLoad %8 %496 +%504 = OpIAdd %8 %503 %7 +OpStore %496 %504 +%505 = OpLoad %8 %496 +%506 = OpISub %8 %505 %7 +OpStore %496 %506 +%507 = OpLoad %8 %496 +%508 = OpLoad %8 %496 +%509 = OpIMul %8 %507 %508 +OpStore %496 %509 +%510 = OpLoad %8 %496 +%511 = OpLoad %8 %496 +%512 = OpSDiv %8 %510 %511 +OpStore %496 %512 +%513 = OpLoad %8 %496 +%514 = OpSRem %8 %513 %7 +OpStore %496 %514 +%515 = OpLoad %8 %496 +%516 = OpBitwiseAnd %8 %515 %11 +OpStore %496 %516 +%517 = OpLoad %8 %496 +%518 = OpBitwiseOr %8 %517 %11 +OpStore %496 %518 +%519 = OpLoad %8 %496 +%520 = OpBitwiseXor %8 %519 %11 +OpStore %496 %520 +%521 = OpLoad %8 %496 +%522 = OpShiftLeftLogical %8 %521 %24 +OpStore %496 %522 +%523 = OpLoad %8 %496 +%524 = OpShiftRightArithmetic %8 %523 %25 +OpStore %496 %524 +%525 = OpLoad %8 %496 +%526 = OpIAdd %8 %525 %7 +OpStore %496 %526 +%527 = OpLoad %8 %496 %528 = OpISub %8 %527 %7 -%529 = OpAccessChain %521 %490 %25 -OpStore %529 %528 +OpStore %496 %528 +%530 = OpAccessChain %529 %498 %25 +%531 = OpLoad %8 %530 +%532 = OpIAdd %8 %531 %7 +%533 = OpAccessChain %529 %498 %25 +OpStore %533 %532 +%534 = OpAccessChain %529 %498 %25 +%535 = OpLoad %8 %534 +%536 = OpISub %8 %535 %7 +%537 = OpAccessChain %529 %498 %25 +OpStore %537 %536 OpReturn OpFunctionEnd -%531 = OpFunction %2 None %164 -%530 = OpLabel -OpBranch %532 -%532 = OpLabel -%533 = OpFunctionCall %26 %59 -%534 = OpFunctionCall %26 %84 -%535 = OpVectorShuffle %30 %42 %42 0 1 2 -%536 = OpFunctionCall %30 %119 %535 -%537 = OpFunctionCall %4 %132 -%538 = OpFunctionCall %2 %163 -%539 = OpFunctionCall %2 %181 -%540 = OpFunctionCall %2 %365 -%541 = OpFunctionCall %2 %414 -%542 = OpFunctionCall %2 %493 +%539 = OpFunction %2 None %172 +%538 = OpLabel +OpBranch %540 +%540 = OpLabel +%541 = OpSNegate %8 %27 +%542 = OpSNegate %8 %28 +%543 = OpSNegate %8 %29 +%544 = OpSNegate %8 %543 +%545 = OpSNegate %8 %30 +%546 = OpSNegate %8 %545 +%547 = OpSNegate %8 %31 +%548 = OpSNegate %8 %547 +%549 = OpSNegate %8 %548 +%550 = OpSNegate %8 %549 +%551 = OpSNegate %8 %32 +%552 = OpSNegate %8 %551 +%553 = OpSNegate %8 %552 +%554 = OpSNegate %8 %553 +%555 = OpSNegate %8 %33 +%556 = OpSNegate %8 %555 +%557 = OpSNegate %8 %556 +%558 = OpSNegate %8 %557 +OpReturn +OpFunctionEnd +%560 = OpFunction %2 None %172 +%559 = OpLabel +OpBranch %561 +%561 = OpLabel +%562 = OpFunctionCall %34 %67 +%563 = OpFunctionCall %34 %92 +%564 = OpVectorShuffle %38 %50 %50 0 1 2 +%565 = OpFunctionCall %38 %127 %564 +%566 = OpFunctionCall %4 %140 +%567 = OpFunctionCall %2 %171 +%568 = OpFunctionCall %2 %189 +%569 = OpFunctionCall %2 %373 +%570 = OpFunctionCall %2 %422 +%571 = OpFunctionCall %2 %501 OpReturn OpFunctionEnd \ No newline at end of file diff --git a/tests/out/wgsl/operators.wgsl b/tests/out/wgsl/operators.wgsl index a8a488dff..9b7d647e3 100644 --- a/tests/out/wgsl/operators.wgsl +++ b/tests/out/wgsl/operators.wgsl @@ -251,6 +251,16 @@ fn assignment() { return; } +fn negation_avoids_prefix_decrement() { + _ = -(-2); + _ = -(-3); + _ = -(-(4)); + _ = -(-(-5)); + _ = -(-(-(-(6)))); + _ = -(-(-(-(-7)))); + _ = -(-(-(-(-8)))); +} + @compute @workgroup_size(1, 1, 1) fn main() { let _e4 = builtins();