mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-07-07 21:55:53 +00:00
tint: const eval of logical AND and OR
Bug: tint:1581 Change-Id: I3921041613cb1c9fa3365d4cb1fc8c81bab92003 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/113101 Commit-Queue: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
6198bea2ac
commit
4c8f5a1ac2
@ -969,8 +969,8 @@ init mat4x4<T: fa_f32_f16>(vec4<T>, vec4<T>, vec4<T>, vec4<T>) -> mat4x4<T>
|
|||||||
@const op | <T: ia_iu32>(T, T) -> T
|
@const op | <T: ia_iu32>(T, T) -> T
|
||||||
@const op | <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
|
@const op | <T: ia_iu32, N: num> (vec<N, T>, vec<N, T>) -> vec<N, T>
|
||||||
|
|
||||||
op && (bool, bool) -> bool
|
@const op && (bool, bool) -> bool
|
||||||
op || (bool, bool) -> bool
|
@const op || (bool, bool) -> bool
|
||||||
|
|
||||||
@const op == <T: scalar>(T, T) -> bool
|
@const op == <T: scalar>(T, T) -> bool
|
||||||
@const op == <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
|
@const op == <T: scalar, N: num> (vec<N, T>, vec<N, T>) -> vec<N, bool>
|
||||||
|
@ -1810,6 +1810,18 @@ ConstEval::Result ConstEval::OpGreaterThanEqual(const sem::Type* ty,
|
|||||||
return TransformElements(builder, ty, transform, args[0], args[1]);
|
return TransformElements(builder, ty, transform, args[0], args[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConstEval::Result ConstEval::OpLogicalAnd(const sem::Type* ty,
|
||||||
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
|
const Source& source) {
|
||||||
|
return CreateElement(builder, source, ty, args[0]->As<bool>() && args[1]->As<bool>());
|
||||||
|
}
|
||||||
|
|
||||||
|
ConstEval::Result ConstEval::OpLogicalOr(const sem::Type* ty,
|
||||||
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
|
const Source& source) {
|
||||||
|
return CreateElement(builder, source, ty, args[0]->As<bool>() || args[1]->As<bool>());
|
||||||
|
}
|
||||||
|
|
||||||
ConstEval::Result ConstEval::OpAnd(const sem::Type* ty,
|
ConstEval::Result ConstEval::OpAnd(const sem::Type* ty,
|
||||||
utils::VectorRef<const sem::Constant*> args,
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
const Source& source) {
|
const Source& source) {
|
||||||
|
@ -346,6 +346,24 @@ class ConstEval {
|
|||||||
utils::VectorRef<const sem::Constant*> args,
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
const Source& source);
|
const Source& source);
|
||||||
|
|
||||||
|
/// Logical and operator '&&'
|
||||||
|
/// @param ty the expression type
|
||||||
|
/// @param args the input arguments
|
||||||
|
/// @param source the source location
|
||||||
|
/// @return the result value, or null if the value cannot be calculated
|
||||||
|
Result OpLogicalAnd(const sem::Type* ty,
|
||||||
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
|
const Source& source);
|
||||||
|
|
||||||
|
/// Logical or operator '||'
|
||||||
|
/// @param ty the expression type
|
||||||
|
/// @param args the input arguments
|
||||||
|
/// @param source the source location
|
||||||
|
/// @return the result value, or null if the value cannot be calculated
|
||||||
|
Result OpLogicalOr(const sem::Type* ty,
|
||||||
|
utils::VectorRef<const sem::Constant*> args,
|
||||||
|
const Source& source);
|
||||||
|
|
||||||
/// Bitwise and operator '&'
|
/// Bitwise and operator '&'
|
||||||
/// @param ty the expression type
|
/// @param ty the expression type
|
||||||
/// @param args the input arguments
|
/// @param args the input arguments
|
||||||
|
@ -749,6 +749,34 @@ INSTANTIATE_TEST_SUITE_P(LessThanEqual,
|
|||||||
OpGreaterThanCases<f32, false>(),
|
OpGreaterThanCases<f32, false>(),
|
||||||
OpGreaterThanCases<f16, false>()))));
|
OpGreaterThanCases<f16, false>()))));
|
||||||
|
|
||||||
|
static std::vector<Case> OpLogicalAndCases() {
|
||||||
|
return {
|
||||||
|
C(true, true, true),
|
||||||
|
C(true, false, false),
|
||||||
|
C(false, true, false),
|
||||||
|
C(false, false, false),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
INSTANTIATE_TEST_SUITE_P(LogicalAnd,
|
||||||
|
ResolverConstEvalBinaryOpTest,
|
||||||
|
testing::Combine( //
|
||||||
|
testing::Values(ast::BinaryOp::kLogicalAnd),
|
||||||
|
testing::ValuesIn(OpLogicalAndCases())));
|
||||||
|
|
||||||
|
static std::vector<Case> OpLogicalOrCases() {
|
||||||
|
return {
|
||||||
|
C(true, true, true),
|
||||||
|
C(true, false, true),
|
||||||
|
C(false, true, true),
|
||||||
|
C(false, false, false),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
INSTANTIATE_TEST_SUITE_P(LogicalOr,
|
||||||
|
ResolverConstEvalBinaryOpTest,
|
||||||
|
testing::Combine( //
|
||||||
|
testing::Values(ast::BinaryOp::kLogicalOr),
|
||||||
|
testing::ValuesIn(OpLogicalOrCases())));
|
||||||
|
|
||||||
static std::vector<Case> OpAndBoolCases() {
|
static std::vector<Case> OpAndBoolCases() {
|
||||||
return {
|
return {
|
||||||
C(true, true, true),
|
C(true, true, true),
|
||||||
|
@ -13918,7 +13918,7 @@ constexpr OverloadInfo kOverloads[] = {
|
|||||||
/* parameters */ &kParameters[746],
|
/* parameters */ &kParameters[746],
|
||||||
/* return matcher indices */ &kMatcherIndices[35],
|
/* return matcher indices */ &kMatcherIndices[35],
|
||||||
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
|
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
|
||||||
/* const eval */ nullptr,
|
/* const eval */ &ConstEval::OpLogicalAnd,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
/* [469] */
|
/* [469] */
|
||||||
@ -13930,7 +13930,7 @@ constexpr OverloadInfo kOverloads[] = {
|
|||||||
/* parameters */ &kParameters[748],
|
/* parameters */ &kParameters[748],
|
||||||
/* return matcher indices */ &kMatcherIndices[35],
|
/* return matcher indices */ &kMatcherIndices[35],
|
||||||
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
|
/* flags */ OverloadFlags(OverloadFlag::kIsOperator, OverloadFlag::kSupportsVertexPipeline, OverloadFlag::kSupportsFragmentPipeline, OverloadFlag::kSupportsComputePipeline),
|
||||||
/* const eval */ nullptr,
|
/* const eval */ &ConstEval::OpLogicalOr,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -212,14 +212,15 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleInit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
||||||
// for(var b = true && false; ; ) {
|
// let t = true;
|
||||||
|
// for(var b = t && false; ; ) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
|
auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -227,7 +228,7 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
@ -263,16 +264,16 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleCond) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
||||||
// for(; true && false; ) {
|
// let t = true;
|
||||||
|
// for(; t && false; ) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
Func("a_statement", {}, ty.void_(), {});
|
Func("a_statement", {}, ty.void_(), {});
|
||||||
|
auto* t = Let("t", Expr(true));
|
||||||
auto* multi_stmt =
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
|
||||||
auto* f = For(nullptr, multi_stmt, nullptr, Block(CallStmt(Call("a_statement"))));
|
auto* f = For(nullptr, multi_stmt, nullptr, Block(CallStmt(Call("a_statement"))));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -281,7 +282,7 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
|||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
while (true) {
|
while (true) {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
@ -316,16 +317,17 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleCont) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
||||||
// for(; ; i = true && false) {
|
// let t = true;
|
||||||
|
// for(; ; i = t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
auto* v = Decl(Var("i", ty.bool_()));
|
auto* v = Decl(Var("i", ty.bool_()));
|
||||||
auto* f = For(nullptr, nullptr, Assign("i", multi_stmt), //
|
auto* f = For(nullptr, nullptr, Assign("i", multi_stmt), //
|
||||||
Block(Return()));
|
Block(Return()));
|
||||||
WrapInFunction(v, f);
|
WrapInFunction(t, v, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -335,7 +337,7 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
|||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
while (true) {
|
while (true) {
|
||||||
return;
|
return;
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
@ -367,20 +369,19 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleInitCondCont) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
||||||
// for(var i = true && false; true && false; i = true && false) {
|
// let t = true;
|
||||||
|
// for(var i = t && false; t && false; i = t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt_a =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt_a = LogicalAnd(t, false);
|
||||||
auto* multi_stmt_b =
|
auto* multi_stmt_b = LogicalAnd(t, false);
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt_c = LogicalAnd(t, false);
|
||||||
auto* multi_stmt_c =
|
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
|
||||||
|
|
||||||
auto* f = For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c), //
|
auto* f = For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c), //
|
||||||
Block(Return()));
|
Block(Return()));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -388,19 +389,19 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
bool i = (tint_tmp);
|
bool i = (tint_tmp);
|
||||||
while (true) {
|
while (true) {
|
||||||
bool tint_tmp_1 = true;
|
bool tint_tmp_1 = t;
|
||||||
if (tint_tmp_1) {
|
if (tint_tmp_1) {
|
||||||
tint_tmp_1 = false;
|
tint_tmp_1 = false;
|
||||||
}
|
}
|
||||||
if (!((tint_tmp_1))) { break; }
|
if (!((tint_tmp_1))) { break; }
|
||||||
return;
|
return;
|
||||||
bool tint_tmp_2 = true;
|
bool tint_tmp_2 = t;
|
||||||
if (tint_tmp_2) {
|
if (tint_tmp_2) {
|
||||||
tint_tmp_2 = false;
|
tint_tmp_2 = false;
|
||||||
}
|
}
|
||||||
@ -449,16 +450,17 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_While_WithContinue) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(GlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
TEST_F(GlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
||||||
// while(true && false) {
|
// let t = true;
|
||||||
|
// while(t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
Func("a_statement", {}, ty.void_(), {});
|
Func("a_statement", {}, ty.void_(), {});
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
auto* f = While(multi_stmt, Block(CallStmt(Call("a_statement"))));
|
auto* f = While(multi_stmt, Block(CallStmt(Call("a_statement"))));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -466,7 +468,7 @@ TEST_F(GlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( while (true) {
|
EXPECT_EQ(gen.result(), R"( while (true) {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
|
@ -211,14 +211,15 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleInit) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
||||||
// for(var b = true && false; ; ) {
|
// let t = true;
|
||||||
|
// for(var b = t && false; ; ) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
|
auto* f = For(Decl(Var("b", multi_stmt)), nullptr, nullptr, Block(Return()));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -226,7 +227,7 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInit) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
@ -260,14 +261,16 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleCond) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
||||||
// for(; true && false; ) {
|
// let t = true;
|
||||||
|
// for(; t && false; ) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
Func("a_statement", {}, ty.void_(), {});
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* t = Let("t", Expr(true));
|
||||||
auto* f = For(nullptr, multi_stmt, nullptr, Block(Return()));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
WrapInFunction(f);
|
auto* f = For(nullptr, multi_stmt, nullptr, Block(CallStmt(Call("a_statement"))));
|
||||||
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -276,12 +279,12 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCond) {
|
|||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
while (true) {
|
while (true) {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
if (!((tint_tmp))) { break; }
|
if (!((tint_tmp))) { break; }
|
||||||
return;
|
a_statement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)");
|
)");
|
||||||
@ -310,15 +313,17 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleCont) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
||||||
// for(; ; i = true && false) {
|
// let t = true;
|
||||||
|
// for(; ; i = t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
auto* v = Decl(Var("i", ty.bool_()));
|
auto* v = Decl(Var("i", ty.bool_()));
|
||||||
auto* f = For(nullptr, nullptr, Assign("i", multi_stmt), Block(Return()));
|
auto* f = For(nullptr, nullptr, Assign("i", multi_stmt), //
|
||||||
WrapInFunction(v, f);
|
Block(Return()));
|
||||||
|
WrapInFunction(t, v, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -328,7 +333,7 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtCont) {
|
|||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
while (true) {
|
while (true) {
|
||||||
return;
|
return;
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
@ -360,20 +365,19 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithSimpleInitCondCont) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
||||||
// for(var i = true && false; true && false; i = true && false) {
|
// let t = true;
|
||||||
|
// for(var i = t && false; t && false; i = t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt_a =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt_a = LogicalAnd(t, false);
|
||||||
auto* multi_stmt_b =
|
auto* multi_stmt_b = LogicalAnd(t, false);
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt_c = LogicalAnd(t, false);
|
||||||
auto* multi_stmt_c =
|
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
|
||||||
|
|
||||||
auto* f =
|
auto* f = For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c), //
|
||||||
For(Decl(Var("i", multi_stmt_a)), multi_stmt_b, Assign("i", multi_stmt_c), Block(Return()));
|
Block(Return()));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -381,19 +385,19 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_ForLoopWithMultiStmtInitCondCont) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( {
|
EXPECT_EQ(gen.result(), R"( {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
bool i = (tint_tmp);
|
bool i = (tint_tmp);
|
||||||
while (true) {
|
while (true) {
|
||||||
bool tint_tmp_1 = true;
|
bool tint_tmp_1 = t;
|
||||||
if (tint_tmp_1) {
|
if (tint_tmp_1) {
|
||||||
tint_tmp_1 = false;
|
tint_tmp_1 = false;
|
||||||
}
|
}
|
||||||
if (!((tint_tmp_1))) { break; }
|
if (!((tint_tmp_1))) { break; }
|
||||||
return;
|
return;
|
||||||
bool tint_tmp_2 = true;
|
bool tint_tmp_2 = t;
|
||||||
if (tint_tmp_2) {
|
if (tint_tmp_2) {
|
||||||
tint_tmp_2 = false;
|
tint_tmp_2 = false;
|
||||||
}
|
}
|
||||||
@ -442,14 +446,17 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_While_WithContinue) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(HlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
TEST_F(HlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
||||||
// while(true && false) {
|
// let t = true;
|
||||||
|
// while(t && false) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
Func("a_statement", {}, ty.void_(), {});
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
|
||||||
auto* f = While(multi_stmt, Block(Return()));
|
auto* t = Let("t", Expr(true));
|
||||||
WrapInFunction(f);
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
|
auto* f = While(multi_stmt, Block(CallStmt(Call("a_statement"))));
|
||||||
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
@ -457,12 +464,12 @@ TEST_F(HlslGeneratorImplTest_Loop, Emit_WhileWithMultiStmtCond) {
|
|||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( while (true) {
|
EXPECT_EQ(gen.result(), R"( while (true) {
|
||||||
bool tint_tmp = true;
|
bool tint_tmp = t;
|
||||||
if (tint_tmp) {
|
if (tint_tmp) {
|
||||||
tint_tmp = false;
|
tint_tmp = false;
|
||||||
}
|
}
|
||||||
if (!((tint_tmp))) { break; }
|
if (!((tint_tmp))) { break; }
|
||||||
return;
|
a_statement();
|
||||||
}
|
}
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
@ -419,17 +419,18 @@ TEST_F(MslGeneratorImplTest, Emit_WhileWithMultiCond) {
|
|||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
auto* multi_stmt =
|
auto* t = Let("t", Expr(true));
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
auto* multi_stmt = LogicalAnd(t, false);
|
||||||
|
// create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), Expr(false));
|
||||||
auto* f = While(multi_stmt, Block(Return()));
|
auto* f = While(multi_stmt, Block(Return()));
|
||||||
WrapInFunction(f);
|
WrapInFunction(t, f);
|
||||||
|
|
||||||
GeneratorImpl& gen = Build();
|
GeneratorImpl& gen = Build();
|
||||||
|
|
||||||
gen.increment_indent();
|
gen.increment_indent();
|
||||||
|
|
||||||
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
ASSERT_TRUE(gen.EmitStatement(f)) << gen.error();
|
||||||
EXPECT_EQ(gen.result(), R"( while((true && false)) {
|
EXPECT_EQ(gen.result(), R"( while((t && false)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
)");
|
)");
|
||||||
|
@ -1071,38 +1071,43 @@ TEST_F(BuilderTest, Binary_logicalOr_Nested_LogicalAnd) {
|
|||||||
// a || (b && c)
|
// a || (b && c)
|
||||||
// From: crbug.com/tint/355
|
// From: crbug.com/tint/355
|
||||||
|
|
||||||
|
auto* t = Let("t", Expr(true));
|
||||||
|
auto* f = Let("f", Expr(false));
|
||||||
|
|
||||||
auto* logical_and_expr =
|
auto* logical_and_expr =
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), Expr(false));
|
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), Expr(f));
|
||||||
|
|
||||||
auto* expr =
|
auto* expr =
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(true), logical_and_expr);
|
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(t), logical_and_expr);
|
||||||
|
|
||||||
WrapInFunction(expr);
|
WrapInFunction(t, f, expr);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
|
||||||
b.push_function(Function{});
|
b.push_function(Function{});
|
||||||
|
ASSERT_TRUE(b.GenerateFunctionVariable(t)) << b.error();
|
||||||
|
ASSERT_TRUE(b.GenerateFunctionVariable(f)) << b.error();
|
||||||
b.GenerateLabel(b.next_id());
|
b.GenerateLabel(b.next_id());
|
||||||
|
|
||||||
EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
|
EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
|
||||||
EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
|
EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
|
||||||
%3 = OpConstantTrue %2
|
%2 = OpConstantTrue %1
|
||||||
%8 = OpConstantNull %2
|
%3 = OpConstantNull %1
|
||||||
)");
|
)");
|
||||||
EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
|
EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
|
||||||
R"(%1 = OpLabel
|
R"(%4 = OpLabel
|
||||||
OpSelectionMerge %4 None
|
OpSelectionMerge %5 None
|
||||||
OpBranchConditional %3 %4 %5
|
OpBranchConditional %2 %5 %6
|
||||||
%5 = OpLabel
|
|
||||||
OpSelectionMerge %6 None
|
|
||||||
OpBranchConditional %3 %7 %6
|
|
||||||
%7 = OpLabel
|
|
||||||
OpBranch %6
|
|
||||||
%6 = OpLabel
|
%6 = OpLabel
|
||||||
%9 = OpPhi %2 %3 %5 %8 %7
|
OpSelectionMerge %7 None
|
||||||
OpBranch %4
|
OpBranchConditional %2 %8 %7
|
||||||
%4 = OpLabel
|
%8 = OpLabel
|
||||||
%10 = OpPhi %2 %3 %1 %9 %6
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
|
%9 = OpPhi %1 %2 %6 %3 %8
|
||||||
|
OpBranch %5
|
||||||
|
%5 = OpLabel
|
||||||
|
%10 = OpPhi %1 %2 %4 %9 %7
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1111,38 +1116,43 @@ TEST_F(BuilderTest, Binary_logicalAnd_Nested_LogicalOr) {
|
|||||||
// a && (b || c)
|
// a && (b || c)
|
||||||
// From: crbug.com/tint/355
|
// From: crbug.com/tint/355
|
||||||
|
|
||||||
|
auto* t = Let("t", Expr(true));
|
||||||
|
auto* f = Let("f", Expr(false));
|
||||||
|
|
||||||
auto* logical_or_expr =
|
auto* logical_or_expr =
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(true), Expr(false));
|
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalOr, Expr(t), Expr(f));
|
||||||
|
|
||||||
auto* expr =
|
auto* expr =
|
||||||
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(true), logical_or_expr);
|
create<ast::BinaryExpression>(ast::BinaryOp::kLogicalAnd, Expr(t), logical_or_expr);
|
||||||
|
|
||||||
WrapInFunction(expr);
|
WrapInFunction(t, f, expr);
|
||||||
|
|
||||||
spirv::Builder& b = Build();
|
spirv::Builder& b = Build();
|
||||||
|
|
||||||
b.push_function(Function{});
|
b.push_function(Function{});
|
||||||
|
ASSERT_TRUE(b.GenerateFunctionVariable(t)) << b.error();
|
||||||
|
ASSERT_TRUE(b.GenerateFunctionVariable(f)) << b.error();
|
||||||
b.GenerateLabel(b.next_id());
|
b.GenerateLabel(b.next_id());
|
||||||
|
|
||||||
EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
|
EXPECT_EQ(b.GenerateBinaryExpression(expr), 10u) << b.error();
|
||||||
EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeBool
|
EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
|
||||||
%3 = OpConstantTrue %2
|
%2 = OpConstantTrue %1
|
||||||
%8 = OpConstantNull %2
|
%3 = OpConstantNull %1
|
||||||
)");
|
)");
|
||||||
EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
|
EXPECT_EQ(DumpInstructions(b.functions()[0].instructions()),
|
||||||
R"(%1 = OpLabel
|
R"(%4 = OpLabel
|
||||||
OpSelectionMerge %4 None
|
OpSelectionMerge %5 None
|
||||||
OpBranchConditional %3 %5 %4
|
OpBranchConditional %2 %6 %5
|
||||||
%5 = OpLabel
|
|
||||||
OpSelectionMerge %6 None
|
|
||||||
OpBranchConditional %3 %6 %7
|
|
||||||
%7 = OpLabel
|
|
||||||
OpBranch %6
|
|
||||||
%6 = OpLabel
|
%6 = OpLabel
|
||||||
%9 = OpPhi %2 %3 %5 %8 %7
|
OpSelectionMerge %7 None
|
||||||
OpBranch %4
|
OpBranchConditional %2 %7 %8
|
||||||
%4 = OpLabel
|
%8 = OpLabel
|
||||||
%10 = OpPhi %2 %3 %1 %9 %6
|
OpBranch %7
|
||||||
|
%7 = OpLabel
|
||||||
|
%9 = OpPhi %1 %2 %6 %3 %8
|
||||||
|
OpBranch %5
|
||||||
|
%5 = OpLabel
|
||||||
|
%10 = OpPhi %1 %2 %4 %9 %7
|
||||||
)");
|
)");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,19 +4,7 @@ void unused_entry_point() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bool2 v2 = (true).xx;
|
||||||
if (!tint_tmp) {
|
bool3 v3 = (true).xxx;
|
||||||
tint_tmp = false;
|
bool4 v4 = (true).xxxx;
|
||||||
}
|
|
||||||
bool2 v2 = bool2(((tint_tmp)).xx);
|
|
||||||
bool tint_tmp_1 = true;
|
|
||||||
if (!tint_tmp_1) {
|
|
||||||
tint_tmp_1 = false;
|
|
||||||
}
|
|
||||||
bool3 v3 = bool3(((tint_tmp_1)).xxx);
|
|
||||||
bool tint_tmp_2 = true;
|
|
||||||
if (!tint_tmp_2) {
|
|
||||||
tint_tmp_2 = false;
|
|
||||||
}
|
|
||||||
bool4 v4 = bool4(((tint_tmp_2)).xxxx);
|
|
||||||
}
|
}
|
||||||
|
@ -4,19 +4,7 @@ void unused_entry_point() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bool2 v2 = (true).xx;
|
||||||
if (!tint_tmp) {
|
bool3 v3 = (true).xxx;
|
||||||
tint_tmp = false;
|
bool4 v4 = (true).xxxx;
|
||||||
}
|
|
||||||
bool2 v2 = bool2(((tint_tmp)).xx);
|
|
||||||
bool tint_tmp_1 = true;
|
|
||||||
if (!tint_tmp_1) {
|
|
||||||
tint_tmp_1 = false;
|
|
||||||
}
|
|
||||||
bool3 v3 = bool3(((tint_tmp_1)).xxx);
|
|
||||||
bool tint_tmp_2 = true;
|
|
||||||
if (!tint_tmp_2) {
|
|
||||||
tint_tmp_2 = false;
|
|
||||||
}
|
|
||||||
bool4 v4 = bool4(((tint_tmp_2)).xxxx);
|
|
||||||
}
|
}
|
||||||
|
@ -5,20 +5,8 @@ void unused_entry_point() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bvec2 v2 = bvec2(true);
|
||||||
if (!tint_tmp) {
|
bvec3 v3 = bvec3(true);
|
||||||
tint_tmp = false;
|
bvec4 v4 = bvec4(true);
|
||||||
}
|
|
||||||
bvec2 v2 = bvec2((tint_tmp));
|
|
||||||
bool tint_tmp_1 = true;
|
|
||||||
if (!tint_tmp_1) {
|
|
||||||
tint_tmp_1 = false;
|
|
||||||
}
|
|
||||||
bvec3 v3 = bvec3((tint_tmp_1));
|
|
||||||
bool tint_tmp_2 = true;
|
|
||||||
if (!tint_tmp_2) {
|
|
||||||
tint_tmp_2 = false;
|
|
||||||
}
|
|
||||||
bvec4 v4 = bvec4((tint_tmp_2));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
void f() {
|
void f() {
|
||||||
bool2 v2 = bool2((true || false));
|
bool2 v2 = bool2(true);
|
||||||
bool3 v3 = bool3((true || false));
|
bool3 v3 = bool3(true);
|
||||||
bool4 v4 = bool4((true || false));
|
bool4 v4 = bool4(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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: 34
|
; Bound: 24
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
@ -17,47 +17,28 @@
|
|||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%v2bool = OpTypeVector %bool 2
|
%v2bool = OpTypeVector %bool 2
|
||||||
%true = OpConstantTrue %bool
|
%true = OpConstantTrue %bool
|
||||||
%12 = OpConstantNull %bool
|
%10 = OpConstantComposite %v2bool %true %true
|
||||||
%_ptr_Function_v2bool = OpTypePointer Function %v2bool
|
%_ptr_Function_v2bool = OpTypePointer Function %v2bool
|
||||||
%17 = OpConstantNull %v2bool
|
%13 = OpConstantNull %v2bool
|
||||||
%v3bool = OpTypeVector %bool 3
|
%v3bool = OpTypeVector %bool 3
|
||||||
|
%15 = OpConstantComposite %v3bool %true %true %true
|
||||||
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
|
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
|
||||||
%25 = OpConstantNull %v3bool
|
%18 = OpConstantNull %v3bool
|
||||||
%v4bool = OpTypeVector %bool 4
|
%v4bool = OpTypeVector %bool 4
|
||||||
|
%20 = OpConstantComposite %v4bool %true %true %true %true
|
||||||
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
|
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
|
||||||
%33 = OpConstantNull %v4bool
|
%23 = OpConstantNull %v4bool
|
||||||
%unused_entry_point = OpFunction %void None %1
|
%unused_entry_point = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
%f = OpFunction %void None %1
|
%f = OpFunction %void None %1
|
||||||
%6 = OpLabel
|
%6 = OpLabel
|
||||||
%v2 = OpVariable %_ptr_Function_v2bool Function %17
|
%v2 = OpVariable %_ptr_Function_v2bool Function %13
|
||||||
%v3 = OpVariable %_ptr_Function_v3bool Function %25
|
%v3 = OpVariable %_ptr_Function_v3bool Function %18
|
||||||
%v4 = OpVariable %_ptr_Function_v4bool Function %33
|
%v4 = OpVariable %_ptr_Function_v4bool Function %23
|
||||||
OpSelectionMerge %10 None
|
OpStore %v2 %10
|
||||||
OpBranchConditional %true %10 %11
|
OpStore %v3 %15
|
||||||
%11 = OpLabel
|
OpStore %v4 %20
|
||||||
OpBranch %10
|
|
||||||
%10 = OpLabel
|
|
||||||
%13 = OpPhi %bool %true %6 %12 %11
|
|
||||||
%14 = OpCompositeConstruct %v2bool %13 %13
|
|
||||||
OpStore %v2 %14
|
|
||||||
OpSelectionMerge %19 None
|
|
||||||
OpBranchConditional %true %19 %20
|
|
||||||
%20 = OpLabel
|
|
||||||
OpBranch %19
|
|
||||||
%19 = OpLabel
|
|
||||||
%21 = OpPhi %bool %true %10 %12 %20
|
|
||||||
%22 = OpCompositeConstruct %v3bool %21 %21 %21
|
|
||||||
OpStore %v3 %22
|
|
||||||
OpSelectionMerge %27 None
|
|
||||||
OpBranchConditional %true %27 %28
|
|
||||||
%28 = OpLabel
|
|
||||||
OpBranch %27
|
|
||||||
%27 = OpLabel
|
|
||||||
%29 = OpPhi %bool %true %19 %12 %28
|
|
||||||
%30 = OpCompositeConstruct %v4bool %29 %29 %29 %29
|
|
||||||
OpStore %v4 %30
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -4,11 +4,7 @@ void unused_entry_point() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bool v = true;
|
||||||
if (!tint_tmp) {
|
|
||||||
tint_tmp = false;
|
|
||||||
}
|
|
||||||
bool v = (tint_tmp);
|
|
||||||
bool2 v2 = bool2((v).xx);
|
bool2 v2 = bool2((v).xx);
|
||||||
bool3 v3 = bool3((v).xxx);
|
bool3 v3 = bool3((v).xxx);
|
||||||
bool4 v4 = bool4((v).xxxx);
|
bool4 v4 = bool4((v).xxxx);
|
||||||
|
@ -4,11 +4,7 @@ void unused_entry_point() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bool v = true;
|
||||||
if (!tint_tmp) {
|
|
||||||
tint_tmp = false;
|
|
||||||
}
|
|
||||||
bool v = (tint_tmp);
|
|
||||||
bool2 v2 = bool2((v).xx);
|
bool2 v2 = bool2((v).xx);
|
||||||
bool3 v3 = bool3((v).xxx);
|
bool3 v3 = bool3((v).xxx);
|
||||||
bool4 v4 = bool4((v).xxxx);
|
bool4 v4 = bool4((v).xxxx);
|
||||||
|
@ -5,11 +5,7 @@ void unused_entry_point() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
void f() {
|
void f() {
|
||||||
bool tint_tmp = true;
|
bool v = true;
|
||||||
if (!tint_tmp) {
|
|
||||||
tint_tmp = false;
|
|
||||||
}
|
|
||||||
bool v = (tint_tmp);
|
|
||||||
bvec2 v2 = bvec2(v);
|
bvec2 v2 = bvec2(v);
|
||||||
bvec3 v3 = bvec3(v);
|
bvec3 v3 = bvec3(v);
|
||||||
bvec4 v4 = bvec4(v);
|
bvec4 v4 = bvec4(v);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
void f() {
|
void f() {
|
||||||
bool v = (true || false);
|
bool v = true;
|
||||||
bool2 v2 = bool2(v);
|
bool2 v2 = bool2(v);
|
||||||
bool3 v3 = bool3(v);
|
bool3 v3 = bool3(v);
|
||||||
bool4 v4 = bool4(v);
|
bool4 v4 = bool4(v);
|
||||||
|
@ -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: 30
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
@ -17,17 +17,17 @@
|
|||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%true = OpConstantTrue %bool
|
%true = OpConstantTrue %bool
|
||||||
%11 = OpConstantNull %bool
|
|
||||||
%_ptr_Function_bool = OpTypePointer Function %bool
|
%_ptr_Function_bool = OpTypePointer Function %bool
|
||||||
|
%11 = OpConstantNull %bool
|
||||||
%v2bool = OpTypeVector %bool 2
|
%v2bool = OpTypeVector %bool 2
|
||||||
%_ptr_Function_v2bool = OpTypePointer Function %v2bool
|
%_ptr_Function_v2bool = OpTypePointer Function %v2bool
|
||||||
%20 = OpConstantNull %v2bool
|
%17 = OpConstantNull %v2bool
|
||||||
%v3bool = OpTypeVector %bool 3
|
%v3bool = OpTypeVector %bool 3
|
||||||
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
|
%_ptr_Function_v3bool = OpTypePointer Function %v3bool
|
||||||
%26 = OpConstantNull %v3bool
|
%23 = OpConstantNull %v3bool
|
||||||
%v4bool = OpTypeVector %bool 4
|
%v4bool = OpTypeVector %bool 4
|
||||||
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
|
%_ptr_Function_v4bool = OpTypePointer Function %v4bool
|
||||||
%32 = OpConstantNull %v4bool
|
%29 = OpConstantNull %v4bool
|
||||||
%unused_entry_point = OpFunction %void None %1
|
%unused_entry_point = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
OpReturn
|
OpReturn
|
||||||
@ -35,24 +35,18 @@
|
|||||||
%f = OpFunction %void None %1
|
%f = OpFunction %void None %1
|
||||||
%6 = OpLabel
|
%6 = OpLabel
|
||||||
%v = OpVariable %_ptr_Function_bool Function %11
|
%v = OpVariable %_ptr_Function_bool Function %11
|
||||||
%v2 = OpVariable %_ptr_Function_v2bool Function %20
|
%v2 = OpVariable %_ptr_Function_v2bool Function %17
|
||||||
%v3 = OpVariable %_ptr_Function_v3bool Function %26
|
%v3 = OpVariable %_ptr_Function_v3bool Function %23
|
||||||
%v4 = OpVariable %_ptr_Function_v4bool Function %32
|
%v4 = OpVariable %_ptr_Function_v4bool Function %29
|
||||||
OpSelectionMerge %9 None
|
OpStore %v %true
|
||||||
OpBranchConditional %true %9 %10
|
%13 = OpLoad %bool %v
|
||||||
%10 = OpLabel
|
%14 = OpCompositeConstruct %v2bool %13 %13
|
||||||
OpBranch %9
|
OpStore %v2 %14
|
||||||
%9 = OpLabel
|
%19 = OpLoad %bool %v
|
||||||
%12 = OpPhi %bool %true %6 %11 %10
|
%20 = OpCompositeConstruct %v3bool %19 %19 %19
|
||||||
OpStore %v %12
|
OpStore %v3 %20
|
||||||
%16 = OpLoad %bool %v
|
%25 = OpLoad %bool %v
|
||||||
%17 = OpCompositeConstruct %v2bool %16 %16
|
%26 = OpCompositeConstruct %v4bool %25 %25 %25 %25
|
||||||
OpStore %v2 %17
|
OpStore %v4 %26
|
||||||
%22 = OpLoad %bool %v
|
|
||||||
%23 = OpCompositeConstruct %v3bool %22 %22 %22
|
|
||||||
OpStore %v3 %23
|
|
||||||
%28 = OpLoad %bool %v
|
|
||||||
%29 = OpCompositeConstruct %v4bool %28 %28 %28 %28
|
|
||||||
OpStore %v4 %29
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
if ((false && true)) {
|
if (false) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -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: 13
|
; Bound: 9
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
@ -12,7 +12,6 @@
|
|||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%6 = OpConstantNull %bool
|
%6 = OpConstantNull %bool
|
||||||
%true = OpConstantTrue %bool
|
|
||||||
%main = OpFunction %void None %1
|
%main = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
OpSelectionMerge %7 None
|
OpSelectionMerge %7 None
|
||||||
@ -20,11 +19,5 @@
|
|||||||
%8 = OpLabel
|
%8 = OpLabel
|
||||||
OpBranch %7
|
OpBranch %7
|
||||||
%7 = OpLabel
|
%7 = OpLabel
|
||||||
%10 = OpPhi %bool %6 %4 %true %8
|
|
||||||
OpSelectionMerge %11 None
|
|
||||||
OpBranchConditional %10 %12 %11
|
|
||||||
%12 = OpLabel
|
|
||||||
OpBranch %11
|
|
||||||
%11 = OpLabel
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
if ((false && true)) {
|
if (false) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -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: 13
|
; Bound: 9
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
@ -12,7 +12,6 @@
|
|||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%6 = OpConstantNull %bool
|
%6 = OpConstantNull %bool
|
||||||
%true = OpConstantTrue %bool
|
|
||||||
%main = OpFunction %void None %1
|
%main = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
OpSelectionMerge %7 None
|
OpSelectionMerge %7 None
|
||||||
@ -20,11 +19,5 @@
|
|||||||
%8 = OpLabel
|
%8 = OpLabel
|
||||||
OpBranch %7
|
OpBranch %7
|
||||||
%7 = OpLabel
|
%7 = OpLabel
|
||||||
%10 = OpPhi %bool %6 %4 %true %8
|
|
||||||
OpSelectionMerge %11 None
|
|
||||||
OpBranchConditional %10 %12 %11
|
|
||||||
%12 = OpLabel
|
|
||||||
OpBranch %11
|
|
||||||
%11 = OpLabel
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,6 @@
|
|||||||
[numthreads(1, 1, 1)]
|
[numthreads(1, 1, 1)]
|
||||||
void main() {
|
void main() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,7 @@
|
|||||||
#version 310 es
|
#version 310 es
|
||||||
|
|
||||||
void tint_symbol() {
|
void tint_symbol() {
|
||||||
bool tint_tmp = false;
|
if (false) {
|
||||||
if (tint_tmp) {
|
|
||||||
tint_tmp = true;
|
|
||||||
}
|
|
||||||
if ((tint_tmp)) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
using namespace metal;
|
using namespace metal;
|
||||||
kernel void tint_symbol() {
|
kernel void tint_symbol() {
|
||||||
if ((false && true)) {
|
if (false) {
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -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: 13
|
; Bound: 9
|
||||||
; Schema: 0
|
; Schema: 0
|
||||||
OpCapability Shader
|
OpCapability Shader
|
||||||
OpMemoryModel Logical GLSL450
|
OpMemoryModel Logical GLSL450
|
||||||
@ -12,7 +12,6 @@
|
|||||||
%1 = OpTypeFunction %void
|
%1 = OpTypeFunction %void
|
||||||
%bool = OpTypeBool
|
%bool = OpTypeBool
|
||||||
%6 = OpConstantNull %bool
|
%6 = OpConstantNull %bool
|
||||||
%true = OpConstantTrue %bool
|
|
||||||
%main = OpFunction %void None %1
|
%main = OpFunction %void None %1
|
||||||
%4 = OpLabel
|
%4 = OpLabel
|
||||||
OpSelectionMerge %7 None
|
OpSelectionMerge %7 None
|
||||||
@ -20,11 +19,5 @@
|
|||||||
%8 = OpLabel
|
%8 = OpLabel
|
||||||
OpBranch %7
|
OpBranch %7
|
||||||
%7 = OpLabel
|
%7 = OpLabel
|
||||||
%10 = OpPhi %bool %6 %4 %true %8
|
|
||||||
OpSelectionMerge %11 None
|
|
||||||
OpBranchConditional %10 %12 %11
|
|
||||||
%12 = OpLabel
|
|
||||||
OpBranch %11
|
|
||||||
%11 = OpLabel
|
|
||||||
OpReturn
|
OpReturn
|
||||||
OpFunctionEnd
|
OpFunctionEnd
|
||||||
|
Loading…
x
Reference in New Issue
Block a user