blob: 218db86919ae598f5847e0cc4ff20efc9d5798d3 [file] [log] [blame]
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001// Copyright 2020 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "src/tint/writer/spirv/spv_dump.h"
16#include "src/tint/writer/spirv/test_helper.h"
17
Ben Clayton0ce9ab02022-05-05 20:23:40 +000018using namespace tint::number_suffixes; // NOLINT
19
dan sinclair411d0652022-04-07 14:16:34 +000020namespace tint::writer::spirv {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000021
22using BuilderTest = TestHelper;
23
24TEST_F(BuilderTest, Literal_Bool_True) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000025 auto* b_true = create<ast::BoolLiteralExpression>(true);
26 WrapInFunction(b_true);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000027
dan sinclair41e4d9a2022-05-01 14:40:55 +000028 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000029
dan sinclair41e4d9a2022-05-01 14:40:55 +000030 auto id = b.GenerateLiteralIfNeeded(nullptr, b_true);
31 ASSERT_FALSE(b.has_error()) << b.error();
32 EXPECT_EQ(2u, id);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000033
dan sinclair41e4d9a2022-05-01 14:40:55 +000034 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
Ryan Harrisondbc13af2022-02-21 15:19:07 +000035%2 = OpConstantTrue %1
36)");
37}
38
39TEST_F(BuilderTest, Literal_Bool_False) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000040 auto* b_false = create<ast::BoolLiteralExpression>(false);
41 WrapInFunction(b_false);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000042
dan sinclair41e4d9a2022-05-01 14:40:55 +000043 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000044
dan sinclair41e4d9a2022-05-01 14:40:55 +000045 auto id = b.GenerateLiteralIfNeeded(nullptr, b_false);
46 ASSERT_FALSE(b.has_error()) << b.error();
47 EXPECT_EQ(2u, id);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000048
dan sinclair41e4d9a2022-05-01 14:40:55 +000049 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
Ryan Harrisondbc13af2022-02-21 15:19:07 +000050%2 = OpConstantFalse %1
51)");
52}
53
54TEST_F(BuilderTest, Literal_Bool_Dedup) {
dan sinclair41e4d9a2022-05-01 14:40:55 +000055 auto* b_true = create<ast::BoolLiteralExpression>(true);
56 auto* b_false = create<ast::BoolLiteralExpression>(false);
57 WrapInFunction(b_true, b_false);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000058
dan sinclair41e4d9a2022-05-01 14:40:55 +000059 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000060
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_true), 0u);
62 ASSERT_FALSE(b.has_error()) << b.error();
63 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_false), 0u);
64 ASSERT_FALSE(b.has_error()) << b.error();
65 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, b_true), 0u);
66 ASSERT_FALSE(b.has_error()) << b.error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000067
dan sinclair41e4d9a2022-05-01 14:40:55 +000068 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeBool
Ryan Harrisondbc13af2022-02-21 15:19:07 +000069%2 = OpConstantTrue %1
70%3 = OpConstantFalse %1
71)");
72}
73
74TEST_F(BuilderTest, Literal_I32) {
Ben Clayton636e3d02022-05-10 16:02:06 +000075 auto* i = Expr(-23_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +000076 WrapInFunction(i);
77 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000078
dan sinclair41e4d9a2022-05-01 14:40:55 +000079 auto id = b.GenerateLiteralIfNeeded(nullptr, i);
80 ASSERT_FALSE(b.has_error()) << b.error();
81 EXPECT_EQ(2u, id);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000082
dan sinclair41e4d9a2022-05-01 14:40:55 +000083 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
Ryan Harrisondbc13af2022-02-21 15:19:07 +000084%2 = OpConstant %1 -23
85)");
86}
87
88TEST_F(BuilderTest, Literal_I32_Dedup) {
Ben Clayton636e3d02022-05-10 16:02:06 +000089 auto* i1 = Expr(-23_i);
90 auto* i2 = Expr(-23_i);
dan sinclair41e4d9a2022-05-01 14:40:55 +000091 WrapInFunction(i1, i2);
Ryan Harrisondbc13af2022-02-21 15:19:07 +000092
dan sinclair41e4d9a2022-05-01 14:40:55 +000093 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000094
dan sinclair41e4d9a2022-05-01 14:40:55 +000095 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
96 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
97 ASSERT_FALSE(b.has_error()) << b.error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000098
dan sinclair41e4d9a2022-05-01 14:40:55 +000099 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 1
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000100%2 = OpConstant %1 -23
101)");
102}
103
104TEST_F(BuilderTest, Literal_U32) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000105 auto* i = Expr(23_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000106 WrapInFunction(i);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000107
dan sinclair41e4d9a2022-05-01 14:40:55 +0000108 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000109
dan sinclair41e4d9a2022-05-01 14:40:55 +0000110 auto id = b.GenerateLiteralIfNeeded(nullptr, i);
111 ASSERT_FALSE(b.has_error()) << b.error();
112 EXPECT_EQ(2u, id);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000113
dan sinclair41e4d9a2022-05-01 14:40:55 +0000114 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000115%2 = OpConstant %1 23
116)");
117}
118
119TEST_F(BuilderTest, Literal_U32_Dedup) {
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000120 auto* i1 = Expr(23_u);
121 auto* i2 = Expr(23_u);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000122 WrapInFunction(i1, i2);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000123
dan sinclair41e4d9a2022-05-01 14:40:55 +0000124 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000125
dan sinclair41e4d9a2022-05-01 14:40:55 +0000126 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
127 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
128 ASSERT_FALSE(b.has_error()) << b.error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000129
dan sinclair41e4d9a2022-05-01 14:40:55 +0000130 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeInt 32 0
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000131%2 = OpConstant %1 23
132)");
133}
134
135TEST_F(BuilderTest, Literal_F32) {
Ben Clayton41285aa2022-05-10 14:55:34 +0000136 auto* i = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kF);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000137 WrapInFunction(i);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000138
dan sinclair41e4d9a2022-05-01 14:40:55 +0000139 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000140
dan sinclair41e4d9a2022-05-01 14:40:55 +0000141 auto id = b.GenerateLiteralIfNeeded(nullptr, i);
142 ASSERT_FALSE(b.has_error()) << b.error();
143 EXPECT_EQ(2u, id);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000144
dan sinclair41e4d9a2022-05-01 14:40:55 +0000145 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000146%2 = OpConstant %1 23.2450008
147)");
148}
149
150TEST_F(BuilderTest, Literal_F32_Dedup) {
Ben Clayton41285aa2022-05-10 14:55:34 +0000151 auto* i1 = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kF);
152 auto* i2 = create<ast::FloatLiteralExpression>(23.245, ast::FloatLiteralExpression::Suffix::kF);
dan sinclair41e4d9a2022-05-01 14:40:55 +0000153 WrapInFunction(i1, i2);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000154
dan sinclair41e4d9a2022-05-01 14:40:55 +0000155 spirv::Builder& b = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000156
dan sinclair41e4d9a2022-05-01 14:40:55 +0000157 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i1), 0u);
158 ASSERT_NE(b.GenerateLiteralIfNeeded(nullptr, i2), 0u);
159 ASSERT_FALSE(b.has_error()) << b.error();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000160
dan sinclair41e4d9a2022-05-01 14:40:55 +0000161 EXPECT_EQ(DumpInstructions(b.types()), R"(%1 = OpTypeFloat 32
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000162%2 = OpConstant %1 23.2450008
163)");
164}
165
dan sinclair411d0652022-04-07 14:16:34 +0000166} // namespace tint::writer::spirv