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