mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2025-01-05 22:41:07 +00:00
110 lines
3.8 KiB
C++
110 lines
3.8 KiB
C++
|
// 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
|