| // 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 <string> | 
 | #include <vector> | 
 |  | 
 | #include "gmock/gmock.h" | 
 | #include "test/link/linker_fixture.h" | 
 |  | 
 | namespace spvtools { | 
 | 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; | 
 |   LinkerOptions options; | 
 |   options.SetVerifyIds(true); | 
 |   spv_result_t res = AssembleAndLink(bodies, &linked_binary, options); | 
 |   EXPECT_EQ(SPV_SUCCESS, res); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace spvtools |