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:
parent
6eb610f75c
commit
26fdcbb38b
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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));
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user