mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-12-28 10:41:04 +00:00
a771713e42
Each instruction is given an unique id that can be used for ordering purposes. The ids are generated via the IRContext. Major changes: * Instructions now contain a uint32_t for unique id and a cached context pointer * Most constructors have been modified to take a context as input * unfortunately I cannot remove the default and copy constructors, but developers should avoid these * Added accessors to parents of basic block and function * Removed the copy constructors for BasicBlock and Function and replaced them with Clone functions * Reworked BuildModule to return an IRContext owning the built module * Since all instructions require a context, the context now becomes the basic unit for IR * Added a constructor to context to create an owned module internally * Replaced uses of Instruction's copy constructor with Clone whereever I found them * Reworked the linker functionality to perform clones into a different context instead of moves * Updated many tests to be consistent with the above changes * Still need to add new tests to cover added functionality * Added comparison operators to Instruction * Added an internal option to LinkerOptions to verify merged ids are unique * Added a test for the linker to verify merged ids are unique * Updated MergeReturnPass to supply a context * Updated DecorationManager to supply a context for cloned decorations * Reworked several portions of the def use tests in anticipation of next set of changes
138 lines
5.1 KiB
C++
138 lines
5.1 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 "linker_fixture.h"
|
|
|
|
namespace {
|
|
|
|
using UniqueIds = spvtest::LinkerTest;
|
|
|
|
TEST_F(UniqueIds, UniquelyMerged) {
|
|
std::vector<std::string> bodies(2);
|
|
bodies[0] =
|
|
// clang-format off
|
|
"OpCapability Shader\n"
|
|
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
|
|
"OpMemoryModel Logical GLSL450\n"
|
|
"OpEntryPoint Vertex %main \"main\"\n"
|
|
"OpSource ESSL 310\n"
|
|
"OpName %main \"main\"\n"
|
|
"OpName %f_ \"f(\"\n"
|
|
"OpName %gv1 \"gv1\"\n"
|
|
"OpName %gv2 \"gv2\"\n"
|
|
"OpName %lv1 \"lv1\"\n"
|
|
"OpName %lv2 \"lv2\"\n"
|
|
"OpName %lv1_0 \"lv1\"\n"
|
|
"%void = OpTypeVoid\n"
|
|
"%10 = OpTypeFunction %void\n"
|
|
"%float = OpTypeFloat 32\n"
|
|
"%12 = OpTypeFunction %float\n"
|
|
"%_ptr_Private_float = OpTypePointer Private %float\n"
|
|
"%gv1 = OpVariable %_ptr_Private_float Private\n"
|
|
"%float_10 = OpConstant %float 10\n"
|
|
"%gv2 = OpVariable %_ptr_Private_float Private\n"
|
|
"%float_100 = OpConstant %float 100\n"
|
|
"%_ptr_Function_float = OpTypePointer Function %float\n"
|
|
"%main = OpFunction %void None %10\n"
|
|
"%17 = OpLabel\n"
|
|
"%lv1_0 = OpVariable %_ptr_Function_float Function\n"
|
|
"OpStore %gv1 %float_10\n"
|
|
"OpStore %gv2 %float_100\n"
|
|
"%18 = OpLoad %float %gv1\n"
|
|
"%19 = OpLoad %float %gv2\n"
|
|
"%20 = OpFSub %float %18 %19\n"
|
|
"OpStore %lv1_0 %20\n"
|
|
"OpReturn\n"
|
|
"OpFunctionEnd\n"
|
|
"%f_ = OpFunction %float None %12\n"
|
|
"%21 = OpLabel\n"
|
|
"%lv1 = OpVariable %_ptr_Function_float Function\n"
|
|
"%lv2 = OpVariable %_ptr_Function_float Function\n"
|
|
"%22 = OpLoad %float %gv1\n"
|
|
"%23 = OpLoad %float %gv2\n"
|
|
"%24 = OpFAdd %float %22 %23\n"
|
|
"OpStore %lv1 %24\n"
|
|
"%25 = OpLoad %float %gv1\n"
|
|
"%26 = OpLoad %float %gv2\n"
|
|
"%27 = OpFMul %float %25 %26\n"
|
|
"OpStore %lv2 %27\n"
|
|
"%28 = OpLoad %float %lv1\n"
|
|
"%29 = OpLoad %float %lv2\n"
|
|
"%30 = OpFDiv %float %28 %29\n"
|
|
"OpReturnValue %30\n"
|
|
"OpFunctionEnd\n";
|
|
// clang-format on
|
|
bodies[1] =
|
|
// clang-format off
|
|
"OpCapability Shader\n"
|
|
"%1 = OpExtInstImport \"GLSL.std.450\"\n"
|
|
"OpMemoryModel Logical GLSL450\n"
|
|
"OpSource ESSL 310\n"
|
|
"OpName %main \"main2\"\n"
|
|
"OpName %f_ \"f(\"\n"
|
|
"OpName %gv1 \"gv12\"\n"
|
|
"OpName %gv2 \"gv22\"\n"
|
|
"OpName %lv1 \"lv12\"\n"
|
|
"OpName %lv2 \"lv22\"\n"
|
|
"OpName %lv1_0 \"lv12\"\n"
|
|
"%void = OpTypeVoid\n"
|
|
"%10 = OpTypeFunction %void\n"
|
|
"%float = OpTypeFloat 32\n"
|
|
"%12 = OpTypeFunction %float\n"
|
|
"%_ptr_Private_float = OpTypePointer Private %float\n"
|
|
"%gv1 = OpVariable %_ptr_Private_float Private\n"
|
|
"%float_10 = OpConstant %float 10\n"
|
|
"%gv2 = OpVariable %_ptr_Private_float Private\n"
|
|
"%float_100 = OpConstant %float 100\n"
|
|
"%_ptr_Function_float = OpTypePointer Function %float\n"
|
|
"%main = OpFunction %void None %10\n"
|
|
"%17 = OpLabel\n"
|
|
"%lv1_0 = OpVariable %_ptr_Function_float Function\n"
|
|
"OpStore %gv1 %float_10\n"
|
|
"OpStore %gv2 %float_100\n"
|
|
"%18 = OpLoad %float %gv1\n"
|
|
"%19 = OpLoad %float %gv2\n"
|
|
"%20 = OpFSub %float %18 %19\n"
|
|
"OpStore %lv1_0 %20\n"
|
|
"OpReturn\n"
|
|
"OpFunctionEnd\n"
|
|
"%f_ = OpFunction %float None %12\n"
|
|
"%21 = OpLabel\n"
|
|
"%lv1 = OpVariable %_ptr_Function_float Function\n"
|
|
"%lv2 = OpVariable %_ptr_Function_float Function\n"
|
|
"%22 = OpLoad %float %gv1\n"
|
|
"%23 = OpLoad %float %gv2\n"
|
|
"%24 = OpFAdd %float %22 %23\n"
|
|
"OpStore %lv1 %24\n"
|
|
"%25 = OpLoad %float %gv1\n"
|
|
"%26 = OpLoad %float %gv2\n"
|
|
"%27 = OpFMul %float %25 %26\n"
|
|
"OpStore %lv2 %27\n"
|
|
"%28 = OpLoad %float %lv1\n"
|
|
"%29 = OpLoad %float %lv2\n"
|
|
"%30 = OpFDiv %float %28 %29\n"
|
|
"OpReturnValue %30\n"
|
|
"OpFunctionEnd\n";
|
|
// clang-format on
|
|
|
|
spvtest::Binary linked_binary;
|
|
spvtools::LinkerOptions options;
|
|
options.SetVerifyIds(true);
|
|
spv_result_t res = AssembleAndLink(bodies, &linked_binary, options);
|
|
EXPECT_EQ(SPV_SUCCESS, res);
|
|
}
|
|
|
|
} // anonymous namespace
|