blob: 7a36c5c75a35d98c068cb2ecf573bc660e6f407a [file] [log] [blame]
// 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<FactManager>(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<FactManager>(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