Add const-eval for all.

This CL adds const-eval for the `all` builtin.

Bug: tint:1581
Change-Id: Ib1d857ba24114c61e1a90b30dd66d063edfa136d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/107464
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Dan Sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
dan sinclair 2022-11-03 12:07:49 +00:00 committed by Dawn LUCI CQ
parent aa4b64f4c8
commit 58eca19f33
24 changed files with 131 additions and 96 deletions

View File

@ -410,8 +410,8 @@ fn acos<T: f32_f16>(T) -> T
fn acos<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T> fn acos<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
fn acosh<T: f32_f16>(T) -> T fn acosh<T: f32_f16>(T) -> T
fn acosh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T> fn acosh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
fn all(bool) -> bool @const fn all(bool) -> bool
fn all<N: num>(vec<N, bool>) -> bool @const fn all<N: num>(vec<N, bool>) -> bool
@const fn any(bool) -> bool @const fn any(bool) -> bool
@const fn any<N: num>(vec<N, bool>) -> bool @const fn any<N: num>(vec<N, bool>) -> bool
fn arrayLength<T, A: access>(ptr<storage, array<T>, A>) -> u32 fn arrayLength<T, A: access>(ptr<storage, array<T>, A>) -> u32

View File

@ -1570,6 +1570,12 @@ ConstEval::Result ConstEval::OpShiftLeft(const sem::Type* ty,
return r; return r;
} }
ConstEval::Result ConstEval::all(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args,
const Source&) {
return CreateElement(builder, ty, !args[0]->AnyZero());
}
ConstEval::Result ConstEval::any(const sem::Type* ty, ConstEval::Result ConstEval::any(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args, utils::VectorRef<const sem::Constant*> args,
const Source&) { const Source&) {

View File

@ -377,6 +377,15 @@ class ConstEval {
// Builtins // Builtins
//////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////
/// all builtin
/// @param ty the expression type
/// @param args the input arguments
/// @param source the source location of the conversion
/// @return the result value, or null if the value cannot be calculated
Result all(const sem::Type* ty,
utils::VectorRef<const sem::Constant*> args,
const Source& source);
/// any builtin /// any builtin
/// @param ty the expression type /// @param ty the expression type
/// @param args the input arguments /// @param args the input arguments

View File

@ -146,6 +146,35 @@ INSTANTIATE_TEST_SUITE_P( //
C({1.0_a, 0_a}, kPiOver2<AFloat>), C({1.0_a, 0_a}, kPiOver2<AFloat>),
}))); })));
static std::vector<Case> AllCases() {
return {
C({Val(true)}, Val(true)),
C({Val(false)}, Val(false)),
C({Vec(true, true)}, Val(true)),
C({Vec(true, false)}, Val(false)),
C({Vec(false, true)}, Val(false)),
C({Vec(false, false)}, Val(false)),
C({Vec(true, true, true)}, Val(true)),
C({Vec(false, true, true)}, Val(false)),
C({Vec(true, false, true)}, Val(false)),
C({Vec(true, true, false)}, Val(false)),
C({Vec(false, false, false)}, Val(false)),
C({Vec(true, true, true, true)}, Val(true)),
C({Vec(false, true, true, true)}, Val(false)),
C({Vec(true, false, true, true)}, Val(false)),
C({Vec(true, true, false, true)}, Val(false)),
C({Vec(true, true, true, false)}, Val(false)),
C({Vec(false, false, false, false)}, Val(false)),
};
}
INSTANTIATE_TEST_SUITE_P( //
All,
ResolverConstEvalBuiltinTest,
testing::Combine(testing::Values(sem::BuiltinType::kAll), testing::ValuesIn(AllCases())));
static std::vector<Case> AnyCases() { static std::vector<Case> AnyCases() {
return { return {
C({Val(true)}, Val(true)), C({Val(true)}, Val(true)),

View File

@ -13430,7 +13430,7 @@ constexpr OverloadInfo kOverloads[] = {
/* parameters */ &kParameters[996], /* parameters */ &kParameters[996],
/* return matcher indices */ &kMatcherIndices[41], /* return matcher indices */ &kMatcherIndices[41],
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline), /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
/* const eval */ nullptr, /* const eval */ &ConstEval::all,
}, },
{ {
/* [425] */ /* [425] */
@ -13442,7 +13442,7 @@ constexpr OverloadInfo kOverloads[] = {
/* parameters */ &kParameters[1017], /* parameters */ &kParameters[1017],
/* return matcher indices */ &kMatcherIndices[41], /* return matcher indices */ &kMatcherIndices[41],
/* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline), /* flags */ OverloadFlags(OverloadFlag::kIsBuiltin, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
/* const eval */ nullptr, /* const eval */ &ConstEval::all,
}, },
{ {
/* [426] */ /* [426] */

View File

@ -1,5 +1,5 @@
void all_353d6a() { void all_353d6a() {
bool res = all(true); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,5 +1,5 @@
void all_353d6a() { void all_353d6a() {
bool res = all(true); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -2,7 +2,7 @@
using namespace metal; using namespace metal;
void all_353d6a() { void all_353d6a() {
bool res = all(true); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V ; SPIR-V
; Version: 1.3 ; Version: 1.3
; Generator: Google Tint Compiler; 0 ; Generator: Google Tint Compiler; 0
; Bound: 33 ; Bound: 32
; Schema: 0 ; Schema: 0
OpCapability Shader OpCapability Shader
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -33,34 +33,34 @@
%bool = OpTypeBool %bool = OpTypeBool
%true = OpConstantTrue %bool %true = OpConstantTrue %bool
%_ptr_Function_bool = OpTypePointer Function %bool %_ptr_Function_bool = OpTypePointer Function %bool
%18 = OpConstantNull %bool %17 = OpConstantNull %bool
%19 = OpTypeFunction %v4float %18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%all_353d6a = OpFunction %void None %9 %all_353d6a = OpFunction %void None %9
%12 = OpLabel %12 = OpLabel
%res = OpVariable %_ptr_Function_bool Function %18 %res = OpVariable %_ptr_Function_bool Function %17
OpStore %res %true OpStore %res %true
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %19 %vertex_main_inner = OpFunction %v4float None %18
%21 = OpLabel %20 = OpLabel
%22 = OpFunctionCall %void %all_353d6a %21 = OpFunctionCall %void %all_353d6a
OpReturnValue %5 OpReturnValue %5
OpFunctionEnd OpFunctionEnd
%vertex_main = OpFunction %void None %9 %vertex_main = OpFunction %void None %9
%24 = OpLabel %23 = OpLabel
%25 = OpFunctionCall %v4float %vertex_main_inner %24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %25 OpStore %value %24
OpStore %vertex_point_size %float_1 OpStore %vertex_point_size %float_1
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%fragment_main = OpFunction %void None %9 %fragment_main = OpFunction %void None %9
%28 = OpLabel %27 = OpLabel
%29 = OpFunctionCall %void %all_353d6a %28 = OpFunctionCall %void %all_353d6a
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%compute_main = OpFunction %void None %9 %compute_main = OpFunction %void None %9
%31 = OpLabel %30 = OpLabel
%32 = OpFunctionCall %void %all_353d6a %31 = OpFunctionCall %void %all_353d6a
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd

View File

@ -1,5 +1,5 @@
void all_986c7b() { void all_986c7b() {
bool res = all((true).xxxx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,5 +1,5 @@
void all_986c7b() { void all_986c7b() {
bool res = all((true).xxxx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
#version 310 es #version 310 es
void all_986c7b() { void all_986c7b() {
bool res = all(bvec4(true)); bool res = true;
} }
vec4 vertex_main() { vec4 vertex_main() {
@ -21,7 +21,7 @@ void main() {
precision mediump float; precision mediump float;
void all_986c7b() { void all_986c7b() {
bool res = all(bvec4(true)); bool res = true;
} }
void fragment_main() { void fragment_main() {
@ -35,7 +35,7 @@ void main() {
#version 310 es #version 310 es
void all_986c7b() { void all_986c7b() {
bool res = all(bvec4(true)); bool res = true;
} }
void compute_main() { void compute_main() {

View File

@ -2,7 +2,7 @@
using namespace metal; using namespace metal;
void all_986c7b() { void all_986c7b() {
bool res = all(bool4(true)); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V ; SPIR-V
; Version: 1.3 ; Version: 1.3
; Generator: Google Tint Compiler; 0 ; Generator: Google Tint Compiler; 0
; Bound: 35 ; Bound: 32
; Schema: 0 ; Schema: 0
OpCapability Shader OpCapability Shader
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -31,39 +31,36 @@
%void = OpTypeVoid %void = OpTypeVoid
%9 = OpTypeFunction %void %9 = OpTypeFunction %void
%bool = OpTypeBool %bool = OpTypeBool
%v4bool = OpTypeVector %bool 4
%true = OpConstantTrue %bool %true = OpConstantTrue %bool
%17 = OpConstantComposite %v4bool %true %true %true %true
%_ptr_Function_bool = OpTypePointer Function %bool %_ptr_Function_bool = OpTypePointer Function %bool
%20 = OpConstantNull %bool %17 = OpConstantNull %bool
%21 = OpTypeFunction %v4float %18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%all_986c7b = OpFunction %void None %9 %all_986c7b = OpFunction %void None %9
%12 = OpLabel %12 = OpLabel
%res = OpVariable %_ptr_Function_bool Function %20 %res = OpVariable %_ptr_Function_bool Function %17
%13 = OpAll %bool %17 OpStore %res %true
OpStore %res %13
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %21 %vertex_main_inner = OpFunction %v4float None %18
%23 = OpLabel %20 = OpLabel
%24 = OpFunctionCall %void %all_986c7b %21 = OpFunctionCall %void %all_986c7b
OpReturnValue %5 OpReturnValue %5
OpFunctionEnd OpFunctionEnd
%vertex_main = OpFunction %void None %9 %vertex_main = OpFunction %void None %9
%26 = OpLabel %23 = OpLabel
%27 = OpFunctionCall %v4float %vertex_main_inner %24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %27 OpStore %value %24
OpStore %vertex_point_size %float_1 OpStore %vertex_point_size %float_1
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%fragment_main = OpFunction %void None %9 %fragment_main = OpFunction %void None %9
%27 = OpLabel
%28 = OpFunctionCall %void %all_986c7b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %9
%30 = OpLabel %30 = OpLabel
%31 = OpFunctionCall %void %all_986c7b %31 = OpFunctionCall %void %all_986c7b
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%compute_main = OpFunction %void None %9
%33 = OpLabel
%34 = OpFunctionCall %void %all_986c7b
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
void all_bd2dba() { void all_bd2dba() {
bool res = all((true).xxx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,5 +1,5 @@
void all_bd2dba() { void all_bd2dba() {
bool res = all((true).xxx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
#version 310 es #version 310 es
void all_bd2dba() { void all_bd2dba() {
bool res = all(bvec3(true)); bool res = true;
} }
vec4 vertex_main() { vec4 vertex_main() {
@ -21,7 +21,7 @@ void main() {
precision mediump float; precision mediump float;
void all_bd2dba() { void all_bd2dba() {
bool res = all(bvec3(true)); bool res = true;
} }
void fragment_main() { void fragment_main() {
@ -35,7 +35,7 @@ void main() {
#version 310 es #version 310 es
void all_bd2dba() { void all_bd2dba() {
bool res = all(bvec3(true)); bool res = true;
} }
void compute_main() { void compute_main() {

View File

@ -2,7 +2,7 @@
using namespace metal; using namespace metal;
void all_bd2dba() { void all_bd2dba() {
bool res = all(bool3(true)); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V ; SPIR-V
; Version: 1.3 ; Version: 1.3
; Generator: Google Tint Compiler; 0 ; Generator: Google Tint Compiler; 0
; Bound: 35 ; Bound: 32
; Schema: 0 ; Schema: 0
OpCapability Shader OpCapability Shader
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -31,39 +31,36 @@
%void = OpTypeVoid %void = OpTypeVoid
%9 = OpTypeFunction %void %9 = OpTypeFunction %void
%bool = OpTypeBool %bool = OpTypeBool
%v3bool = OpTypeVector %bool 3
%true = OpConstantTrue %bool %true = OpConstantTrue %bool
%17 = OpConstantComposite %v3bool %true %true %true
%_ptr_Function_bool = OpTypePointer Function %bool %_ptr_Function_bool = OpTypePointer Function %bool
%20 = OpConstantNull %bool %17 = OpConstantNull %bool
%21 = OpTypeFunction %v4float %18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%all_bd2dba = OpFunction %void None %9 %all_bd2dba = OpFunction %void None %9
%12 = OpLabel %12 = OpLabel
%res = OpVariable %_ptr_Function_bool Function %20 %res = OpVariable %_ptr_Function_bool Function %17
%13 = OpAll %bool %17 OpStore %res %true
OpStore %res %13
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %21 %vertex_main_inner = OpFunction %v4float None %18
%23 = OpLabel %20 = OpLabel
%24 = OpFunctionCall %void %all_bd2dba %21 = OpFunctionCall %void %all_bd2dba
OpReturnValue %5 OpReturnValue %5
OpFunctionEnd OpFunctionEnd
%vertex_main = OpFunction %void None %9 %vertex_main = OpFunction %void None %9
%26 = OpLabel %23 = OpLabel
%27 = OpFunctionCall %v4float %vertex_main_inner %24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %27 OpStore %value %24
OpStore %vertex_point_size %float_1 OpStore %vertex_point_size %float_1
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%fragment_main = OpFunction %void None %9 %fragment_main = OpFunction %void None %9
%27 = OpLabel
%28 = OpFunctionCall %void %all_bd2dba
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %9
%30 = OpLabel %30 = OpLabel
%31 = OpFunctionCall %void %all_bd2dba %31 = OpFunctionCall %void %all_bd2dba
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%compute_main = OpFunction %void None %9
%33 = OpLabel
%34 = OpFunctionCall %void %all_bd2dba
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
void all_f46790() { void all_f46790() {
bool res = all((true).xx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,5 +1,5 @@
void all_f46790() { void all_f46790() {
bool res = all((true).xx); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
#version 310 es #version 310 es
void all_f46790() { void all_f46790() {
bool res = all(bvec2(true)); bool res = true;
} }
vec4 vertex_main() { vec4 vertex_main() {
@ -21,7 +21,7 @@ void main() {
precision mediump float; precision mediump float;
void all_f46790() { void all_f46790() {
bool res = all(bvec2(true)); bool res = true;
} }
void fragment_main() { void fragment_main() {
@ -35,7 +35,7 @@ void main() {
#version 310 es #version 310 es
void all_f46790() { void all_f46790() {
bool res = all(bvec2(true)); bool res = true;
} }
void compute_main() { void compute_main() {

View File

@ -2,7 +2,7 @@
using namespace metal; using namespace metal;
void all_f46790() { void all_f46790() {
bool res = all(bool2(true)); bool res = true;
} }
struct tint_symbol { struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V ; SPIR-V
; Version: 1.3 ; Version: 1.3
; Generator: Google Tint Compiler; 0 ; Generator: Google Tint Compiler; 0
; Bound: 35 ; Bound: 32
; Schema: 0 ; Schema: 0
OpCapability Shader OpCapability Shader
OpMemoryModel Logical GLSL450 OpMemoryModel Logical GLSL450
@ -31,39 +31,36 @@
%void = OpTypeVoid %void = OpTypeVoid
%9 = OpTypeFunction %void %9 = OpTypeFunction %void
%bool = OpTypeBool %bool = OpTypeBool
%v2bool = OpTypeVector %bool 2
%true = OpConstantTrue %bool %true = OpConstantTrue %bool
%17 = OpConstantComposite %v2bool %true %true
%_ptr_Function_bool = OpTypePointer Function %bool %_ptr_Function_bool = OpTypePointer Function %bool
%20 = OpConstantNull %bool %17 = OpConstantNull %bool
%21 = OpTypeFunction %v4float %18 = OpTypeFunction %v4float
%float_1 = OpConstant %float 1 %float_1 = OpConstant %float 1
%all_f46790 = OpFunction %void None %9 %all_f46790 = OpFunction %void None %9
%12 = OpLabel %12 = OpLabel
%res = OpVariable %_ptr_Function_bool Function %20 %res = OpVariable %_ptr_Function_bool Function %17
%13 = OpAll %bool %17 OpStore %res %true
OpStore %res %13
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %21 %vertex_main_inner = OpFunction %v4float None %18
%23 = OpLabel %20 = OpLabel
%24 = OpFunctionCall %void %all_f46790 %21 = OpFunctionCall %void %all_f46790
OpReturnValue %5 OpReturnValue %5
OpFunctionEnd OpFunctionEnd
%vertex_main = OpFunction %void None %9 %vertex_main = OpFunction %void None %9
%26 = OpLabel %23 = OpLabel
%27 = OpFunctionCall %v4float %vertex_main_inner %24 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %27 OpStore %value %24
OpStore %vertex_point_size %float_1 OpStore %vertex_point_size %float_1
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%fragment_main = OpFunction %void None %9 %fragment_main = OpFunction %void None %9
%27 = OpLabel
%28 = OpFunctionCall %void %all_f46790
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %9
%30 = OpLabel %30 = OpLabel
%31 = OpFunctionCall %void %all_f46790 %31 = OpFunctionCall %void %all_f46790
OpReturn OpReturn
OpFunctionEnd OpFunctionEnd
%compute_main = OpFunction %void None %9
%33 = OpLabel
%34 = OpFunctionCall %void %all_f46790
OpReturn
OpFunctionEnd