// Copyright (c) 2020 Google LLC // // 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 "source/fuzz/transformation_compute_data_synonym_fact_closure.h" #include "gtest/gtest.h" #include "source/fuzz/fuzzer_util.h" #include "test/fuzz/fuzz_test_util.h" namespace spvtools { namespace fuzz { namespace { TEST(TransformationComputeDataSynonymFactClosureTest, DataSynonymFacts) { // The SPIR-V types and constants come from the following code. The body of // the SPIR-V function then constructs a composite that is synonymous with // myT. // // #version 310 es // // precision highp float; // // struct S { // int a; // uvec2 b; // }; // // struct T { // bool c[5]; // mat4x2 d; // S e; // }; // // void main() { // T myT = T(bool[5](true, false, true, false, true), // mat4x2(vec2(1.0, 2.0), vec2(3.0, 4.0), // vec2(5.0, 6.0), vec2(7.0, 8.0)), // S(10, uvec2(100u, 200u))); // } std::string shader = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %4 "main" OpExecutionMode %4 OriginUpperLeft OpSource ESSL 310 OpName %4 "main" OpName %15 "S" OpMemberName %15 0 "a" OpMemberName %15 1 "b" OpName %16 "T" OpMemberName %16 0 "c" OpMemberName %16 1 "d" OpMemberName %16 2 "e" OpName %18 "myT" OpMemberDecorate %15 0 RelaxedPrecision OpMemberDecorate %15 1 RelaxedPrecision %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeBool %7 = OpTypeInt 32 0 %8 = OpConstant %7 5 %9 = OpTypeArray %6 %8 %10 = OpTypeFloat 32 %11 = OpTypeVector %10 2 %12 = OpTypeMatrix %11 4 %13 = OpTypeInt 32 1 %14 = OpTypeVector %7 2 %15 = OpTypeStruct %13 %14 %16 = OpTypeStruct %9 %12 %15 %17 = OpTypePointer Function %16 %19 = OpConstantTrue %6 %20 = OpConstantFalse %6 %21 = OpConstantComposite %9 %19 %20 %19 %20 %19 %22 = OpConstant %10 1 %23 = OpConstant %10 2 %24 = OpConstantComposite %11 %22 %23 %25 = OpConstant %10 3 %26 = OpConstant %10 4 %27 = OpConstantComposite %11 %25 %26 %28 = OpConstant %10 5 %29 = OpConstant %10 6 %30 = OpConstantComposite %11 %28 %29 %31 = OpConstant %10 7 %32 = OpConstant %10 8 %33 = OpConstantComposite %11 %31 %32 %34 = OpConstantComposite %12 %24 %27 %30 %33 %35 = OpConstant %13 10 %36 = OpConstant %7 100 %37 = OpConstant %7 200 %38 = OpConstantComposite %14 %36 %37 %39 = OpConstantComposite %15 %35 %38 %40 = OpConstantComposite %16 %21 %34 %39 %4 = OpFunction %2 None %3 %5 = OpLabel %18 = OpVariable %17 Function OpStore %18 %40 %100 = OpCompositeConstruct %9 %19 %20 %19 %20 %19 %101 = OpCompositeConstruct %11 %22 %23 %102 = OpCompositeConstruct %11 %25 %26 %103 = OpCompositeConstruct %11 %28 %29 %104 = OpCompositeConstruct %11 %31 %32 %105 = OpCompositeConstruct %12 %101 %102 %103 %104 %106 = OpCompositeConstruct %14 %36 %37 %107 = OpCompositeConstruct %15 %35 %106 %108 = OpCompositeConstruct %16 %100 %105 %107 OpReturn OpFunctionEnd )"; const auto env = SPV_ENV_UNIVERSAL_1_3; const auto consumer = nullptr; const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption); spvtools::ValidatorOptions validator_options; ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options, kConsoleMessageConsumer)); TransformationContext transformation_context( MakeUnique(context.get()), validator_options); ASSERT_TRUE(TransformationComputeDataSynonymFactClosure(100).IsApplicable( context.get(), transformation_context)); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {1}), MakeDataDescriptor(101, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {1}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {})); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {}), MakeDataDescriptor(101, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {1}), MakeDataDescriptor(101, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(24, {0}), MakeDataDescriptor(101, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0})); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1})); ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100), context.get(), &transformation_context); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {}), MakeDataDescriptor(102, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {0}), MakeDataDescriptor(102, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(27, {1}), MakeDataDescriptor(102, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {0}), MakeDataDescriptor(103, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {1}), MakeDataDescriptor(103, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {1}), MakeDataDescriptor(104, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {}), MakeDataDescriptor(105, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2})); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {}), MakeDataDescriptor(103, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {0}), MakeDataDescriptor(103, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(30, {1}), MakeDataDescriptor(103, {1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {}), MakeDataDescriptor(104, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {1}), MakeDataDescriptor(104, {1}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {}), MakeDataDescriptor(105, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {0}), MakeDataDescriptor(105, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {1}), MakeDataDescriptor(105, {1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {2}), MakeDataDescriptor(105, {2}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3})); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(33, {0}), MakeDataDescriptor(104, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(34, {3}), MakeDataDescriptor(105, {3}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(21, {}), MakeDataDescriptor(100, {}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {0}), MakeDataDescriptor(100, {0})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {1}), MakeDataDescriptor(100, {1})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {2}), MakeDataDescriptor(100, {2})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {3}), MakeDataDescriptor(100, {3})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {4}), MakeDataDescriptor(100, {4})); ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100), context.get(), &transformation_context); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(21, {}), MakeDataDescriptor(100, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(39, {0}), MakeDataDescriptor(107, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(35, {}), MakeDataDescriptor(39, {0}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(39, {0}), MakeDataDescriptor(35, {})); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(39, {0}), MakeDataDescriptor(107, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(35, {}), MakeDataDescriptor(39, {0}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {}), MakeDataDescriptor(106, {}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {})); ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100), context.get(), &transformation_context); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {0}), MakeDataDescriptor(36, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {1}), MakeDataDescriptor(37, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(106, {0}), MakeDataDescriptor(36, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(106, {1}), MakeDataDescriptor(37, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(38, {}), MakeDataDescriptor(106, {}))); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {}), MakeDataDescriptor(108, {}))); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(107, {0}), MakeDataDescriptor(35, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(40, {0}), MakeDataDescriptor(108, {0})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(40, {1}), MakeDataDescriptor(108, {1})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(40, {2}), MakeDataDescriptor(108, {2})); ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100), context.get(), &transformation_context); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {}), MakeDataDescriptor(108, {}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0}), MakeDataDescriptor(108, {0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1}), MakeDataDescriptor(108, {1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {2}), MakeDataDescriptor(108, {2}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0, 0}), MakeDataDescriptor(108, {0, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0, 1}), MakeDataDescriptor(108, {0, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0, 2}), MakeDataDescriptor(108, {0, 2}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0, 3}), MakeDataDescriptor(108, {0, 3}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {0, 4}), MakeDataDescriptor(108, {0, 4}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 0}), MakeDataDescriptor(108, {1, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 1}), MakeDataDescriptor(108, {1, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 2}), MakeDataDescriptor(108, {1, 2}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 3}), MakeDataDescriptor(108, {1, 3}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 0, 0}), MakeDataDescriptor(108, {1, 0, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 1, 0}), MakeDataDescriptor(108, {1, 1, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 2, 0}), MakeDataDescriptor(108, {1, 2, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 3, 0}), MakeDataDescriptor(108, {1, 3, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 0, 1}), MakeDataDescriptor(108, {1, 0, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 1, 1}), MakeDataDescriptor(108, {1, 1, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 2, 1}), MakeDataDescriptor(108, {1, 2, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {1, 3, 1}), MakeDataDescriptor(108, {1, 3, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {2, 0}), MakeDataDescriptor(108, {2, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {2, 1}), MakeDataDescriptor(108, {2, 1}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {2, 1, 0}), MakeDataDescriptor(108, {2, 1, 0}))); ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(40, {2, 1, 1}), MakeDataDescriptor(108, {2, 1, 1}))); } TEST(TransformationComputeDataSynonymFactClosureTest, ComputeClosureWithMissingIds) { std::string shader = R"( OpCapability Shader %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %12 "main" OpExecutionMode %12 OriginUpperLeft OpSource ESSL 310 %2 = OpTypeVoid %3 = OpTypeFunction %2 %6 = OpTypeInt 32 1 %7 = OpTypeVector %6 4 %15 = OpConstant %6 24 %16 = OpConstantComposite %7 %15 %15 %15 %15 %17 = OpConstantComposite %7 %15 %15 %15 %15 %18 = OpTypeStruct %7 %19 = OpConstantComposite %18 %16 %30 = OpConstantComposite %18 %17 %12 = OpFunction %2 None %3 %13 = OpLabel %50 = OpCopyObject %7 %16 %51 = OpCopyObject %7 %17 %20 = OpCopyObject %6 %15 %21 = OpCopyObject %6 %15 %22 = OpCopyObject %6 %15 OpReturn OpFunctionEnd )"; const auto env = SPV_ENV_UNIVERSAL_1_3; const auto consumer = nullptr; const auto context = BuildModule(env, consumer, shader, kFuzzAssembleOption); ValidatorOptions validator_options; ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options, kConsoleMessageConsumer)); TransformationContext transformation_context( MakeUnique(context.get()), validator_options); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(20, {}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(21, {}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(22, {}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(17, {0}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(17, {1}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(17, {2}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(17, {3}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(16, {0}), MakeDataDescriptor(20, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(16, {1}), MakeDataDescriptor(21, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(16, {2}), MakeDataDescriptor(22, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(16, {3}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(51, {0}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(51, {1}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(51, {2}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(51, {3}), MakeDataDescriptor(15, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(50, {0}), MakeDataDescriptor(20, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(50, {1}), MakeDataDescriptor(21, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(50, {2}), MakeDataDescriptor(22, {})); transformation_context.GetFactManager()->AddFactDataSynonym( MakeDataDescriptor(50, {3}), MakeDataDescriptor(15, {})); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(19, {}), MakeDataDescriptor(30, {}))); context->KillDef(20); context->KillDef(21); context->KillDef(22); context->KillDef(50); context->KillDef(51); context->InvalidateAnalysesExceptFor(opt::IRContext::kAnalysisNone); ApplyAndCheckFreshIds(TransformationComputeDataSynonymFactClosure(100), context.get(), &transformation_context); ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous( MakeDataDescriptor(19, {}), MakeDataDescriptor(30, {}))); } } // namespace } // namespace fuzz } // namespace spvtools