Implement constant folding for (bool == bool) and (bool != bool).

We already had support for &&, ||, ^^ but somehow the common cases of
== and != were not implemented in the constant-folder.

This CL also updates the test to return a green/red color on success or
failure, instead of assigning arbitrary numbers into sk_FragColor that
don't mean anything. The long-term plan is to signal success or failure
of each test by color code; we can display these colors as swatches in a
GM slide for testing purposes.

Change-Id: I0810108b3c6b656a60cd8aa64ceefd765eff0157
Bug: skia:11112
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/355984
Auto-Submit: John Stiles <johnstiles@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
This commit is contained in:
John Stiles 2021-01-19 19:00:31 -05:00 committed by Skia Commit-Bot
parent 6eb610f75c
commit 26fdcbb38b
6 changed files with 85 additions and 126 deletions

View File

@ -151,6 +151,8 @@ std::unique_ptr<Expression> ConstantFolder::Simplify(const Context& context,
case Token::Kind::TK_LOGICALAND: result = leftVal && rightVal; break;
case Token::Kind::TK_LOGICALOR: result = leftVal || rightVal; break;
case Token::Kind::TK_LOGICALXOR: result = leftVal ^ rightVal; break;
case Token::Kind::TK_EQEQ: result = leftVal == rightVal; break;
case Token::Kind::TK_NEQ: result = leftVal != rightVal; break;
default: return nullptr;
}
return std::make_unique<BoolLiteral>(context, left.fOffset, result);

View File

