blob: d6b2ce51a395473603fa8dff654e30d9dcdcc2b4 [file] [log] [blame]
// Copyright (c) 2020 André Perez Maselco
//
// 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_add_bit_instruction_synonym.h"
#include "gtest/gtest.h"
#include "source/fuzz/fuzzer_util.h"
#include "source/fuzz/instruction_descriptor.h"
#include "test/fuzz/fuzz_test_util.h"
namespace spvtools {
namespace fuzz {
namespace {
TEST(TransformationAddBitInstructionSynonymTest, IsApplicable) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
; Supported bit instructions
%39 = OpBitwiseOr %2 %5 %6
%40 = OpBitwiseXor %2 %7 %8
%41 = OpBitwiseAnd %2 %9 %10
%42 = OpNot %2 %11
; Not yet supported bit instructions
%43 = OpShiftRightLogical %2 %12 %13
%44 = OpShiftRightArithmetic %2 %14 %15
%45 = OpShiftLeftLogical %2 %16 %17
%46 = OpBitReverse %2 %18
%47 = OpBitCount %2 %19
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Tests undefined bit instruction.
auto transformation = TransformationAddBitInstructionSynonym(
48, {49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87,
88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113,
114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152,
153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165,
166, 167, 168, 169, 170, 171, 172, 173, 174, 175});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Tests false bit instruction.
transformation = TransformationAddBitInstructionSynonym(
38, {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Tests the number of fresh ids being different than the necessary.
transformation = TransformationAddBitInstructionSynonym(
39,
{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103,
104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131,
132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145,
146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Tests non-fresh ids.
transformation = TransformationAddBitInstructionSynonym(
40, {47, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Tests unsupported transformation.
transformation = TransformationAddBitInstructionSynonym(
43, {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Tests supported transformation.
transformation = TransformationAddBitInstructionSynonym(
41, {48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86,
87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138,
139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
165, 166, 167, 168, 169, 170, 171, 172, 173, 174});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
}
TEST(TransformationAddBitInstructionSynonymTest, AddOpBitwiseOrSynonym) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
%39 = OpBitwiseOr %2 %5 %6 ; bit instruction
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Adds OpBitwiseOr synonym.
auto transformation = TransformationAddBitInstructionSynonym(
39, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
157, 158, 159, 160, 161, 162, 163, 164, 165, 166});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
ApplyAndCheckFreshIds(transformation, context.get(), &transformation_context);
ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
MakeDataDescriptor(166, {}), MakeDataDescriptor(39, {})));
std::string variant_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
; Add OpBitwiseOr synonym
%40 = OpBitFieldUExtract %2 %5 %5 %6 ; extracts bit 0 from %5
%41 = OpBitFieldUExtract %2 %6 %5 %6 ; extracts bit 0 from %6
%42 = OpBitwiseOr %2 %40 %41
%43 = OpBitFieldUExtract %2 %5 %6 %6 ; extracts bit 1 from %5
%44 = OpBitFieldUExtract %2 %6 %6 %6 ; extracts bit 1 from %6
%45 = OpBitwiseOr %2 %43 %44
%46 = OpBitFieldUExtract %2 %5 %7 %6 ; extracts bit 2 from %5
%47 = OpBitFieldUExtract %2 %6 %7 %6 ; extracts bit 2 from %6
%48 = OpBitwiseOr %2 %46 %47
%49 = OpBitFieldUExtract %2 %5 %8 %6 ; extracts bit 3 from %5
%50 = OpBitFieldUExtract %2 %6 %8 %6 ; extracts bit 3 from %6
%51 = OpBitwiseOr %2 %49 %50
%52 = OpBitFieldUExtract %2 %5 %9 %6 ; extracts bit 4 from %5
%53 = OpBitFieldUExtract %2 %6 %9 %6 ; extracts bit 4 from %6
%54 = OpBitwiseOr %2 %52 %53
%55 = OpBitFieldUExtract %2 %5 %10 %6 ; extracts bit 5 from %5
%56 = OpBitFieldUExtract %2 %6 %10 %6 ; extracts bit 5 from %6
%57 = OpBitwiseOr %2 %55 %56
%58 = OpBitFieldUExtract %2 %5 %11 %6 ; extracts bit 6 from %5
%59 = OpBitFieldUExtract %2 %6 %11 %6 ; extracts bit 6 from %6
%60 = OpBitwiseOr %2 %58 %59
%61 = OpBitFieldUExtract %2 %5 %12 %6 ; extracts bit 7 from %5
%62 = OpBitFieldUExtract %2 %6 %12 %6 ; extracts bit 7 from %6
%63 = OpBitwiseOr %2 %61 %62
%64 = OpBitFieldUExtract %2 %5 %13 %6 ; extracts bit 8 from %5
%65 = OpBitFieldUExtract %2 %6 %13 %6 ; extracts bit 8 from %6
%66 = OpBitwiseOr %2 %64 %65
%67 = OpBitFieldUExtract %2 %5 %14 %6 ; extracts bit 9 from %5
%68 = OpBitFieldUExtract %2 %6 %14 %6 ; extracts bit 9 from %6
%69 = OpBitwiseOr %2 %67 %68
%70 = OpBitFieldUExtract %2 %5 %15 %6 ; extracts bit 10 from %5
%71 = OpBitFieldUExtract %2 %6 %15 %6 ; extracts bit 10 from %6
%72 = OpBitwiseOr %2 %70 %71
%73 = OpBitFieldUExtract %2 %5 %16 %6 ; extracts bit 11 from %5
%74 = OpBitFieldUExtract %2 %6 %16 %6 ; extracts bit 11 from %6
%75 = OpBitwiseOr %2 %73 %74
%76 = OpBitFieldUExtract %2 %5 %17 %6 ; extracts bit 12 from %5
%77 = OpBitFieldUExtract %2 %6 %17 %6 ; extracts bit 12 from %6
%78 = OpBitwiseOr %2 %76 %77
%79 = OpBitFieldUExtract %2 %5 %18 %6 ; extracts bit 13 from %5
%80 = OpBitFieldUExtract %2 %6 %18 %6 ; extracts bit 13 from %6
%81 = OpBitwiseOr %2 %79 %80
%82 = OpBitFieldUExtract %2 %5 %19 %6 ; extracts bit 14 from %5
%83 = OpBitFieldUExtract %2 %6 %19 %6 ; extracts bit 14 from %6
%84 = OpBitwiseOr %2 %82 %83
%85 = OpBitFieldUExtract %2 %5 %20 %6 ; extracts bit 15 from %5
%86 = OpBitFieldUExtract %2 %6 %20 %6 ; extracts bit 15 from %6
%87 = OpBitwiseOr %2 %85 %86
%88 = OpBitFieldUExtract %2 %5 %21 %6 ; extracts bit 16 from %5
%89 = OpBitFieldUExtract %2 %6 %21 %6 ; extracts bit 16 from %6
%90 = OpBitwiseOr %2 %88 %89
%91 = OpBitFieldUExtract %2 %5 %22 %6 ; extracts bit 17 from %5
%92 = OpBitFieldUExtract %2 %6 %22 %6 ; extracts bit 17 from %6
%93 = OpBitwiseOr %2 %91 %92
%94 = OpBitFieldUExtract %2 %5 %23 %6 ; extracts bit 18 from %5
%95 = OpBitFieldUExtract %2 %6 %23 %6 ; extracts bit 18 from %6
%96 = OpBitwiseOr %2 %94 %95
%97 = OpBitFieldUExtract %2 %5 %24 %6 ; extracts bit 19 from %5
%98 = OpBitFieldUExtract %2 %6 %24 %6 ; extracts bit 19 from %6
%99 = OpBitwiseOr %2 %97 %98
%100 = OpBitFieldUExtract %2 %5 %25 %6 ; extracts bit 20 from %5
%101 = OpBitFieldUExtract %2 %6 %25 %6 ; extracts bit 20 from %6
%102 = OpBitwiseOr %2 %100 %101
%103 = OpBitFieldUExtract %2 %5 %26 %6 ; extracts bit 21 from %5
%104 = OpBitFieldUExtract %2 %6 %26 %6 ; extracts bit 21 from %6
%105 = OpBitwiseOr %2 %103 %104
%106 = OpBitFieldUExtract %2 %5 %27 %6 ; extracts bit 22 from %5
%107 = OpBitFieldUExtract %2 %6 %27 %6 ; extracts bit 22 from %6
%108 = OpBitwiseOr %2 %106 %107
%109 = OpBitFieldUExtract %2 %5 %28 %6 ; extracts bit 23 from %5
%110 = OpBitFieldUExtract %2 %6 %28 %6 ; extracts bit 23 from %6
%111 = OpBitwiseOr %2 %109 %110
%112 = OpBitFieldUExtract %2 %5 %29 %6 ; extracts bit 24 from %5
%113 = OpBitFieldUExtract %2 %6 %29 %6 ; extracts bit 24 from %6
%114 = OpBitwiseOr %2 %112 %113
%115 = OpBitFieldUExtract %2 %5 %30 %6 ; extracts bit 25 from %5
%116 = OpBitFieldUExtract %2 %6 %30 %6 ; extracts bit 25 from %6
%117 = OpBitwiseOr %2 %115 %116
%118 = OpBitFieldUExtract %2 %5 %31 %6 ; extracts bit 26 from %5
%119 = OpBitFieldUExtract %2 %6 %31 %6 ; extracts bit 26 from %6
%120 = OpBitwiseOr %2 %118 %119
%121 = OpBitFieldUExtract %2 %5 %32 %6 ; extracts bit 27 from %5
%122 = OpBitFieldUExtract %2 %6 %32 %6 ; extracts bit 27 from %6
%123 = OpBitwiseOr %2 %121 %122
%124 = OpBitFieldUExtract %2 %5 %33 %6 ; extracts bit 28 from %5
%125 = OpBitFieldUExtract %2 %6 %33 %6 ; extracts bit 28 from %6
%126 = OpBitwiseOr %2 %124 %125
%127 = OpBitFieldUExtract %2 %5 %34 %6 ; extracts bit 29 from %5
%128 = OpBitFieldUExtract %2 %6 %34 %6 ; extracts bit 29 from %6
%129 = OpBitwiseOr %2 %127 %128
%130 = OpBitFieldUExtract %2 %5 %35 %6 ; extracts bit 30 from %5
%131 = OpBitFieldUExtract %2 %6 %35 %6 ; extracts bit 30 from %6
%132 = OpBitwiseOr %2 %130 %131
%133 = OpBitFieldUExtract %2 %5 %36 %6 ; extracts bit 31 from %5
%134 = OpBitFieldUExtract %2 %6 %36 %6 ; extracts bit 31 from %6
%135 = OpBitwiseOr %2 %133 %134
%136 = OpBitFieldInsert %2 %42 %45 %6 %6 ; inserts bit 1
%137 = OpBitFieldInsert %2 %136 %48 %7 %6 ; inserts bit 2
%138 = OpBitFieldInsert %2 %137 %51 %8 %6 ; inserts bit 3
%139 = OpBitFieldInsert %2 %138 %54 %9 %6 ; inserts bit 4
%140 = OpBitFieldInsert %2 %139 %57 %10 %6 ; inserts bit 5
%141 = OpBitFieldInsert %2 %140 %60 %11 %6 ; inserts bit 6
%142 = OpBitFieldInsert %2 %141 %63 %12 %6 ; inserts bit 7
%143 = OpBitFieldInsert %2 %142 %66 %13 %6 ; inserts bit 8
%144 = OpBitFieldInsert %2 %143 %69 %14 %6 ; inserts bit 9
%145 = OpBitFieldInsert %2 %144 %72 %15 %6 ; inserts bit 10
%146 = OpBitFieldInsert %2 %145 %75 %16 %6 ; inserts bit 11
%147 = OpBitFieldInsert %2 %146 %78 %17 %6 ; inserts bit 12
%148 = OpBitFieldInsert %2 %147 %81 %18 %6 ; inserts bit 13
%149 = OpBitFieldInsert %2 %148 %84 %19 %6 ; inserts bit 14
%150 = OpBitFieldInsert %2 %149 %87 %20 %6 ; inserts bit 15
%151 = OpBitFieldInsert %2 %150 %90 %21 %6 ; inserts bit 16
%152 = OpBitFieldInsert %2 %151 %93 %22 %6 ; inserts bit 17
%153 = OpBitFieldInsert %2 %152 %96 %23 %6 ; inserts bit 18
%154 = OpBitFieldInsert %2 %153 %99 %24 %6 ; inserts bit 19
%155 = OpBitFieldInsert %2 %154 %102 %25 %6 ; inserts bit 20
%156 = OpBitFieldInsert %2 %155 %105 %26 %6 ; inserts bit 21
%157 = OpBitFieldInsert %2 %156 %108 %27 %6 ; inserts bit 22
%158 = OpBitFieldInsert %2 %157 %111 %28 %6 ; inserts bit 23
%159 = OpBitFieldInsert %2 %158 %114 %29 %6 ; inserts bit 24
%160 = OpBitFieldInsert %2 %159 %117 %30 %6 ; inserts bit 25
%161 = OpBitFieldInsert %2 %160 %120 %31 %6 ; inserts bit 26
%162 = OpBitFieldInsert %2 %161 %123 %32 %6 ; inserts bit 27
%163 = OpBitFieldInsert %2 %162 %126 %33 %6 ; inserts bit 28
%164 = OpBitFieldInsert %2 %163 %129 %34 %6 ; inserts bit 29
%165 = OpBitFieldInsert %2 %164 %132 %35 %6 ; inserts bit 30
%166 = OpBitFieldInsert %2 %165 %135 %36 %6 ; inserts bit 31
%39 = OpBitwiseOr %2 %5 %6
OpReturn
OpFunctionEnd
)";
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
ASSERT_TRUE(IsEqual(env, variant_shader, context.get()));
}
TEST(TransformationAddBitInstructionSynonymTest, AddOpNotSynonym) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
%39 = OpNot %2 %5 ; bit instruction
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Adds OpNot synonym.
auto transformation = TransformationAddBitInstructionSynonym(
39, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,
96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
ApplyAndCheckFreshIds(transformation, context.get(), &transformation_context);
ASSERT_TRUE(transformation_context.GetFactManager()->IsSynonymous(
MakeDataDescriptor(134, {}), MakeDataDescriptor(39, {})));
std::string variant_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
; Add OpNot synonym
%40 = OpBitFieldUExtract %2 %5 %5 %6 ; extracts bit 0 from %5
%41 = OpNot %2 %40
%42 = OpBitFieldUExtract %2 %5 %6 %6 ; extracts bit 1 from %5
%43 = OpNot %2 %42
%44 = OpBitFieldUExtract %2 %5 %7 %6 ; extracts bit 2 from %5
%45 = OpNot %2 %44
%46 = OpBitFieldUExtract %2 %5 %8 %6 ; extracts bit 3 from %5
%47 = OpNot %2 %46
%48 = OpBitFieldUExtract %2 %5 %9 %6 ; extracts bit 4 from %5
%49 = OpNot %2 %48
%50 = OpBitFieldUExtract %2 %5 %10 %6 ; extracts bit 5 from %5
%51 = OpNot %2 %50
%52 = OpBitFieldUExtract %2 %5 %11 %6 ; extracts bit 6 from %5
%53 = OpNot %2 %52
%54 = OpBitFieldUExtract %2 %5 %12 %6 ; extracts bit 7 from %5
%55 = OpNot %2 %54
%56 = OpBitFieldUExtract %2 %5 %13 %6 ; extracts bit 8 from %5
%57 = OpNot %2 %56
%58 = OpBitFieldUExtract %2 %5 %14 %6 ; extracts bit 9 from %5
%59 = OpNot %2 %58
%60 = OpBitFieldUExtract %2 %5 %15 %6 ; extracts bit 10 from %5
%61 = OpNot %2 %60
%62 = OpBitFieldUExtract %2 %5 %16 %6 ; extracts bit 11 from %5
%63 = OpNot %2 %62
%64 = OpBitFieldUExtract %2 %5 %17 %6 ; extracts bit 12 from %5
%65 = OpNot %2 %64
%66 = OpBitFieldUExtract %2 %5 %18 %6 ; extracts bit 13 from %5
%67 = OpNot %2 %66
%68 = OpBitFieldUExtract %2 %5 %19 %6 ; extracts bit 14 from %5
%69 = OpNot %2 %68
%70 = OpBitFieldUExtract %2 %5 %20 %6 ; extracts bit 15 from %5
%71 = OpNot %2 %70
%72 = OpBitFieldUExtract %2 %5 %21 %6 ; extracts bit 16 from %5
%73 = OpNot %2 %72
%74 = OpBitFieldUExtract %2 %5 %22 %6 ; extracts bit 17 from %5
%75 = OpNot %2 %74
%76 = OpBitFieldUExtract %2 %5 %23 %6 ; extracts bit 18 from %5
%77 = OpNot %2 %76
%78 = OpBitFieldUExtract %2 %5 %24 %6 ; extracts bit 19 from %5
%79 = OpNot %2 %78
%80 = OpBitFieldUExtract %2 %5 %25 %6 ; extracts bit 20 from %5
%81 = OpNot %2 %80
%82 = OpBitFieldUExtract %2 %5 %26 %6 ; extracts bit 21 from %5
%83 = OpNot %2 %82
%84 = OpBitFieldUExtract %2 %5 %27 %6 ; extracts bit 22 from %5
%85 = OpNot %2 %84
%86 = OpBitFieldUExtract %2 %5 %28 %6 ; extracts bit 23 from %5
%87 = OpNot %2 %86
%88 = OpBitFieldUExtract %2 %5 %29 %6 ; extracts bit 24 from %5
%89 = OpNot %2 %88
%90 = OpBitFieldUExtract %2 %5 %30 %6 ; extracts bit 25 from %5
%91 = OpNot %2 %90
%92 = OpBitFieldUExtract %2 %5 %31 %6 ; extracts bit 26 from %5
%93 = OpNot %2 %92
%94 = OpBitFieldUExtract %2 %5 %32 %6 ; extracts bit 27 from %5
%95 = OpNot %2 %94
%96 = OpBitFieldUExtract %2 %5 %33 %6 ; extracts bit 28 from %5
%97 = OpNot %2 %96
%98 = OpBitFieldUExtract %2 %5 %34 %6 ; extracts bit 29 from %5
%99 = OpNot %2 %98
%100 = OpBitFieldUExtract %2 %5 %35 %6 ; extracts bit 30 from %5
%101 = OpNot %2 %100
%102 = OpBitFieldUExtract %2 %5 %36 %6 ; extracts bit 31 from %5
%103 = OpNot %2 %102
%104 = OpBitFieldInsert %2 %41 %43 %6 %6 ; inserts bit 1
%105 = OpBitFieldInsert %2 %104 %45 %7 %6 ; inserts bit 2
%106 = OpBitFieldInsert %2 %105 %47 %8 %6 ; inserts bit 3
%107 = OpBitFieldInsert %2 %106 %49 %9 %6 ; inserts bit 4
%108 = OpBitFieldInsert %2 %107 %51 %10 %6 ; inserts bit 5
%109 = OpBitFieldInsert %2 %108 %53 %11 %6 ; inserts bit 6
%110 = OpBitFieldInsert %2 %109 %55 %12 %6 ; inserts bit 7
%111 = OpBitFieldInsert %2 %110 %57 %13 %6 ; inserts bit 8
%112 = OpBitFieldInsert %2 %111 %59 %14 %6 ; inserts bit 9
%113 = OpBitFieldInsert %2 %112 %61 %15 %6 ; inserts bit 10
%114 = OpBitFieldInsert %2 %113 %63 %16 %6 ; inserts bit 11
%115 = OpBitFieldInsert %2 %114 %65 %17 %6 ; inserts bit 12
%116 = OpBitFieldInsert %2 %115 %67 %18 %6 ; inserts bit 13
%117 = OpBitFieldInsert %2 %116 %69 %19 %6 ; inserts bit 14
%118 = OpBitFieldInsert %2 %117 %71 %20 %6 ; inserts bit 15
%119 = OpBitFieldInsert %2 %118 %73 %21 %6 ; inserts bit 16
%120 = OpBitFieldInsert %2 %119 %75 %22 %6 ; inserts bit 17
%121 = OpBitFieldInsert %2 %120 %77 %23 %6 ; inserts bit 18
%122 = OpBitFieldInsert %2 %121 %79 %24 %6 ; inserts bit 19
%123 = OpBitFieldInsert %2 %122 %81 %25 %6 ; inserts bit 20
%124 = OpBitFieldInsert %2 %123 %83 %26 %6 ; inserts bit 21
%125 = OpBitFieldInsert %2 %124 %85 %27 %6 ; inserts bit 22
%126 = OpBitFieldInsert %2 %125 %87 %28 %6 ; inserts bit 23
%127 = OpBitFieldInsert %2 %126 %89 %29 %6 ; inserts bit 24
%128 = OpBitFieldInsert %2 %127 %91 %30 %6 ; inserts bit 25
%129 = OpBitFieldInsert %2 %128 %93 %31 %6 ; inserts bit 26
%130 = OpBitFieldInsert %2 %129 %95 %32 %6 ; inserts bit 27
%131 = OpBitFieldInsert %2 %130 %97 %33 %6 ; inserts bit 28
%132 = OpBitFieldInsert %2 %131 %99 %34 %6 ; inserts bit 29
%133 = OpBitFieldInsert %2 %132 %101 %35 %6 ; inserts bit 30
%134 = OpBitFieldInsert %2 %133 %103 %36 %6 ; inserts bit 31
%39 = OpNot %2 %5
OpReturn
OpFunctionEnd
)";
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
ASSERT_TRUE(IsEqual(env, variant_shader, context.get()));
}
TEST(TransformationAddBitInstructionSynonymTest, NoSynonymWhenIdIsIrrelevant) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
%39 = OpBitwiseOr %2 %5 %6 ; bit instruction
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Mark the result id of the bit instruction as irrelevant.
transformation_context.GetFactManager()->AddFactIdIsIrrelevant(39);
// Adds OpBitwiseOr synonym.
auto transformation = TransformationAddBitInstructionSynonym(
39, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
157, 158, 159, 160, 161, 162, 163, 164, 165, 166});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
ApplyAndCheckFreshIds(transformation, context.get(), &transformation_context);
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
// No synonym should have been created, since the bit instruction is
// irrelevant.
ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
MakeDataDescriptor(166, {}), MakeDataDescriptor(39, {})));
}
TEST(TransformationAddBitInstructionSynonymTest, NoSynonymWhenBlockIsDead) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
%39 = OpBitwiseOr %2 %5 %6 ; bit instruction
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Mark the block where we will try to create the synonym as dead.
transformation_context.GetFactManager()->AddFactBlockIsDead(38);
// Adds OpBitwiseOr synonym.
auto transformation = TransformationAddBitInstructionSynonym(
39, {40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
157, 158, 159, 160, 161, 162, 163, 164, 165, 166});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
ApplyAndCheckFreshIds(transformation, context.get(), &transformation_context);
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
// No synonym should have been created, since the bit instruction is
// irrelevant.
ASSERT_FALSE(transformation_context.GetFactManager()->IsSynonymous(
MakeDataDescriptor(166, {}), MakeDataDescriptor(39, {})));
}
TEST(TransformationAddBitInstructionSynonymTest, DifferentSingedness) {
std::string reference_shader = R"(
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Vertex %37 "main"
; Types
%2 = OpTypeInt 32 0
%200 = OpTypeInt 32 1
%3 = OpTypeVoid
%4 = OpTypeFunction %3
; Constants
%5 = OpConstant %2 0
%6 = OpConstant %2 1
%7 = OpConstant %2 2
%8 = OpConstant %2 3
%9 = OpConstant %2 4
%10 = OpConstant %2 5
%11 = OpConstant %2 6
%12 = OpConstant %2 7
%13 = OpConstant %2 8
%14 = OpConstant %2 9
%15 = OpConstant %2 10
%16 = OpConstant %2 11
%17 = OpConstant %2 12
%18 = OpConstant %2 13
%19 = OpConstant %2 14
%20 = OpConstant %2 15
%21 = OpConstant %2 16
%22 = OpConstant %2 17
%23 = OpConstant %2 18
%24 = OpConstant %2 19
%25 = OpConstant %2 20
%26 = OpConstant %2 21
%27 = OpConstant %2 22
%28 = OpConstant %2 23
%29 = OpConstant %2 24
%30 = OpConstant %2 25
%31 = OpConstant %2 26
%32 = OpConstant %2 27
%33 = OpConstant %2 28
%34 = OpConstant %2 29
%35 = OpConstant %2 30
%36 = OpConstant %2 31
%45 = OpConstant %200 32
; main function
%37 = OpFunction %3 None %4
%38 = OpLabel
%39 = OpNot %200 %5 ; bit instruction
%40 = OpBitwiseOr %200 %6 %45 ; bit instruction
%41 = OpBitwiseAnd %2 %5 %6 ; bit instruction
OpReturn
OpFunctionEnd
)";
const auto env = SPV_ENV_UNIVERSAL_1_5;
const auto consumer = nullptr;
const auto context =
BuildModule(env, consumer, reference_shader, kFuzzAssembleOption);
spvtools::ValidatorOptions validator_options;
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(context.get(), validator_options,
kConsoleMessageConsumer));
TransformationContext transformation_context(
MakeUnique<FactManager>(context.get()), validator_options);
// Invalid because the sign of id 200 result is not equal to the sign of id 5
// operand in OpNot.
auto transformation = TransformationAddBitInstructionSynonym(
39, {300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325,
326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390,
391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403,
404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Invalid because the sign of two operands not the same and the first operand
// sign not equal the result sign in OpBitwiseOr.
transformation = TransformationAddBitInstructionSynonym(
40, {300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325,
326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338,
339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351,
352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,
365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377,
378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390,
391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403,
404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416,
417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427});
ASSERT_FALSE(
transformation.IsApplicable(context.get(), transformation_context));
// Successful transformation
{
// Instruction operands are the same and it's equal with the result sign in
// OpBitwiseAnd bitwise operation.
transformation = TransformationAddBitInstructionSynonym(
41, {46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58,
59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,
98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110,
111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136,
137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
163, 164, 165, 166, 167, 168, 169, 170, 171, 172});
ASSERT_TRUE(
transformation.IsApplicable(context.get(), transformation_context));
ApplyAndCheckFreshIds(transformation, context.get(),
&transformation_context);
ASSERT_TRUE(fuzzerutil::IsValidAndWellFormed(
context.get(), validator_options, kConsoleMessageConsumer));
}
}
} // namespace
} // namespace fuzz
} // namespace spvtools