--- /dev/null
+// Copyright (c) 2017 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <gmock/gmock.h>
+
+#include "spirv-tools/libspirv.hpp"
+#include "spirv-tools/optimizer.hpp"
+
+#include "pass_fixture.h"
+
+namespace {
+
+using spvtools::CreateNullPass;
+using spvtools::CreateStripDebugInfoPass;
+using spvtools::Optimizer;
+using spvtools::SpirvTools;
+using ::testing::Eq;
+
+TEST(Optimizer, CanRunNullPassWithDistinctInputOutputVectors) {
+ SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+ std::vector<uint32_t> binary_in;
+ tools.Assemble("OpName %foo \"foo\"\n%foo = OpTypeVoid", &binary_in);
+
+ Optimizer opt(SPV_ENV_UNIVERSAL_1_0);
+ opt.RegisterPass(CreateNullPass());
+ std::vector<uint32_t> binary_out;
+ opt.Run(binary_in.data(), binary_in.size(), &binary_out);
+
+ std::string disassembly;
+ tools.Disassemble(binary_out.data(), binary_out.size(), &disassembly);
+ EXPECT_THAT(disassembly, Eq("OpName %foo \"foo\"\n%foo = OpTypeVoid\n"));
+}
+
+TEST(Optimizer, CanRunTransformingPassWithDistinctInputOutputVectors) {
+ SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+ std::vector<uint32_t> binary_in;
+ tools.Assemble("OpName %foo \"foo\"\n%foo = OpTypeVoid", &binary_in);
+
+ Optimizer opt(SPV_ENV_UNIVERSAL_1_0);
+ opt.RegisterPass(CreateStripDebugInfoPass());
+ std::vector<uint32_t> binary_out;
+ opt.Run(binary_in.data(), binary_in.size(), &binary_out);
+
+ std::string disassembly;
+ tools.Disassemble(binary_out.data(), binary_out.size(), &disassembly);
+ EXPECT_THAT(disassembly, Eq("%void = OpTypeVoid\n"));
+}
+
+TEST(Optimizer, CanRunNullPassWithAliasedVectors) {
+ SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+ std::vector<uint32_t> binary;
+ tools.Assemble("OpName %foo \"foo\"\n%foo = OpTypeVoid", &binary);
+
+ Optimizer opt(SPV_ENV_UNIVERSAL_1_0);
+ opt.RegisterPass(CreateNullPass());
+ opt.Run(binary.data(), binary.size(), &binary); // This is the key.
+
+ std::string disassembly;
+ tools.Disassemble(binary.data(), binary.size(), &disassembly);
+ EXPECT_THAT(disassembly, Eq("OpName %foo \"foo\"\n%foo = OpTypeVoid\n"));
+}
+
+TEST(Optimizer, CanRunNullPassWithAliasedVectorDataButDifferentSize) {
+ SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+ std::vector<uint32_t> binary;
+ tools.Assemble("OpName %foo \"foo\"\n%foo = OpTypeVoid", &binary);
+
+ Optimizer opt(SPV_ENV_UNIVERSAL_1_0);
+ opt.RegisterPass(CreateNullPass());
+ auto orig_size = binary.size();
+ // Now change the size. Add a word that will be ignored
+ // by the optimizer.
+ binary.push_back(42);
+ EXPECT_THAT(orig_size + 1, Eq(binary.size()));
+ opt.Run(binary.data(), orig_size, &binary); // This is the key.
+ // The binary vector should have been rewritten.
+ EXPECT_THAT(binary.size(), Eq(orig_size));
+
+ std::string disassembly;
+ tools.Disassemble(binary.data(), binary.size(), &disassembly);
+ EXPECT_THAT(disassembly, Eq("OpName %foo \"foo\"\n%foo = OpTypeVoid\n"));
+}
+
+TEST(Optimizer, CanRunTransformingPassWithAliasedVectors) {
+ SpirvTools tools(SPV_ENV_UNIVERSAL_1_0);
+ std::vector<uint32_t> binary;
+ tools.Assemble("OpName %foo \"foo\"\n%foo = OpTypeVoid", &binary);
+
+ Optimizer opt(SPV_ENV_UNIVERSAL_1_0);
+ opt.RegisterPass(CreateStripDebugInfoPass());
+ opt.Run(binary.data(), binary.size(), &binary); // This is the key
+
+ std::string disassembly;
+ tools.Disassemble(binary.data(), binary.size(), &disassembly);
+ EXPECT_THAT(disassembly, Eq("%void = OpTypeVoid\n"));
+}
+
+} // namespace