1fd4e5da5Sopenharmony_ci// Copyright (c) 2017 Google Inc. 2fd4e5da5Sopenharmony_ci// 3fd4e5da5Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 4fd4e5da5Sopenharmony_ci// you may not use this file except in compliance with the License. 5fd4e5da5Sopenharmony_ci// You may obtain a copy of the License at 6fd4e5da5Sopenharmony_ci// 7fd4e5da5Sopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 8fd4e5da5Sopenharmony_ci// 9fd4e5da5Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software 10fd4e5da5Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 11fd4e5da5Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fd4e5da5Sopenharmony_ci// See the License for the specific language governing permissions and 13fd4e5da5Sopenharmony_ci// limitations under the License. 14fd4e5da5Sopenharmony_ci 15fd4e5da5Sopenharmony_ci#include <string> 16fd4e5da5Sopenharmony_ci#include <vector> 17fd4e5da5Sopenharmony_ci 18fd4e5da5Sopenharmony_ci#include "gmock/gmock.h" 19fd4e5da5Sopenharmony_ci#include "test/link/linker_fixture.h" 20fd4e5da5Sopenharmony_ci 21fd4e5da5Sopenharmony_cinamespace spvtools { 22fd4e5da5Sopenharmony_cinamespace { 23fd4e5da5Sopenharmony_ci 24fd4e5da5Sopenharmony_ciusing UniqueIds = spvtest::LinkerTest; 25fd4e5da5Sopenharmony_ci 26fd4e5da5Sopenharmony_ciTEST_F(UniqueIds, UniquelyMerged) { 27fd4e5da5Sopenharmony_ci std::vector<std::string> bodies(2); 28fd4e5da5Sopenharmony_ci bodies[0] = 29fd4e5da5Sopenharmony_ci // clang-format off 30fd4e5da5Sopenharmony_ci "OpCapability Shader\n" 31fd4e5da5Sopenharmony_ci "%1 = OpExtInstImport \"GLSL.std.450\"\n" 32fd4e5da5Sopenharmony_ci "OpMemoryModel Logical GLSL450\n" 33fd4e5da5Sopenharmony_ci "OpEntryPoint Vertex %main \"main\"\n" 34fd4e5da5Sopenharmony_ci "OpSource ESSL 310\n" 35fd4e5da5Sopenharmony_ci "OpName %main \"main\"\n" 36fd4e5da5Sopenharmony_ci "OpName %f_ \"f(\"\n" 37fd4e5da5Sopenharmony_ci "OpName %gv1 \"gv1\"\n" 38fd4e5da5Sopenharmony_ci "OpName %gv2 \"gv2\"\n" 39fd4e5da5Sopenharmony_ci "OpName %lv1 \"lv1\"\n" 40fd4e5da5Sopenharmony_ci "OpName %lv2 \"lv2\"\n" 41fd4e5da5Sopenharmony_ci "OpName %lv1_0 \"lv1\"\n" 42fd4e5da5Sopenharmony_ci "%void = OpTypeVoid\n" 43fd4e5da5Sopenharmony_ci "%10 = OpTypeFunction %void\n" 44fd4e5da5Sopenharmony_ci "%float = OpTypeFloat 32\n" 45fd4e5da5Sopenharmony_ci "%12 = OpTypeFunction %float\n" 46fd4e5da5Sopenharmony_ci "%_ptr_Private_float = OpTypePointer Private %float\n" 47fd4e5da5Sopenharmony_ci "%gv1 = OpVariable %_ptr_Private_float Private\n" 48fd4e5da5Sopenharmony_ci "%float_10 = OpConstant %float 10\n" 49fd4e5da5Sopenharmony_ci "%gv2 = OpVariable %_ptr_Private_float Private\n" 50fd4e5da5Sopenharmony_ci "%float_100 = OpConstant %float 100\n" 51fd4e5da5Sopenharmony_ci "%_ptr_Function_float = OpTypePointer Function %float\n" 52fd4e5da5Sopenharmony_ci "%main = OpFunction %void None %10\n" 53fd4e5da5Sopenharmony_ci "%17 = OpLabel\n" 54fd4e5da5Sopenharmony_ci "%lv1_0 = OpVariable %_ptr_Function_float Function\n" 55fd4e5da5Sopenharmony_ci "OpStore %gv1 %float_10\n" 56fd4e5da5Sopenharmony_ci "OpStore %gv2 %float_100\n" 57fd4e5da5Sopenharmony_ci "%18 = OpLoad %float %gv1\n" 58fd4e5da5Sopenharmony_ci "%19 = OpLoad %float %gv2\n" 59fd4e5da5Sopenharmony_ci "%20 = OpFSub %float %18 %19\n" 60fd4e5da5Sopenharmony_ci "OpStore %lv1_0 %20\n" 61fd4e5da5Sopenharmony_ci "OpReturn\n" 62fd4e5da5Sopenharmony_ci "OpFunctionEnd\n" 63fd4e5da5Sopenharmony_ci "%f_ = OpFunction %float None %12\n" 64fd4e5da5Sopenharmony_ci "%21 = OpLabel\n" 65fd4e5da5Sopenharmony_ci "%lv1 = OpVariable %_ptr_Function_float Function\n" 66fd4e5da5Sopenharmony_ci "%lv2 = OpVariable %_ptr_Function_float Function\n" 67fd4e5da5Sopenharmony_ci "%22 = OpLoad %float %gv1\n" 68fd4e5da5Sopenharmony_ci "%23 = OpLoad %float %gv2\n" 69fd4e5da5Sopenharmony_ci "%24 = OpFAdd %float %22 %23\n" 70fd4e5da5Sopenharmony_ci "OpStore %lv1 %24\n" 71fd4e5da5Sopenharmony_ci "%25 = OpLoad %float %gv1\n" 72fd4e5da5Sopenharmony_ci "%26 = OpLoad %float %gv2\n" 73fd4e5da5Sopenharmony_ci "%27 = OpFMul %float %25 %26\n" 74fd4e5da5Sopenharmony_ci "OpStore %lv2 %27\n" 75fd4e5da5Sopenharmony_ci "%28 = OpLoad %float %lv1\n" 76fd4e5da5Sopenharmony_ci "%29 = OpLoad %float %lv2\n" 77fd4e5da5Sopenharmony_ci "%30 = OpFDiv %float %28 %29\n" 78fd4e5da5Sopenharmony_ci "OpReturnValue %30\n" 79fd4e5da5Sopenharmony_ci "OpFunctionEnd\n"; 80fd4e5da5Sopenharmony_ci // clang-format on 81fd4e5da5Sopenharmony_ci bodies[1] = 82fd4e5da5Sopenharmony_ci // clang-format off 83fd4e5da5Sopenharmony_ci "OpCapability Shader\n" 84fd4e5da5Sopenharmony_ci "%1 = OpExtInstImport \"GLSL.std.450\"\n" 85fd4e5da5Sopenharmony_ci "OpMemoryModel Logical GLSL450\n" 86fd4e5da5Sopenharmony_ci "OpSource ESSL 310\n" 87fd4e5da5Sopenharmony_ci "OpName %main \"main2\"\n" 88fd4e5da5Sopenharmony_ci "OpName %f_ \"f(\"\n" 89fd4e5da5Sopenharmony_ci "OpName %gv1 \"gv12\"\n" 90fd4e5da5Sopenharmony_ci "OpName %gv2 \"gv22\"\n" 91fd4e5da5Sopenharmony_ci "OpName %lv1 \"lv12\"\n" 92fd4e5da5Sopenharmony_ci "OpName %lv2 \"lv22\"\n" 93fd4e5da5Sopenharmony_ci "OpName %lv1_0 \"lv12\"\n" 94fd4e5da5Sopenharmony_ci "%void = OpTypeVoid\n" 95fd4e5da5Sopenharmony_ci "%10 = OpTypeFunction %void\n" 96fd4e5da5Sopenharmony_ci "%float = OpTypeFloat 32\n" 97fd4e5da5Sopenharmony_ci "%12 = OpTypeFunction %float\n" 98fd4e5da5Sopenharmony_ci "%_ptr_Private_float = OpTypePointer Private %float\n" 99fd4e5da5Sopenharmony_ci "%gv1 = OpVariable %_ptr_Private_float Private\n" 100fd4e5da5Sopenharmony_ci "%float_10 = OpConstant %float 10\n" 101fd4e5da5Sopenharmony_ci "%gv2 = OpVariable %_ptr_Private_float Private\n" 102fd4e5da5Sopenharmony_ci "%float_100 = OpConstant %float 100\n" 103fd4e5da5Sopenharmony_ci "%_ptr_Function_float = OpTypePointer Function %float\n" 104fd4e5da5Sopenharmony_ci "%main = OpFunction %void None %10\n" 105fd4e5da5Sopenharmony_ci "%17 = OpLabel\n" 106fd4e5da5Sopenharmony_ci "%lv1_0 = OpVariable %_ptr_Function_float Function\n" 107fd4e5da5Sopenharmony_ci "OpStore %gv1 %float_10\n" 108fd4e5da5Sopenharmony_ci "OpStore %gv2 %float_100\n" 109fd4e5da5Sopenharmony_ci "%18 = OpLoad %float %gv1\n" 110fd4e5da5Sopenharmony_ci "%19 = OpLoad %float %gv2\n" 111fd4e5da5Sopenharmony_ci "%20 = OpFSub %float %18 %19\n" 112fd4e5da5Sopenharmony_ci "OpStore %lv1_0 %20\n" 113fd4e5da5Sopenharmony_ci "OpReturn\n" 114fd4e5da5Sopenharmony_ci "OpFunctionEnd\n" 115fd4e5da5Sopenharmony_ci "%f_ = OpFunction %float None %12\n" 116fd4e5da5Sopenharmony_ci "%21 = OpLabel\n" 117fd4e5da5Sopenharmony_ci "%lv1 = OpVariable %_ptr_Function_float Function\n" 118fd4e5da5Sopenharmony_ci "%lv2 = OpVariable %_ptr_Function_float Function\n" 119fd4e5da5Sopenharmony_ci "%22 = OpLoad %float %gv1\n" 120fd4e5da5Sopenharmony_ci "%23 = OpLoad %float %gv2\n" 121fd4e5da5Sopenharmony_ci "%24 = OpFAdd %float %22 %23\n" 122fd4e5da5Sopenharmony_ci "OpStore %lv1 %24\n" 123fd4e5da5Sopenharmony_ci "%25 = OpLoad %float %gv1\n" 124fd4e5da5Sopenharmony_ci "%26 = OpLoad %float %gv2\n" 125fd4e5da5Sopenharmony_ci "%27 = OpFMul %float %25 %26\n" 126fd4e5da5Sopenharmony_ci "OpStore %lv2 %27\n" 127fd4e5da5Sopenharmony_ci "%28 = OpLoad %float %lv1\n" 128fd4e5da5Sopenharmony_ci "%29 = OpLoad %float %lv2\n" 129fd4e5da5Sopenharmony_ci "%30 = OpFDiv %float %28 %29\n" 130fd4e5da5Sopenharmony_ci "OpReturnValue %30\n" 131fd4e5da5Sopenharmony_ci "OpFunctionEnd\n"; 132fd4e5da5Sopenharmony_ci // clang-format on 133fd4e5da5Sopenharmony_ci 134fd4e5da5Sopenharmony_ci spvtest::Binary linked_binary; 135fd4e5da5Sopenharmony_ci LinkerOptions options; 136fd4e5da5Sopenharmony_ci options.SetVerifyIds(true); 137fd4e5da5Sopenharmony_ci spv_result_t res = AssembleAndLink(bodies, &linked_binary, options); 138fd4e5da5Sopenharmony_ci ASSERT_EQ(SPV_SUCCESS, res) << GetErrorMessage(); 139fd4e5da5Sopenharmony_ci EXPECT_THAT(GetErrorMessage(), std::string()); 140fd4e5da5Sopenharmony_ci} 141fd4e5da5Sopenharmony_ci 142fd4e5da5Sopenharmony_ci} // namespace 143fd4e5da5Sopenharmony_ci} // namespace spvtools 144