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