@ -1,8 +1,18 @@
void main() {
sk_FragColor.r = 1 == 1 || 2 == 8 ? 1 : -1;
sk_FragColor.r = 1 > 1 || 2 == 8 ? 2 : -2;
sk_FragColor.r = 1 == 1 && 2 <= 8 ? 3 : -3;
sk_FragColor.r = 1 == 2 && 2 == 8 ? 4 : -4;
sk_FragColor.r = 1 == 1 ^^ 1 != 1 ? 5 : -5;
sk_FragColor.r = 1 == 1 ^^ 1 == 1 ? 6 : -6;
bool test() {
bool a = 1 == 1 || 2 == 8;
bool b = 1 > 1 || 2 == 8;
bool c = 1 == 1 && 2 <= 8;
bool d = 1 == 2 && 2 == 8;
bool e = 1 == 1 ^^ 1 != 1;
bool f = 1 == 1 ^^ 1 == 1;
bool g = true == true;
bool h = false == true;
bool i = true == !false;
bool j = false == !false;
return a && !b && c && !d && e && !f && g && !h && i && !j;
}
half4 main() {
return test() ? half4(0,1,0,1) : half4(1,0,0,1);
}

View File

@ -1,10 +1,5 @@
out vec4 sk_FragColor;
void main() {
sk_FragColor.x = 1.0;
sk_FragColor.x = -2.0;
sk_FragColor.x = 3.0;
sk_FragColor.x = -4.0;
sk_FragColor.x = 5.0;
sk_FragColor.x = -6.0;
vec4 main() {
return vec4(0.0, 1.0, 0.0, 1.0);
}

View File

@ -8,24 +8,16 @@ OpName %main "main"
OpName %x "x"
OpName %y "y"
OpName %z "z"
OpName %b "b"
OpName %c "c"
OpName %d "d"
OpName %e "e"
OpName %f "f"
OpDecorate %sk_Clockwise RelaxedPrecision
OpDecorate %sk_Clockwise BuiltIn FrontFacing
OpDecorate %35 RelaxedPrecision
OpDecorate %36 RelaxedPrecision
OpDecorate %39 RelaxedPrecision
OpDecorate %42 RelaxedPrecision
OpDecorate %45 RelaxedPrecision
OpDecorate %48 RelaxedPrecision
OpDecorate %82 RelaxedPrecision
OpDecorate %85 RelaxedPrecision
OpDecorate %88 RelaxedPrecision
OpDecorate %91 RelaxedPrecision
OpDecorate %94 RelaxedPrecision
OpDecorate %27 RelaxedPrecision
OpDecorate %30 RelaxedPrecision
OpDecorate %63 RelaxedPrecision
OpDecorate %66 RelaxedPrecision
OpDecorate %69 RelaxedPrecision
%bool = OpTypeBool
%_ptr_Input_bool = OpTypePointer Input %bool
%sk_Clockwise = OpVariable %_ptr_Input_bool Input
@ -42,7 +34,6 @@ OpDecorate %94 RelaxedPrecision
%int_8 = OpConstant %int 8
%_ptr_Function_bool = OpTypePointer Function %bool
%true = OpConstantTrue %bool
%false = OpConstantFalse %bool
%float_12 = OpConstant %float 12
%float_10 = OpConstant %float 10
%int_0 = OpConstant %int 0
@ -59,103 +50,68 @@ OpDecorate %94 RelaxedPrecision
%x = OpVariable %_ptr_Function_float Function
%y = OpVariable %_ptr_Function_float Function
%z = OpVariable %_ptr_Function_int Function
%b = OpVariable %_ptr_Function_bool Function
%c = OpVariable %_ptr_Function_bool Function
%d = OpVariable %_ptr_Function_bool Function
%e = OpVariable %_ptr_Function_bool Function
%f = OpVariable %_ptr_Function_bool Function
OpStore %x %float_1
OpStore %y %float_2
OpStore %z %int_3
OpStore %x %float_2
OpStore %y %float_0_5
OpStore %z %int_8
%25 = OpLogicalEqual %bool %false %false
OpSelectionMerge %27 None
OpBranchConditional %25 %27 %26
%26 = OpLabel
%28 = OpExtInst %float %1 Sqrt %float_2
%29 = OpFOrdGreaterThanEqual %bool %float_2 %28
OpBranch %27
%27 = OpLabel
%30 = OpPhi %bool %true %8 %29 %26
OpStore %b %30
%32 = OpExtInst %float %1 Sqrt %float_2
%33 = OpFOrdGreaterThan %bool %32 %float_2
OpStore %c %33
%35 = OpLoad %bool %b
%36 = OpLoad %bool %c
%37 = OpLogicalNotEqual %bool %35 %36
OpStore %d %37
%39 = OpLoad %bool %b
OpSelectionMerge %41 None
OpBranchConditional %39 %40 %41
%40 = OpLabel
%42 = OpLoad %bool %c
OpBranch %41
%41 = OpLabel
%43 = OpPhi %bool %false %27 %42 %40
OpStore %e %43
%45 = OpLoad %bool %b
OpSelectionMerge %47 None
OpBranchConditional %45 %47 %46
%46 = OpLabel
%48 = OpLoad %bool %c
OpBranch %47
%47 = OpLabel
%49 = OpPhi %bool %true %41 %48 %46
OpStore %f %49
%50 = OpLoad %float %x
%52 = OpFAdd %float %50 %float_12
OpStore %x %52
%53 = OpLoad %float %x
%54 = OpFSub %float %53 %float_12
OpStore %x %54
%55 = OpLoad %float %x
%56 = OpLoad %float %y
%58 = OpFDiv %float %56 %float_10
OpStore %y %58
%59 = OpFMul %float %55 %58
OpStore %x %59
%60 = OpLoad %int %z
%62 = OpBitwiseOr %int %60 %int_0
OpStore %z %62
%63 = OpLoad %int %z
%65 = OpBitwiseAnd %int %63 %int_n1
OpStore %z %65
%66 = OpLoad %int %z
%67 = OpBitwiseXor %int %66 %int_0
OpStore %z %67
%68 = OpLoad %int %z
%70 = OpShiftRightArithmetic %int %68 %int_2
OpStore %z %70
%71 = OpLoad %int %z
%73 = OpShiftLeftLogical %int %71 %int_4
OpStore %z %73
%74 = OpLoad %int %z
%76 = OpSMod %int %74 %int_5
OpStore %z %76
%77 = OpExtInst %float %1 Sqrt %float_1
%78 = OpCompositeConstruct %v2float %77 %77
%81 = OpConvertSToF %float %int_6
OpStore %x %81
%82 = OpLoad %bool %b
%83 = OpSelect %float %82 %float_1 %float_0
%85 = OpLoad %bool %c
%86 = OpSelect %float %85 %float_1 %float_0
%87 = OpFMul %float %83 %86
%88 = OpLoad %bool %d
%89 = OpSelect %float %88 %float_1 %float_0
%90 = OpFMul %float %87 %89
%91 = OpLoad %bool %e
%92 = OpSelect %float %91 %float_1 %float_0
%93 = OpFMul %float %90 %92
%94 = OpLoad %bool %f
%95 = OpSelect %float %94 %float_1 %float_0
%96 = OpFMul %float %93 %95
%23 = OpExtInst %float %1 Sqrt %float_2
%24 = OpFOrdGreaterThan %bool %23 %float_2
OpStore %c %24
%27 = OpLoad %bool %c
%28 = OpLogicalNotEqual %bool %true %27
OpStore %d %28
%30 = OpLoad %bool %c
OpStore %e %30
%31 = OpLoad %float %x
%33 = OpFAdd %float %31 %float_12
OpStore %x %33
%34 = OpLoad %float %x
%35 = OpFSub %float %34 %float_12
OpStore %x %35
%36 = OpLoad %float %x
%37 = OpLoad %float %y
%39 = OpFDiv %float %37 %float_10
OpStore %y %39
%40 = OpFMul %float %36 %39
OpStore %x %40
%41 = OpLoad %int %z
%43 = OpBitwiseOr %int %41 %int_0
OpStore %z %43
%44 = OpLoad %int %z
%46 = OpBitwiseAnd %int %44 %int_n1
OpStore %z %46
%47 = OpLoad %int %z
%48 = OpBitwiseXor %int %47 %int_0
OpStore %z %48
%49 = OpLoad %int %z
%51 = OpShiftRightArithmetic %int %49 %int_2
OpStore %z %51
%52 = OpLoad %int %z
%54 = OpShiftLeftLogical %int %52 %int_4
OpStore %z %54
%55 = OpLoad %int %z
%57 = OpSMod %int %55 %int_5
OpStore %z %57
%58 = OpExtInst %float %1 Sqrt %float_1
%59 = OpCompositeConstruct %v2float %58 %58
%62 = OpConvertSToF %float %int_6
OpStore %x %62
%63 = OpLoad %bool %c
%64 = OpSelect %float %63 %float_1 %float_0
%66 = OpLoad %bool %d
%67 = OpSelect %float %66 %float_1 %float_0
%68 = OpFMul %float %64 %67
%69 = OpLoad %bool %e
%70 = OpSelect %float %69 %float_1 %float_0
%71 = OpFMul %float %68 %70
OpStore %y %float_6
%98 = OpExtInst %float %1 Sqrt %float_1
%99 = OpCompositeConstruct %v2float %98 %98
%73 = OpExtInst %float %1 Sqrt %float_1
%74 = OpCompositeConstruct %v2float %73 %73
OpStore %z %int_6
OpReturn
OpFunctionEnd

View File

@ -7,11 +7,9 @@ void main() {
x = 2.0;
y = 0.5;
z = 8;
bool b = false == false || 2.0 >= sqrt(2.0);
bool c = sqrt(2.0) > 2.0;
bool d = b ^^ c;
bool e = b && c;
bool f = b || c;
bool d = true ^^ c;
bool e = c;
x += 12.0;
x -= 12.0;
x *= (y /= 10.0);
@ -22,6 +20,6 @@ void main() {
z <<= 4;
z %= 5;
x = float((vec2(sqrt(1.0)) , 6));
y = ((((float(b) * float(c)) * float(d)) * float(e)) * float(f) , 6.0);
y = ((float(c) * float(d)) * float(e) , 6.0);
z = int((vec2(sqrt(1.0)) , 6));
}

View File

@ -16,11 +16,9 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
x = 2.0;
y = 0.5;
z = 8;
bool b = false == false || 2.0 >= sqrt(2.0);
bool c = sqrt(2.0) > 2.0;
bool d = b != c;
bool e = b && c;
bool f = b || c;
bool d = true != c;
bool e = c;
x += 12.0;
x -= 12.0;
x *= (y /= 10.0);
@ -31,7 +29,7 @@ fragment Outputs fragmentMain(Inputs _in [[stage_in]], bool _frontFacing [[front
z <<= 4;
z %= 5;
x = float((float2(sqrt(1.0)) , 6));
y = ((((float(b) * float(c)) * float(d)) * float(e)) * float(f) , 6.0);
y = ((float(c) * float(d)) * float(e) , 6.0);
z = int((float2(sqrt(1.0)) , 6));
return *_out;
}