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 <memory>
16fd4e5da5Sopenharmony_ci#include <vector>
17fd4e5da5Sopenharmony_ci
18fd4e5da5Sopenharmony_ci#include "gmock/gmock.h"
19fd4e5da5Sopenharmony_ci#include "source/opt/dominator_analysis.h"
20fd4e5da5Sopenharmony_ci#include "source/opt/pass.h"
21fd4e5da5Sopenharmony_ci#include "test/opt/assembly_builder.h"
22fd4e5da5Sopenharmony_ci#include "test/opt/function_utils.h"
23fd4e5da5Sopenharmony_ci#include "test/opt/pass_fixture.h"
24fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h"
25fd4e5da5Sopenharmony_ci
26fd4e5da5Sopenharmony_cinamespace spvtools {
27fd4e5da5Sopenharmony_cinamespace opt {
28fd4e5da5Sopenharmony_cinamespace {
29fd4e5da5Sopenharmony_ci
30fd4e5da5Sopenharmony_ciusing ::testing::UnorderedElementsAre;
31fd4e5da5Sopenharmony_ciusing PassClassTest = PassTest<::testing::Test>;
32fd4e5da5Sopenharmony_ci
33fd4e5da5Sopenharmony_ci/*
34fd4e5da5Sopenharmony_ci  Generated from the following GLSL
35fd4e5da5Sopenharmony_ci#version 440 core
36fd4e5da5Sopenharmony_cilayout(location = 0) out vec4 v;
37fd4e5da5Sopenharmony_cilayout(location = 1) in vec4 in_val;
38fd4e5da5Sopenharmony_civoid main() {
39fd4e5da5Sopenharmony_ci  for (int i = 0; i < in_val.x; ++i) {
40fd4e5da5Sopenharmony_ci    for (int j = 0; j < in_val.y; j++) {
41fd4e5da5Sopenharmony_ci    }
42fd4e5da5Sopenharmony_ci  }
43fd4e5da5Sopenharmony_ci  for (int i = 0; i < in_val.x; ++i) {
44fd4e5da5Sopenharmony_ci    for (int j = 0; j < in_val.y; j++) {
45fd4e5da5Sopenharmony_ci    }
46fd4e5da5Sopenharmony_ci    if (in_val.z == in_val.w) {
47fd4e5da5Sopenharmony_ci      break;
48fd4e5da5Sopenharmony_ci    }
49fd4e5da5Sopenharmony_ci  }
50fd4e5da5Sopenharmony_ci  int i = 0;
51fd4e5da5Sopenharmony_ci  while (i < in_val.x) {
52fd4e5da5Sopenharmony_ci    ++i;
53fd4e5da5Sopenharmony_ci    for (int j = 0; j < 1; j++) {
54fd4e5da5Sopenharmony_ci      for (int k = 0; k < 1; k++) {
55fd4e5da5Sopenharmony_ci      }
56fd4e5da5Sopenharmony_ci    }
57fd4e5da5Sopenharmony_ci  }
58fd4e5da5Sopenharmony_ci  i = 0;
59fd4e5da5Sopenharmony_ci  while (i < in_val.x) {
60fd4e5da5Sopenharmony_ci    ++i;
61fd4e5da5Sopenharmony_ci    if (in_val.z == in_val.w) {
62fd4e5da5Sopenharmony_ci      continue;
63fd4e5da5Sopenharmony_ci    }
64fd4e5da5Sopenharmony_ci    for (int j = 0; j < 1; j++) {
65fd4e5da5Sopenharmony_ci      for (int k = 0; k < 1; k++) {
66fd4e5da5Sopenharmony_ci      }
67fd4e5da5Sopenharmony_ci      if (in_val.z == in_val.w) {
68fd4e5da5Sopenharmony_ci        break;
69fd4e5da5Sopenharmony_ci      }
70fd4e5da5Sopenharmony_ci    }
71fd4e5da5Sopenharmony_ci  }
72fd4e5da5Sopenharmony_ci  v = vec4(1,1,1,1);
73fd4e5da5Sopenharmony_ci}
74fd4e5da5Sopenharmony_ci*/
75fd4e5da5Sopenharmony_ciTEST_F(PassClassTest, BasicVisitFromEntryPoint) {
76fd4e5da5Sopenharmony_ci  const std::string text = R"(
77fd4e5da5Sopenharmony_ci    OpCapability Shader
78fd4e5da5Sopenharmony_ci    %1 = OpExtInstImport "GLSL.std.450"
79fd4e5da5Sopenharmony_ci         OpMemoryModel Logical GLSL450
80fd4e5da5Sopenharmony_ci         OpEntryPoint Fragment %4 "main" %20 %163
81fd4e5da5Sopenharmony_ci         OpExecutionMode %4 OriginUpperLeft
82fd4e5da5Sopenharmony_ci         OpSource GLSL 440
83fd4e5da5Sopenharmony_ci         OpName %4 "main"
84fd4e5da5Sopenharmony_ci         OpName %8 "i"
85fd4e5da5Sopenharmony_ci         OpName %20 "in_val"
86fd4e5da5Sopenharmony_ci         OpName %28 "j"
87fd4e5da5Sopenharmony_ci         OpName %45 "i"
88fd4e5da5Sopenharmony_ci         OpName %56 "j"
89fd4e5da5Sopenharmony_ci         OpName %81 "i"
90fd4e5da5Sopenharmony_ci         OpName %94 "j"
91fd4e5da5Sopenharmony_ci         OpName %102 "k"
92fd4e5da5Sopenharmony_ci         OpName %134 "j"
93fd4e5da5Sopenharmony_ci         OpName %142 "k"
94fd4e5da5Sopenharmony_ci         OpName %163 "v"
95fd4e5da5Sopenharmony_ci         OpDecorate %20 Location 1
96fd4e5da5Sopenharmony_ci         OpDecorate %163 Location 0
97fd4e5da5Sopenharmony_ci    %2 = OpTypeVoid
98fd4e5da5Sopenharmony_ci    %3 = OpTypeFunction %2
99fd4e5da5Sopenharmony_ci    %6 = OpTypeInt 32 1
100fd4e5da5Sopenharmony_ci    %7 = OpTypePointer Function %6
101fd4e5da5Sopenharmony_ci    %9 = OpConstant %6 0
102fd4e5da5Sopenharmony_ci   %16 = OpTypeFloat 32
103fd4e5da5Sopenharmony_ci   %18 = OpTypeVector %16 4
104fd4e5da5Sopenharmony_ci   %19 = OpTypePointer Input %18
105fd4e5da5Sopenharmony_ci   %20 = OpVariable %19 Input
106fd4e5da5Sopenharmony_ci   %21 = OpTypeInt 32 0
107fd4e5da5Sopenharmony_ci   %22 = OpConstant %21 0
108fd4e5da5Sopenharmony_ci   %23 = OpTypePointer Input %16
109fd4e5da5Sopenharmony_ci   %26 = OpTypeBool
110fd4e5da5Sopenharmony_ci   %36 = OpConstant %21 1
111fd4e5da5Sopenharmony_ci   %41 = OpConstant %6 1
112fd4e5da5Sopenharmony_ci   %69 = OpConstant %21 2
113fd4e5da5Sopenharmony_ci   %72 = OpConstant %21 3
114fd4e5da5Sopenharmony_ci  %162 = OpTypePointer Output %18
115fd4e5da5Sopenharmony_ci  %163 = OpVariable %162 Output
116fd4e5da5Sopenharmony_ci  %164 = OpConstant %16 1
117fd4e5da5Sopenharmony_ci  %165 = OpConstantComposite %18 %164 %164 %164 %164
118fd4e5da5Sopenharmony_ci    %4 = OpFunction %2 None %3
119fd4e5da5Sopenharmony_ci    %5 = OpLabel
120fd4e5da5Sopenharmony_ci    %8 = OpVariable %7 Function
121fd4e5da5Sopenharmony_ci   %28 = OpVariable %7 Function
122fd4e5da5Sopenharmony_ci   %45 = OpVariable %7 Function
123fd4e5da5Sopenharmony_ci   %56 = OpVariable %7 Function
124fd4e5da5Sopenharmony_ci   %81 = OpVariable %7 Function
125fd4e5da5Sopenharmony_ci   %94 = OpVariable %7 Function
126fd4e5da5Sopenharmony_ci  %102 = OpVariable %7 Function
127fd4e5da5Sopenharmony_ci  %134 = OpVariable %7 Function
128fd4e5da5Sopenharmony_ci  %142 = OpVariable %7 Function
129fd4e5da5Sopenharmony_ci         OpStore %8 %9
130fd4e5da5Sopenharmony_ci         OpBranch %10
131fd4e5da5Sopenharmony_ci   %10 = OpLabel
132fd4e5da5Sopenharmony_ci         OpLoopMerge %12 %13 None
133fd4e5da5Sopenharmony_ci         OpBranch %14
134fd4e5da5Sopenharmony_ci   %14 = OpLabel
135fd4e5da5Sopenharmony_ci   %15 = OpLoad %6 %8
136fd4e5da5Sopenharmony_ci   %17 = OpConvertSToF %16 %15
137fd4e5da5Sopenharmony_ci   %24 = OpAccessChain %23 %20 %22
138fd4e5da5Sopenharmony_ci   %25 = OpLoad %16 %24
139fd4e5da5Sopenharmony_ci   %27 = OpFOrdLessThan %26 %17 %25
140fd4e5da5Sopenharmony_ci         OpBranchConditional %27 %11 %12
141fd4e5da5Sopenharmony_ci   %11 = OpLabel
142fd4e5da5Sopenharmony_ci         OpStore %28 %9
143fd4e5da5Sopenharmony_ci         OpBranch %29
144fd4e5da5Sopenharmony_ci   %29 = OpLabel
145fd4e5da5Sopenharmony_ci         OpLoopMerge %31 %32 None
146fd4e5da5Sopenharmony_ci         OpBranch %33
147fd4e5da5Sopenharmony_ci   %33 = OpLabel
148fd4e5da5Sopenharmony_ci   %34 = OpLoad %6 %28
149fd4e5da5Sopenharmony_ci   %35 = OpConvertSToF %16 %34
150fd4e5da5Sopenharmony_ci   %37 = OpAccessChain %23 %20 %36
151fd4e5da5Sopenharmony_ci   %38 = OpLoad %16 %37
152fd4e5da5Sopenharmony_ci   %39 = OpFOrdLessThan %26 %35 %38
153fd4e5da5Sopenharmony_ci         OpBranchConditional %39 %30 %31
154fd4e5da5Sopenharmony_ci   %30 = OpLabel
155fd4e5da5Sopenharmony_ci         OpBranch %32
156fd4e5da5Sopenharmony_ci   %32 = OpLabel
157fd4e5da5Sopenharmony_ci   %40 = OpLoad %6 %28
158fd4e5da5Sopenharmony_ci   %42 = OpIAdd %6 %40 %41
159fd4e5da5Sopenharmony_ci         OpStore %28 %42
160fd4e5da5Sopenharmony_ci         OpBranch %29
161fd4e5da5Sopenharmony_ci   %31 = OpLabel
162fd4e5da5Sopenharmony_ci         OpBranch %13
163fd4e5da5Sopenharmony_ci   %13 = OpLabel
164fd4e5da5Sopenharmony_ci   %43 = OpLoad %6 %8
165fd4e5da5Sopenharmony_ci   %44 = OpIAdd %6 %43 %41
166fd4e5da5Sopenharmony_ci         OpStore %8 %44
167fd4e5da5Sopenharmony_ci         OpBranch %10
168fd4e5da5Sopenharmony_ci   %12 = OpLabel
169fd4e5da5Sopenharmony_ci         OpStore %45 %9
170fd4e5da5Sopenharmony_ci         OpBranch %46
171fd4e5da5Sopenharmony_ci   %46 = OpLabel
172fd4e5da5Sopenharmony_ci         OpLoopMerge %48 %49 None
173fd4e5da5Sopenharmony_ci         OpBranch %50
174fd4e5da5Sopenharmony_ci   %50 = OpLabel
175fd4e5da5Sopenharmony_ci   %51 = OpLoad %6 %45
176fd4e5da5Sopenharmony_ci   %52 = OpConvertSToF %16 %51
177fd4e5da5Sopenharmony_ci   %53 = OpAccessChain %23 %20 %22
178fd4e5da5Sopenharmony_ci   %54 = OpLoad %16 %53
179fd4e5da5Sopenharmony_ci   %55 = OpFOrdLessThan %26 %52 %54
180fd4e5da5Sopenharmony_ci         OpBranchConditional %55 %47 %48
181fd4e5da5Sopenharmony_ci   %47 = OpLabel
182fd4e5da5Sopenharmony_ci         OpStore %56 %9
183fd4e5da5Sopenharmony_ci         OpBranch %57
184fd4e5da5Sopenharmony_ci   %57 = OpLabel
185fd4e5da5Sopenharmony_ci         OpLoopMerge %59 %60 None
186fd4e5da5Sopenharmony_ci         OpBranch %61
187fd4e5da5Sopenharmony_ci   %61 = OpLabel
188fd4e5da5Sopenharmony_ci   %62 = OpLoad %6 %56
189fd4e5da5Sopenharmony_ci   %63 = OpConvertSToF %16 %62
190fd4e5da5Sopenharmony_ci   %64 = OpAccessChain %23 %20 %36
191fd4e5da5Sopenharmony_ci   %65 = OpLoad %16 %64
192fd4e5da5Sopenharmony_ci   %66 = OpFOrdLessThan %26 %63 %65
193fd4e5da5Sopenharmony_ci         OpBranchConditional %66 %58 %59
194fd4e5da5Sopenharmony_ci   %58 = OpLabel
195fd4e5da5Sopenharmony_ci         OpBranch %60
196fd4e5da5Sopenharmony_ci   %60 = OpLabel
197fd4e5da5Sopenharmony_ci   %67 = OpLoad %6 %56
198fd4e5da5Sopenharmony_ci   %68 = OpIAdd %6 %67 %41
199fd4e5da5Sopenharmony_ci         OpStore %56 %68
200fd4e5da5Sopenharmony_ci         OpBranch %57
201fd4e5da5Sopenharmony_ci   %59 = OpLabel
202fd4e5da5Sopenharmony_ci   %70 = OpAccessChain %23 %20 %69
203fd4e5da5Sopenharmony_ci   %71 = OpLoad %16 %70
204fd4e5da5Sopenharmony_ci   %73 = OpAccessChain %23 %20 %72
205fd4e5da5Sopenharmony_ci   %74 = OpLoad %16 %73
206fd4e5da5Sopenharmony_ci   %75 = OpFOrdEqual %26 %71 %74
207fd4e5da5Sopenharmony_ci         OpSelectionMerge %77 None
208fd4e5da5Sopenharmony_ci         OpBranchConditional %75 %76 %77
209fd4e5da5Sopenharmony_ci   %76 = OpLabel
210fd4e5da5Sopenharmony_ci         OpBranch %48
211fd4e5da5Sopenharmony_ci   %77 = OpLabel
212fd4e5da5Sopenharmony_ci         OpBranch %49
213fd4e5da5Sopenharmony_ci   %49 = OpLabel
214fd4e5da5Sopenharmony_ci   %79 = OpLoad %6 %45
215fd4e5da5Sopenharmony_ci   %80 = OpIAdd %6 %79 %41
216fd4e5da5Sopenharmony_ci         OpStore %45 %80
217fd4e5da5Sopenharmony_ci         OpBranch %46
218fd4e5da5Sopenharmony_ci   %48 = OpLabel
219fd4e5da5Sopenharmony_ci         OpStore %81 %9
220fd4e5da5Sopenharmony_ci         OpBranch %82
221fd4e5da5Sopenharmony_ci   %82 = OpLabel
222fd4e5da5Sopenharmony_ci         OpLoopMerge %84 %85 None
223fd4e5da5Sopenharmony_ci         OpBranch %86
224fd4e5da5Sopenharmony_ci   %86 = OpLabel
225fd4e5da5Sopenharmony_ci   %87 = OpLoad %6 %81
226fd4e5da5Sopenharmony_ci   %88 = OpConvertSToF %16 %87
227fd4e5da5Sopenharmony_ci   %89 = OpAccessChain %23 %20 %22
228fd4e5da5Sopenharmony_ci   %90 = OpLoad %16 %89
229fd4e5da5Sopenharmony_ci   %91 = OpFOrdLessThan %26 %88 %90
230fd4e5da5Sopenharmony_ci         OpBranchConditional %91 %83 %84
231fd4e5da5Sopenharmony_ci   %83 = OpLabel
232fd4e5da5Sopenharmony_ci   %92 = OpLoad %6 %81
233fd4e5da5Sopenharmony_ci   %93 = OpIAdd %6 %92 %41
234fd4e5da5Sopenharmony_ci         OpStore %81 %93
235fd4e5da5Sopenharmony_ci         OpStore %94 %9
236fd4e5da5Sopenharmony_ci         OpBranch %95
237fd4e5da5Sopenharmony_ci   %95 = OpLabel
238fd4e5da5Sopenharmony_ci         OpLoopMerge %97 %98 None
239fd4e5da5Sopenharmony_ci         OpBranch %99
240fd4e5da5Sopenharmony_ci   %99 = OpLabel
241fd4e5da5Sopenharmony_ci  %100 = OpLoad %6 %94
242fd4e5da5Sopenharmony_ci  %101 = OpSLessThan %26 %100 %41
243fd4e5da5Sopenharmony_ci         OpBranchConditional %101 %96 %97
244fd4e5da5Sopenharmony_ci   %96 = OpLabel
245fd4e5da5Sopenharmony_ci         OpStore %102 %9
246fd4e5da5Sopenharmony_ci         OpBranch %103
247fd4e5da5Sopenharmony_ci  %103 = OpLabel
248fd4e5da5Sopenharmony_ci         OpLoopMerge %105 %106 None
249fd4e5da5Sopenharmony_ci         OpBranch %107
250fd4e5da5Sopenharmony_ci  %107 = OpLabel
251fd4e5da5Sopenharmony_ci  %108 = OpLoad %6 %102
252fd4e5da5Sopenharmony_ci  %109 = OpSLessThan %26 %108 %41
253fd4e5da5Sopenharmony_ci         OpBranchConditional %109 %104 %105
254fd4e5da5Sopenharmony_ci  %104 = OpLabel
255fd4e5da5Sopenharmony_ci         OpBranch %106
256fd4e5da5Sopenharmony_ci  %106 = OpLabel
257fd4e5da5Sopenharmony_ci  %110 = OpLoad %6 %102
258fd4e5da5Sopenharmony_ci  %111 = OpIAdd %6 %110 %41
259fd4e5da5Sopenharmony_ci         OpStore %102 %111
260fd4e5da5Sopenharmony_ci         OpBranch %103
261fd4e5da5Sopenharmony_ci  %105 = OpLabel
262fd4e5da5Sopenharmony_ci         OpBranch %98
263fd4e5da5Sopenharmony_ci   %98 = OpLabel
264fd4e5da5Sopenharmony_ci  %112 = OpLoad %6 %94
265fd4e5da5Sopenharmony_ci  %113 = OpIAdd %6 %112 %41
266fd4e5da5Sopenharmony_ci         OpStore %94 %113
267fd4e5da5Sopenharmony_ci         OpBranch %95
268fd4e5da5Sopenharmony_ci   %97 = OpLabel
269fd4e5da5Sopenharmony_ci         OpBranch %85
270fd4e5da5Sopenharmony_ci   %85 = OpLabel
271fd4e5da5Sopenharmony_ci         OpBranch %82
272fd4e5da5Sopenharmony_ci   %84 = OpLabel
273fd4e5da5Sopenharmony_ci         OpStore %81 %9
274fd4e5da5Sopenharmony_ci         OpBranch %114
275fd4e5da5Sopenharmony_ci  %114 = OpLabel
276fd4e5da5Sopenharmony_ci         OpLoopMerge %116 %117 None
277fd4e5da5Sopenharmony_ci         OpBranch %118
278fd4e5da5Sopenharmony_ci  %118 = OpLabel
279fd4e5da5Sopenharmony_ci  %119 = OpLoad %6 %81
280fd4e5da5Sopenharmony_ci  %120 = OpConvertSToF %16 %119
281fd4e5da5Sopenharmony_ci  %121 = OpAccessChain %23 %20 %22
282fd4e5da5Sopenharmony_ci  %122 = OpLoad %16 %121
283fd4e5da5Sopenharmony_ci  %123 = OpFOrdLessThan %26 %120 %122
284fd4e5da5Sopenharmony_ci         OpBranchConditional %123 %115 %116
285fd4e5da5Sopenharmony_ci  %115 = OpLabel
286fd4e5da5Sopenharmony_ci  %124 = OpLoad %6 %81
287fd4e5da5Sopenharmony_ci  %125 = OpIAdd %6 %124 %41
288fd4e5da5Sopenharmony_ci         OpStore %81 %125
289fd4e5da5Sopenharmony_ci  %126 = OpAccessChain %23 %20 %69
290fd4e5da5Sopenharmony_ci  %127 = OpLoad %16 %126
291fd4e5da5Sopenharmony_ci  %128 = OpAccessChain %23 %20 %72
292fd4e5da5Sopenharmony_ci  %129 = OpLoad %16 %128
293fd4e5da5Sopenharmony_ci  %130 = OpFOrdEqual %26 %127 %129
294fd4e5da5Sopenharmony_ci         OpSelectionMerge %132 None
295fd4e5da5Sopenharmony_ci         OpBranchConditional %130 %131 %132
296fd4e5da5Sopenharmony_ci  %131 = OpLabel
297fd4e5da5Sopenharmony_ci         OpBranch %117
298fd4e5da5Sopenharmony_ci  %132 = OpLabel
299fd4e5da5Sopenharmony_ci         OpStore %134 %9
300fd4e5da5Sopenharmony_ci         OpBranch %135
301fd4e5da5Sopenharmony_ci  %135 = OpLabel
302fd4e5da5Sopenharmony_ci         OpLoopMerge %137 %138 None
303fd4e5da5Sopenharmony_ci         OpBranch %139
304fd4e5da5Sopenharmony_ci  %139 = OpLabel
305fd4e5da5Sopenharmony_ci  %140 = OpLoad %6 %134
306fd4e5da5Sopenharmony_ci  %141 = OpSLessThan %26 %140 %41
307fd4e5da5Sopenharmony_ci         OpBranchConditional %141 %136 %137
308fd4e5da5Sopenharmony_ci  %136 = OpLabel
309fd4e5da5Sopenharmony_ci         OpStore %142 %9
310fd4e5da5Sopenharmony_ci         OpBranch %143
311fd4e5da5Sopenharmony_ci  %143 = OpLabel
312fd4e5da5Sopenharmony_ci         OpLoopMerge %145 %146 None
313fd4e5da5Sopenharmony_ci         OpBranch %147
314fd4e5da5Sopenharmony_ci  %147 = OpLabel
315fd4e5da5Sopenharmony_ci  %148 = OpLoad %6 %142
316fd4e5da5Sopenharmony_ci  %149 = OpSLessThan %26 %148 %41
317fd4e5da5Sopenharmony_ci         OpBranchConditional %149 %144 %145
318fd4e5da5Sopenharmony_ci  %144 = OpLabel
319fd4e5da5Sopenharmony_ci         OpBranch %146
320fd4e5da5Sopenharmony_ci  %146 = OpLabel
321fd4e5da5Sopenharmony_ci  %150 = OpLoad %6 %142
322fd4e5da5Sopenharmony_ci  %151 = OpIAdd %6 %150 %41
323fd4e5da5Sopenharmony_ci         OpStore %142 %151
324fd4e5da5Sopenharmony_ci         OpBranch %143
325fd4e5da5Sopenharmony_ci  %145 = OpLabel
326fd4e5da5Sopenharmony_ci  %152 = OpAccessChain %23 %20 %69
327fd4e5da5Sopenharmony_ci  %153 = OpLoad %16 %152
328fd4e5da5Sopenharmony_ci  %154 = OpAccessChain %23 %20 %72
329fd4e5da5Sopenharmony_ci  %155 = OpLoad %16 %154
330fd4e5da5Sopenharmony_ci  %156 = OpFOrdEqual %26 %153 %155
331fd4e5da5Sopenharmony_ci         OpSelectionMerge %158 None
332fd4e5da5Sopenharmony_ci         OpBranchConditional %156 %157 %158
333fd4e5da5Sopenharmony_ci  %157 = OpLabel
334fd4e5da5Sopenharmony_ci         OpBranch %137
335fd4e5da5Sopenharmony_ci  %158 = OpLabel
336fd4e5da5Sopenharmony_ci         OpBranch %138
337fd4e5da5Sopenharmony_ci  %138 = OpLabel
338fd4e5da5Sopenharmony_ci  %160 = OpLoad %6 %134
339fd4e5da5Sopenharmony_ci  %161 = OpIAdd %6 %160 %41
340fd4e5da5Sopenharmony_ci         OpStore %134 %161
341fd4e5da5Sopenharmony_ci         OpBranch %135
342fd4e5da5Sopenharmony_ci  %137 = OpLabel
343fd4e5da5Sopenharmony_ci         OpBranch %117
344fd4e5da5Sopenharmony_ci  %117 = OpLabel
345fd4e5da5Sopenharmony_ci         OpBranch %114
346fd4e5da5Sopenharmony_ci  %116 = OpLabel
347fd4e5da5Sopenharmony_ci         OpStore %163 %165
348fd4e5da5Sopenharmony_ci         OpReturn
349fd4e5da5Sopenharmony_ci         OpFunctionEnd
350fd4e5da5Sopenharmony_ci)";
351fd4e5da5Sopenharmony_ci  // clang-format on
352fd4e5da5Sopenharmony_ci  std::unique_ptr<IRContext> context =
353fd4e5da5Sopenharmony_ci      BuildModule(SPV_ENV_UNIVERSAL_1_1, nullptr, text,
354fd4e5da5Sopenharmony_ci                  SPV_TEXT_TO_BINARY_OPTION_PRESERVE_NUMERIC_IDS);
355fd4e5da5Sopenharmony_ci  Module* module = context->module();
356fd4e5da5Sopenharmony_ci  EXPECT_NE(nullptr, module) << "Assembling failed for shader:\n"
357fd4e5da5Sopenharmony_ci                             << text << std::endl;
358fd4e5da5Sopenharmony_ci
359fd4e5da5Sopenharmony_ci  const Function* f = spvtest::GetFunction(module, 4);
360fd4e5da5Sopenharmony_ci  DominatorAnalysis* analysis = context->GetDominatorAnalysis(f);
361fd4e5da5Sopenharmony_ci
362fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(5, 10));
363fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(5, 46));
364fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(5, 82));
365fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(5, 114));
366fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(5, 116));
367fd4e5da5Sopenharmony_ci
368fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 14));
369fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 11));
370fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 29));
371fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 33));
372fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 30));
373fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 32));
374fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 31));
375fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 13));
376fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(10, 12));
377fd4e5da5Sopenharmony_ci
378fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(12, 46));
379fd4e5da5Sopenharmony_ci
380fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 50));
381fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 47));
382fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 57));
383fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 61));
384fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 58));
385fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 60));
386fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 59));
387fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 77));
388fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 49));
389fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 76));
390fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(46, 48));
391fd4e5da5Sopenharmony_ci
392fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(48, 82));
393fd4e5da5Sopenharmony_ci
394fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 86));
395fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 83));
396fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 95));
397fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 99));
398fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 96));
399fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 103));
400fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 107));
401fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 104));
402fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 106));
403fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 105));
404fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 98));
405fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 97));
406fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 85));
407fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(82, 84));
408fd4e5da5Sopenharmony_ci
409fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(84, 114));
410fd4e5da5Sopenharmony_ci
411fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 118));
412fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 116));
413fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 115));
414fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 132));
415fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 135));
416fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 139));
417fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 136));
418fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 143));
419fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 147));
420fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 144));
421fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 146));
422fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 145));
423fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 158));
424fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 138));
425fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 137));
426fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 131));
427fd4e5da5Sopenharmony_ci  EXPECT_TRUE(analysis->Dominates(114, 117));
428fd4e5da5Sopenharmony_ci}
429fd4e5da5Sopenharmony_ci
430fd4e5da5Sopenharmony_ci}  // namespace
431fd4e5da5Sopenharmony_ci}  // namespace opt
432fd4e5da5Sopenharmony_ci}  // namespace spvtools
433