Optimize compound constructors containing constant vars.
A constructor like `float2(one, two)` is not a compile-time constant, so we miss optimization opportunities like folding. Constant variables inside compound constructors are now replaced when optimization is on, so this would optimize down to `float2(1.0, 2.0)` and be eligible for folding. Change-Id: I80dd421f61d4eed21278805e2dc26d198a678e52 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/404657 Auto-Submit: John Stiles <johnstiles@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
This commit is contained in:
parent
080001cbf1
commit
8c9ccc8ad1
@ -9,5 +9,5 @@ half2 compute_ba(const half2 rg) {
|
||||
|
||||
half4 main(float2 xy) {
|
||||
const half g = r + 1;
|
||||
return half4(r, g, compute_ba(half2(r, g)));
|
||||
return half4(sqrt(r), g, compute_ba(half2(r, sqrt(g))));
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
* found in the LICENSE file.
|
||||
*/
|
||||
|
||||
#include "src/sksl/SkSLConstantFolder.h"
|
||||
#include "src/sksl/ir/SkSLConstructorCompound.h"
|
||||
|
||||
#include <algorithm>
|
||||
@ -71,6 +72,15 @@ std::unique_ptr<Expression> ConstructorCompound::Make(const Context& context,
|
||||
}
|
||||
args = std::move(flattened);
|
||||
}
|
||||
|
||||
// Replace constant variables with their corresponding values, so `float2(one, two)` can
|
||||
// compile down to `float2(1.0, 2.0)` (the latter is a compile-time constant).
|
||||
for (std::unique_ptr<Expression>& arg : args) {
|
||||
const Expression* value = ConstantFolder::GetConstantValueForVariable(*arg);
|
||||
if (value != arg.get()) {
|
||||
arg = value->clone();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return std::make_unique<ConstructorCompound>(offset, type, std::move(args));
|
||||
|
@ -6,5 +6,5 @@ half2 compute_ba_0(const half2 rg)
|
||||
half4 main(float2 xy)
|
||||
{
|
||||
const half g = 1.0;
|
||||
return half4(half4(r_0, g, compute_ba_0(half2(r_0, g))));
|
||||
return half4(half4(sqrt(r_0), 1.0, compute_ba_0(half2(0.0, sqrt(g)))));
|
||||
}
|
||||
|
@ -28,19 +28,19 @@ OpMemberDecorate %_UniformBuffer 1 RelaxedPrecision
|
||||
OpDecorate %_UniformBuffer Block
|
||||
OpDecorate %11 Binding 0
|
||||
OpDecorate %11 DescriptorSet 0
|
||||
OpDecorate %92 RelaxedPrecision
|
||||
OpDecorate %94 RelaxedPrecision
|
||||
OpDecorate %99 RelaxedPrecision
|
||||
OpDecorate %91 RelaxedPrecision
|
||||
OpDecorate %93 RelaxedPrecision
|
||||
OpDecorate %98 RelaxedPrecision
|
||||
OpDecorate %100 RelaxedPrecision
|
||||
OpDecorate %101 RelaxedPrecision
|
||||
OpDecorate %102 RelaxedPrecision
|
||||
OpDecorate %103 RelaxedPrecision
|
||||
OpDecorate %104 RelaxedPrecision
|
||||
OpDecorate %110 RelaxedPrecision
|
||||
OpDecorate %111 RelaxedPrecision
|
||||
OpDecorate %112 RelaxedPrecision
|
||||
OpDecorate %117 RelaxedPrecision
|
||||
OpDecorate %146 RelaxedPrecision
|
||||
OpDecorate %116 RelaxedPrecision
|
||||
OpDecorate %145 RelaxedPrecision
|
||||
OpDecorate %147 RelaxedPrecision
|
||||
OpDecorate %148 RelaxedPrecision
|
||||
OpDecorate %149 RelaxedPrecision
|
||||
%float = OpTypeFloat 32
|
||||
%v4float = OpTypeVector %float 4
|
||||
%_ptr_Output_v4float = OpTypePointer Output %v4float
|
||||
@ -71,14 +71,14 @@ OpDecorate %149 RelaxedPrecision
|
||||
%v2int = OpTypeVector %int 2
|
||||
%v2bool = OpTypeVector %bool 2
|
||||
%int_3 = OpConstant %int 3
|
||||
%80 = OpTypeFunction %v4float %_ptr_Function_v2float
|
||||
%79 = OpTypeFunction %v4float %_ptr_Function_v2float
|
||||
%_ptr_Function_float = OpTypePointer Function %float
|
||||
%float_1 = OpConstant %float 1
|
||||
%float_2 = OpConstant %float 2
|
||||
%_ptr_Function_v4float = OpTypePointer Function %v4float
|
||||
%v3float = OpTypeVector %float 3
|
||||
%float_n2 = OpConstant %float -2
|
||||
%111 = OpConstantComposite %v2float %float_1 %float_n2
|
||||
%110 = OpConstantComposite %v2float %float_1 %float_n2
|
||||
%false = OpConstantFalse %bool
|
||||
%_ptr_Uniform_v4float = OpTypePointer Uniform %v4float
|
||||
%_entrypoint_v = OpFunction %void None %16
|
||||
@ -118,103 +118,102 @@ OpStore %47 %46
|
||||
%57 = OpLoad %int %one
|
||||
%58 = OpLoad %int %two
|
||||
%59 = OpISub %int %57 %58
|
||||
%60 = OpLoad %int %two
|
||||
%61 = OpCompositeConstruct %v2int %59 %60
|
||||
%56 = OpSNegate %v2int %61
|
||||
%62 = OpIEqual %v2bool %48 %56
|
||||
%64 = OpAll %bool %62
|
||||
%65 = OpSelect %int %64 %int_1 %int_0
|
||||
%66 = OpAccessChain %_ptr_Function_int %result %int_3
|
||||
OpStore %66 %65
|
||||
%68 = OpLoad %v4int %result
|
||||
%69 = OpCompositeExtract %int %68 0
|
||||
%70 = OpLoad %v4int %result
|
||||
%71 = OpCompositeExtract %int %70 1
|
||||
%72 = OpIMul %int %69 %71
|
||||
%73 = OpLoad %v4int %result
|
||||
%74 = OpCompositeExtract %int %73 2
|
||||
%75 = OpIMul %int %72 %74
|
||||
%76 = OpLoad %v4int %result
|
||||
%77 = OpCompositeExtract %int %76 3
|
||||
%78 = OpIMul %int %75 %77
|
||||
%79 = OpINotEqual %bool %78 %int_0
|
||||
OpReturnValue %79
|
||||
%60 = OpCompositeConstruct %v2int %59 %int_2
|
||||
%56 = OpSNegate %v2int %60
|
||||
%61 = OpIEqual %v2bool %48 %56
|
||||
%63 = OpAll %bool %61
|
||||
%64 = OpSelect %int %63 %int_1 %int_0
|
||||
%65 = OpAccessChain %_ptr_Function_int %result %int_3
|
||||
OpStore %65 %64
|
||||
%67 = OpLoad %v4int %result
|
||||
%68 = OpCompositeExtract %int %67 0
|
||||
%69 = OpLoad %v4int %result
|
||||
%70 = OpCompositeExtract %int %69 1
|
||||
%71 = OpIMul %int %68 %70
|
||||
%72 = OpLoad %v4int %result
|
||||
%73 = OpCompositeExtract %int %72 2
|
||||
%74 = OpIMul %int %71 %73
|
||||
%75 = OpLoad %v4int %result
|
||||
%76 = OpCompositeExtract %int %75 3
|
||||
%77 = OpIMul %int %74 %76
|
||||
%78 = OpINotEqual %bool %77 %int_0
|
||||
OpReturnValue %78
|
||||
OpFunctionEnd
|
||||
%main = OpFunction %v4float None %80
|
||||
%81 = OpFunctionParameter %_ptr_Function_v2float
|
||||
%82 = OpLabel
|
||||
%main = OpFunction %v4float None %79
|
||||
%80 = OpFunctionParameter %_ptr_Function_v2float
|
||||
%81 = OpLabel
|
||||
%_0_one = OpVariable %_ptr_Function_float Function
|
||||
%_1_two = OpVariable %_ptr_Function_float Function
|
||||
%_2_result = OpVariable %_ptr_Function_v4float Function
|
||||
%140 = OpVariable %_ptr_Function_v4float Function
|
||||
%139 = OpVariable %_ptr_Function_v4float Function
|
||||
OpStore %_0_one %float_1
|
||||
OpStore %_1_two %float_2
|
||||
%90 = OpAccessChain %_ptr_Function_float %_2_result %int_0
|
||||
%89 = OpAccessChain %_ptr_Function_float %_2_result %int_0
|
||||
OpStore %89 %float_1
|
||||
%90 = OpAccessChain %_ptr_Function_float %_2_result %int_1
|
||||
OpStore %90 %float_1
|
||||
%91 = OpAccessChain %_ptr_Function_float %_2_result %int_1
|
||||
OpStore %91 %float_1
|
||||
%93 = OpLoad %float %_1_two
|
||||
%94 = OpCompositeConstruct %v4float %93 %93 %93 %93
|
||||
%92 = OpFNegate %v4float %94
|
||||
%96 = OpLoad %float %_1_two
|
||||
%95 = OpFNegate %float %96
|
||||
%98 = OpLoad %float %_1_two
|
||||
%97 = OpFNegate %float %98
|
||||
%99 = OpCompositeConstruct %v3float %97 %97 %97
|
||||
%101 = OpCompositeExtract %float %99 0
|
||||
%102 = OpCompositeExtract %float %99 1
|
||||
%103 = OpCompositeExtract %float %99 2
|
||||
%104 = OpCompositeConstruct %v4float %95 %101 %102 %103
|
||||
%105 = OpFOrdEqual %v4bool %92 %104
|
||||
%106 = OpAll %bool %105
|
||||
%107 = OpSelect %int %106 %int_1 %int_0
|
||||
%108 = OpConvertSToF %float %107
|
||||
%109 = OpAccessChain %_ptr_Function_float %_2_result %int_2
|
||||
OpStore %109 %108
|
||||
%113 = OpLoad %float %_0_one
|
||||
%114 = OpLoad %float %_1_two
|
||||
%115 = OpFSub %float %113 %114
|
||||
%116 = OpLoad %float %_1_two
|
||||
%117 = OpCompositeConstruct %v2float %115 %116
|
||||
%112 = OpFNegate %v2float %117
|
||||
%118 = OpFOrdEqual %v2bool %111 %112
|
||||
%119 = OpAll %bool %118
|
||||
%120 = OpSelect %int %119 %int_1 %int_0
|
||||
%121 = OpConvertSToF %float %120
|
||||
%122 = OpAccessChain %_ptr_Function_float %_2_result %int_3
|
||||
OpStore %122 %121
|
||||
%124 = OpLoad %v4float %_2_result
|
||||
%125 = OpCompositeExtract %float %124 0
|
||||
%126 = OpLoad %v4float %_2_result
|
||||
%127 = OpCompositeExtract %float %126 1
|
||||
%128 = OpFMul %float %125 %127
|
||||
%129 = OpLoad %v4float %_2_result
|
||||
%130 = OpCompositeExtract %float %129 2
|
||||
%131 = OpFMul %float %128 %130
|
||||
%132 = OpLoad %v4float %_2_result
|
||||
%133 = OpCompositeExtract %float %132 3
|
||||
%134 = OpFMul %float %131 %133
|
||||
%135 = OpFUnordNotEqual %bool %134 %float_0
|
||||
OpSelectionMerge %137 None
|
||||
OpBranchConditional %135 %136 %137
|
||||
%92 = OpLoad %float %_1_two
|
||||
%93 = OpCompositeConstruct %v4float %92 %92 %92 %92
|
||||
%91 = OpFNegate %v4float %93
|
||||
%95 = OpLoad %float %_1_two
|
||||
%94 = OpFNegate %float %95
|
||||
%97 = OpLoad %float %_1_two
|
||||
%96 = OpFNegate %float %97
|
||||
%98 = OpCompositeConstruct %v3float %96 %96 %96
|
||||
%100 = OpCompositeExtract %float %98 0
|
||||
%101 = OpCompositeExtract %float %98 1
|
||||
%102 = OpCompositeExtract %float %98 2
|
||||
%103 = OpCompositeConstruct %v4float %94 %100 %101 %102
|
||||
%104 = OpFOrdEqual %v4bool %91 %103
|
||||
%105 = OpAll %bool %104
|
||||
%106 = OpSelect %int %105 %int_1 %int_0
|
||||
%107 = OpConvertSToF %float %106
|
||||
%108 = OpAccessChain %_ptr_Function_float %_2_result %int_2
|
||||
OpStore %108 %107
|
||||
%112 = OpLoad %float %_0_one
|
||||
%113 = OpLoad %float %_1_two
|
||||
%114 = OpFSub %float %112 %113
|
||||
%115 = OpLoad %float %_1_two
|
||||
%116 = OpCompositeConstruct %v2float %114 %115
|
||||
%111 = OpFNegate %v2float %116
|
||||
%117 = OpFOrdEqual %v2bool %110 %111
|
||||
%118 = OpAll %bool %117
|
||||
%119 = OpSelect %int %118 %int_1 %int_0
|
||||
%120 = OpConvertSToF %float %119
|
||||
%121 = OpAccessChain %_ptr_Function_float %_2_result %int_3
|
||||
OpStore %121 %120
|
||||
%123 = OpLoad %v4float %_2_result
|
||||
%124 = OpCompositeExtract %float %123 0
|
||||
%125 = OpLoad %v4float %_2_result
|
||||
%126 = OpCompositeExtract %float %125 1
|
||||
%127 = OpFMul %float %124 %126
|
||||
%128 = OpLoad %v4float %_2_result
|
||||
%129 = OpCompositeExtract %float %128 2
|
||||
%130 = OpFMul %float %127 %129
|
||||
%131 = OpLoad %v4float %_2_result
|
||||
%132 = OpCompositeExtract %float %131 3
|
||||
%133 = OpFMul %float %130 %132
|
||||
%134 = OpFUnordNotEqual %bool %133 %float_0
|
||||
OpSelectionMerge %136 None
|
||||
OpBranchConditional %134 %135 %136
|
||||
%135 = OpLabel
|
||||
%137 = OpFunctionCall %bool %test_int_b
|
||||
OpBranch %136
|
||||
%136 = OpLabel
|
||||
%138 = OpFunctionCall %bool %test_int_b
|
||||
OpBranch %137
|
||||
%137 = OpLabel
|
||||
%139 = OpPhi %bool %false %82 %138 %136
|
||||
OpSelectionMerge %143 None
|
||||
OpBranchConditional %139 %141 %142
|
||||
%138 = OpPhi %bool %false %81 %137 %135
|
||||
OpSelectionMerge %142 None
|
||||
OpBranchConditional %138 %140 %141
|
||||
%140 = OpLabel
|
||||
%143 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
|
||||
%145 = OpLoad %v4float %143
|
||||
OpStore %139 %145
|
||||
OpBranch %142
|
||||
%141 = OpLabel
|
||||
%144 = OpAccessChain %_ptr_Uniform_v4float %11 %int_0
|
||||
%146 = OpLoad %v4float %144
|
||||
OpStore %140 %146
|
||||
OpBranch %143
|
||||
%146 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
|
||||
%147 = OpLoad %v4float %146
|
||||
OpStore %139 %147
|
||||
OpBranch %142
|
||||
%142 = OpLabel
|
||||
%147 = OpAccessChain %_ptr_Uniform_v4float %11 %int_1
|
||||
%148 = OpLoad %v4float %147
|
||||
OpStore %140 %148
|
||||
OpBranch %143
|
||||
%143 = OpLabel
|
||||
%149 = OpLoad %v4float %140
|
||||
OpReturnValue %149
|
||||
%148 = OpLoad %v4float %139
|
||||
OpReturnValue %148
|
||||
OpFunctionEnd
|
||||
|
@ -9,7 +9,7 @@ bool test_int_b() {
|
||||
result.x = 1;
|
||||
result.y = 1;
|
||||
result.z = int(-ivec4(two) == ivec4(-2, ivec3(-2)) ? 1 : 0);
|
||||
result.w = int(-ivec2(-one, one + one) == -ivec2(one - two, two) ? 1 : 0);
|
||||
result.w = int(-ivec2(-one, one + one) == -ivec2(one - two, 2) ? 1 : 0);
|
||||
return bool(((result.x * result.y) * result.z) * result.w);
|
||||
}
|
||||
vec4 main() {
|
||||
|
@ -18,7 +18,7 @@ bool test_int_b() {
|
||||
result.x = 1;
|
||||
result.y = 1;
|
||||
result.z = int(all(-int4(two) == int4(-2, int3(-2))) ? 1 : 0);
|
||||
result.w = int(all(-int2(-one, one + one) == -int2(one - two, two)) ? 1 : 0);
|
||||
result.w = int(all(-int2(-one, one + one) == -int2(one - two, 2)) ? 1 : 0);
|
||||
return bool(((result.x * result.y) * result.z) * result.w);
|
||||
}
|
||||
fragment Outputs fragmentMain(Inputs _in [[stage_in]], constant Uniforms& _uniforms [[buffer(0)]], bool _frontFacing [[front_facing]], float4 _fragCoord [[position]]) {
|
||||
|
Loading…
Reference in New Issue
Block a user