1fd4e5da5Sopenharmony_ci// Copyright (c) 2016 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 "test/opt/pass_fixture.h"
16fd4e5da5Sopenharmony_ci#include "test/opt/pass_utils.h"
17fd4e5da5Sopenharmony_ci
18fd4e5da5Sopenharmony_cinamespace spvtools {
19fd4e5da5Sopenharmony_cinamespace opt {
20fd4e5da5Sopenharmony_cinamespace {
21fd4e5da5Sopenharmony_ci
22fd4e5da5Sopenharmony_ci// A pass turning all none debug line instructions into Nop.
23fd4e5da5Sopenharmony_ciclass NopifyPass : public Pass {
24fd4e5da5Sopenharmony_ci public:
25fd4e5da5Sopenharmony_ci  const char* name() const override { return "NopifyPass"; }
26fd4e5da5Sopenharmony_ci  Status Process() override {
27fd4e5da5Sopenharmony_ci    bool modified = false;
28fd4e5da5Sopenharmony_ci    context()->module()->ForEachInst(
29fd4e5da5Sopenharmony_ci        [&modified](Instruction* inst) {
30fd4e5da5Sopenharmony_ci          inst->ToNop();
31fd4e5da5Sopenharmony_ci          modified = true;
32fd4e5da5Sopenharmony_ci        },
33fd4e5da5Sopenharmony_ci        /* run_on_debug_line_insts = */ false);
34fd4e5da5Sopenharmony_ci    return modified ? Status::SuccessWithChange : Status::SuccessWithoutChange;
35fd4e5da5Sopenharmony_ci  }
36fd4e5da5Sopenharmony_ci};
37fd4e5da5Sopenharmony_ci
38fd4e5da5Sopenharmony_ciusing PassTestForLineDebugInfo = PassTest<::testing::Test>;
39fd4e5da5Sopenharmony_ci
40fd4e5da5Sopenharmony_ci// This test's purpose to show our implementation choice: line debug info is
41fd4e5da5Sopenharmony_ci// preserved even if the following instruction is killed. It serves as a guard
42fd4e5da5Sopenharmony_ci// of potential behavior changes.
43fd4e5da5Sopenharmony_ciTEST_F(PassTestForLineDebugInfo, KeepLineDebugInfo) {
44fd4e5da5Sopenharmony_ci  // clang-format off
45fd4e5da5Sopenharmony_ci  const char* text =
46fd4e5da5Sopenharmony_ci               "OpCapability Shader "
47fd4e5da5Sopenharmony_ci          "%1 = OpExtInstImport \"GLSL.std.450\" "
48fd4e5da5Sopenharmony_ci               "OpMemoryModel Logical GLSL450 "
49fd4e5da5Sopenharmony_ci               "OpEntryPoint Vertex %2 \"main\" "
50fd4e5da5Sopenharmony_ci          "%3 = OpString \"minimal.vert\" "
51fd4e5da5Sopenharmony_ci               "OpNoLine "
52fd4e5da5Sopenharmony_ci               "OpLine %3 10 10 "
53fd4e5da5Sopenharmony_ci       "%void = OpTypeVoid "
54fd4e5da5Sopenharmony_ci               "OpLine %3 100 100 "
55fd4e5da5Sopenharmony_ci          "%5 = OpTypeFunction %void "
56fd4e5da5Sopenharmony_ci          "%2 = OpFunction %void None %5 "
57fd4e5da5Sopenharmony_ci               "OpLine %3 1 1 "
58fd4e5da5Sopenharmony_ci               "OpNoLine "
59fd4e5da5Sopenharmony_ci               "OpLine %3 2 2 "
60fd4e5da5Sopenharmony_ci               "OpLine %3 3 3 "
61fd4e5da5Sopenharmony_ci          "%6 = OpLabel "
62fd4e5da5Sopenharmony_ci               "OpLine %3 4 4 "
63fd4e5da5Sopenharmony_ci               "OpNoLine "
64fd4e5da5Sopenharmony_ci               "OpReturn "
65fd4e5da5Sopenharmony_ci               "OpLine %3 4 4 "
66fd4e5da5Sopenharmony_ci               "OpNoLine "
67fd4e5da5Sopenharmony_ci               "OpFunctionEnd ";
68fd4e5da5Sopenharmony_ci  // clang-format on
69fd4e5da5Sopenharmony_ci
70fd4e5da5Sopenharmony_ci  const char* result_keep_nop =
71fd4e5da5Sopenharmony_ci      "OpNop\n"
72fd4e5da5Sopenharmony_ci      "OpNop\n"
73fd4e5da5Sopenharmony_ci      "OpNop\n"
74fd4e5da5Sopenharmony_ci      "OpNop\n"
75fd4e5da5Sopenharmony_ci      "OpNop\n"
76fd4e5da5Sopenharmony_ci      "OpNoLine\n"
77fd4e5da5Sopenharmony_ci      "OpLine %3 10 10\n"
78fd4e5da5Sopenharmony_ci      "OpNop\n"
79fd4e5da5Sopenharmony_ci      "OpLine %3 100 100\n"
80fd4e5da5Sopenharmony_ci      "OpNop\n"
81fd4e5da5Sopenharmony_ci      "OpNop\n"
82fd4e5da5Sopenharmony_ci      "OpLine %3 1 1\n"
83fd4e5da5Sopenharmony_ci      "OpNoLine\n"
84fd4e5da5Sopenharmony_ci      "OpLine %3 2 2\n"
85fd4e5da5Sopenharmony_ci      "OpLine %3 3 3\n"
86fd4e5da5Sopenharmony_ci      "OpNop\n"
87fd4e5da5Sopenharmony_ci      "OpLine %3 4 4\n"
88fd4e5da5Sopenharmony_ci      "OpNoLine\n"
89fd4e5da5Sopenharmony_ci      "OpNop\n"
90fd4e5da5Sopenharmony_ci      "OpLine %3 4 4\n"
91fd4e5da5Sopenharmony_ci      "OpNoLine\n"
92fd4e5da5Sopenharmony_ci      "OpNop\n";
93fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NopifyPass>(text, result_keep_nop,
94fd4e5da5Sopenharmony_ci                                    /* skip_nop = */ false);
95fd4e5da5Sopenharmony_ci  const char* result_skip_nop =
96fd4e5da5Sopenharmony_ci      "OpNoLine\n"
97fd4e5da5Sopenharmony_ci      "OpLine %3 10 10\n"
98fd4e5da5Sopenharmony_ci      "OpLine %3 100 100\n"
99fd4e5da5Sopenharmony_ci      "OpLine %3 1 1\n"
100fd4e5da5Sopenharmony_ci      "OpNoLine\n"
101fd4e5da5Sopenharmony_ci      "OpLine %3 2 2\n"
102fd4e5da5Sopenharmony_ci      "OpLine %3 3 3\n"
103fd4e5da5Sopenharmony_ci      "OpLine %3 4 4\n"
104fd4e5da5Sopenharmony_ci      "OpNoLine\n"
105fd4e5da5Sopenharmony_ci      "OpLine %3 4 4\n"
106fd4e5da5Sopenharmony_ci      "OpNoLine\n";
107fd4e5da5Sopenharmony_ci  SinglePassRunAndCheck<NopifyPass>(text, result_skip_nop,
108fd4e5da5Sopenharmony_ci                                    /* skip_nop = */ true);
109fd4e5da5Sopenharmony_ci}
110fd4e5da5Sopenharmony_ci
111fd4e5da5Sopenharmony_ci}  // namespace
112fd4e5da5Sopenharmony_ci}  // namespace opt
113fd4e5da5Sopenharmony_ci}  // namespace spvtools
114