mirror of
https://github.com/KhronosGroup/SPIRV-Tools
synced 2024-12-01 23:40:04 +00:00
033768c24b
Adds a new transformation that rewrites a scalar operation (like OpFAdd, opISub) as an equivalent vector operation, adding a synonym between the scalar result and an appropriate component of the vector result. Fixes #4195.
190 lines
9.3 KiB
C++
190 lines
9.3 KiB
C++
// 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.
|
|
|
|
#ifndef SOURCE_FUZZ_REPEATED_PASS_INSTANCES_H_
|
|
#define SOURCE_FUZZ_REPEATED_PASS_INSTANCES_H_
|
|
|
|
#include "source/fuzz/fuzzer_pass_add_access_chains.h"
|
|
#include "source/fuzz/fuzzer_pass_add_bit_instruction_synonyms.h"
|
|
#include "source/fuzz/fuzzer_pass_add_composite_extract.h"
|
|
#include "source/fuzz/fuzzer_pass_add_composite_inserts.h"
|
|
#include "source/fuzz/fuzzer_pass_add_composite_types.h"
|
|
#include "source/fuzz/fuzzer_pass_add_copy_memory.h"
|
|
#include "source/fuzz/fuzzer_pass_add_dead_blocks.h"
|
|
#include "source/fuzz/fuzzer_pass_add_dead_breaks.h"
|
|
#include "source/fuzz/fuzzer_pass_add_dead_continues.h"
|
|
#include "source/fuzz/fuzzer_pass_add_equation_instructions.h"
|
|
#include "source/fuzz/fuzzer_pass_add_function_calls.h"
|
|
#include "source/fuzz/fuzzer_pass_add_global_variables.h"
|
|
#include "source/fuzz/fuzzer_pass_add_image_sample_unused_components.h"
|
|
#include "source/fuzz/fuzzer_pass_add_loads.h"
|
|
#include "source/fuzz/fuzzer_pass_add_local_variables.h"
|
|
#include "source/fuzz/fuzzer_pass_add_loop_preheaders.h"
|
|
#include "source/fuzz/fuzzer_pass_add_loops_to_create_int_constant_synonyms.h"
|
|
#include "source/fuzz/fuzzer_pass_add_opphi_synonyms.h"
|
|
#include "source/fuzz/fuzzer_pass_add_parameters.h"
|
|
#include "source/fuzz/fuzzer_pass_add_relaxed_decorations.h"
|
|
#include "source/fuzz/fuzzer_pass_add_stores.h"
|
|
#include "source/fuzz/fuzzer_pass_add_synonyms.h"
|
|
#include "source/fuzz/fuzzer_pass_add_vector_shuffle_instructions.h"
|
|
#include "source/fuzz/fuzzer_pass_apply_id_synonyms.h"
|
|
#include "source/fuzz/fuzzer_pass_construct_composites.h"
|
|
#include "source/fuzz/fuzzer_pass_copy_objects.h"
|
|
#include "source/fuzz/fuzzer_pass_donate_modules.h"
|
|
#include "source/fuzz/fuzzer_pass_duplicate_regions_with_selections.h"
|
|
#include "source/fuzz/fuzzer_pass_expand_vector_reductions.h"
|
|
#include "source/fuzz/fuzzer_pass_flatten_conditional_branches.h"
|
|
#include "source/fuzz/fuzzer_pass_inline_functions.h"
|
|
#include "source/fuzz/fuzzer_pass_invert_comparison_operators.h"
|
|
#include "source/fuzz/fuzzer_pass_make_vector_operations_dynamic.h"
|
|
#include "source/fuzz/fuzzer_pass_merge_blocks.h"
|
|
#include "source/fuzz/fuzzer_pass_merge_function_returns.h"
|
|
#include "source/fuzz/fuzzer_pass_mutate_pointers.h"
|
|
#include "source/fuzz/fuzzer_pass_obfuscate_constants.h"
|
|
#include "source/fuzz/fuzzer_pass_outline_functions.h"
|
|
#include "source/fuzz/fuzzer_pass_permute_blocks.h"
|
|
#include "source/fuzz/fuzzer_pass_permute_function_parameters.h"
|
|
#include "source/fuzz/fuzzer_pass_permute_instructions.h"
|
|
#include "source/fuzz/fuzzer_pass_propagate_instructions_down.h"
|
|
#include "source/fuzz/fuzzer_pass_propagate_instructions_up.h"
|
|
#include "source/fuzz/fuzzer_pass_push_ids_through_variables.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_adds_subs_muls_with_carrying_extended.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_branches_from_dead_blocks_with_exits.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_copy_memories_with_loads_stores.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_copy_objects_with_stores_loads.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_irrelevant_ids.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_linear_algebra_instructions.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_loads_stores_with_copy_memories.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_opphi_ids_from_dead_predecessors.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_opselects_with_conditional_branches.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_parameter_with_global.h"
|
|
#include "source/fuzz/fuzzer_pass_replace_params_with_struct.h"
|
|
#include "source/fuzz/fuzzer_pass_split_blocks.h"
|
|
#include "source/fuzz/fuzzer_pass_swap_conditional_branch_operands.h"
|
|
#include "source/fuzz/fuzzer_pass_wrap_regions_in_selections.h"
|
|
#include "source/fuzz/fuzzer_pass_wrap_vector_synonym.h"
|
|
|
|
namespace spvtools {
|
|
namespace fuzz {
|
|
|
|
// This class has a distinct member for each repeated fuzzer pass (i.e., a
|
|
// fuzzer pass that it makes sense to run multiple times). If a member is null
|
|
// then we do not have an instance of that fuzzer pass, i.e. it is disabled.
|
|
// The class also provides access to the set of passes that are enabled.
|
|
class RepeatedPassInstances {
|
|
// This macro should be invoked below for every repeated fuzzer pass. If a
|
|
// repeated fuzzer pass is called FuzzerPassFoo then the macro invocation:
|
|
//
|
|
// REPEATED_PASS_INSTANCE(Foo);
|
|
//
|
|
// should be used. This adds a private member of type FuzzerPassFoo*, and
|
|
// provides the following public methods:
|
|
//
|
|
// // Requires that SetPass has not been called previously with FuzzerPassFoo.
|
|
// // Adds |pass| to the set of known pass instances.
|
|
// void SetPass(std::unique_ptr<FuzzerPassFoo> pass);
|
|
//
|
|
// // Returns a pointer to a pass instance of type FuzzerPassFoo that was
|
|
// // previously registered via SetPass(), or nullptr if no such instance was
|
|
// // registered
|
|
// FuzzerPassFoo* GetFoo();
|
|
#define REPEATED_PASS_INSTANCE(NAME) \
|
|
public: \
|
|
FuzzerPass##NAME* Get##NAME() const { return NAME##_; } \
|
|
void SetPass(std::unique_ptr<FuzzerPass##NAME> pass) { \
|
|
assert(NAME##_ == nullptr && "Attempt to set pass multiple times."); \
|
|
NAME##_ = pass.get(); \
|
|
passes_.push_back(std::move(pass)); \
|
|
} \
|
|
\
|
|
private: \
|
|
FuzzerPass##NAME* NAME##_ = nullptr
|
|
|
|
REPEATED_PASS_INSTANCE(AddAccessChains);
|
|
REPEATED_PASS_INSTANCE(AddBitInstructionSynonyms);
|
|
REPEATED_PASS_INSTANCE(AddCompositeExtract);
|
|
REPEATED_PASS_INSTANCE(AddCompositeInserts);
|
|
REPEATED_PASS_INSTANCE(AddCompositeTypes);
|
|
REPEATED_PASS_INSTANCE(AddCopyMemory);
|
|
REPEATED_PASS_INSTANCE(AddDeadBlocks);
|
|
REPEATED_PASS_INSTANCE(AddDeadBreaks);
|
|
REPEATED_PASS_INSTANCE(AddDeadContinues);
|
|
REPEATED_PASS_INSTANCE(AddEquationInstructions);
|
|
REPEATED_PASS_INSTANCE(AddFunctionCalls);
|
|
REPEATED_PASS_INSTANCE(AddGlobalVariables);
|
|
REPEATED_PASS_INSTANCE(AddImageSampleUnusedComponents);
|
|
REPEATED_PASS_INSTANCE(AddLoads);
|
|
REPEATED_PASS_INSTANCE(AddLocalVariables);
|
|
REPEATED_PASS_INSTANCE(AddLoopPreheaders);
|
|
REPEATED_PASS_INSTANCE(AddLoopsToCreateIntConstantSynonyms);
|
|
REPEATED_PASS_INSTANCE(AddOpPhiSynonyms);
|
|
REPEATED_PASS_INSTANCE(AddParameters);
|
|
REPEATED_PASS_INSTANCE(AddRelaxedDecorations);
|
|
REPEATED_PASS_INSTANCE(AddStores);
|
|
REPEATED_PASS_INSTANCE(AddSynonyms);
|
|
REPEATED_PASS_INSTANCE(AddVectorShuffleInstructions);
|
|
REPEATED_PASS_INSTANCE(ApplyIdSynonyms);
|
|
REPEATED_PASS_INSTANCE(ConstructComposites);
|
|
REPEATED_PASS_INSTANCE(CopyObjects);
|
|
REPEATED_PASS_INSTANCE(DonateModules);
|
|
REPEATED_PASS_INSTANCE(DuplicateRegionsWithSelections);
|
|
REPEATED_PASS_INSTANCE(ExpandVectorReductions);
|
|
REPEATED_PASS_INSTANCE(FlattenConditionalBranches);
|
|
REPEATED_PASS_INSTANCE(InlineFunctions);
|
|
REPEATED_PASS_INSTANCE(InvertComparisonOperators);
|
|
REPEATED_PASS_INSTANCE(MakeVectorOperationsDynamic);
|
|
REPEATED_PASS_INSTANCE(MergeBlocks);
|
|
REPEATED_PASS_INSTANCE(MergeFunctionReturns);
|
|
REPEATED_PASS_INSTANCE(MutatePointers);
|
|
REPEATED_PASS_INSTANCE(ObfuscateConstants);
|
|
REPEATED_PASS_INSTANCE(OutlineFunctions);
|
|
REPEATED_PASS_INSTANCE(PermuteBlocks);
|
|
REPEATED_PASS_INSTANCE(PermuteFunctionParameters);
|
|
REPEATED_PASS_INSTANCE(PermuteInstructions);
|
|
REPEATED_PASS_INSTANCE(PropagateInstructionsDown);
|
|
REPEATED_PASS_INSTANCE(PropagateInstructionsUp);
|
|
REPEATED_PASS_INSTANCE(PushIdsThroughVariables);
|
|
REPEATED_PASS_INSTANCE(ReplaceAddsSubsMulsWithCarryingExtended);
|
|
REPEATED_PASS_INSTANCE(ReplaceBranchesFromDeadBlocksWithExits);
|
|
REPEATED_PASS_INSTANCE(ReplaceCopyMemoriesWithLoadsStores);
|
|
REPEATED_PASS_INSTANCE(ReplaceCopyObjectsWithStoresLoads);
|
|
REPEATED_PASS_INSTANCE(ReplaceLoadsStoresWithCopyMemories);
|
|
REPEATED_PASS_INSTANCE(ReplaceIrrelevantIds);
|
|
REPEATED_PASS_INSTANCE(ReplaceOpPhiIdsFromDeadPredecessors);
|
|
REPEATED_PASS_INSTANCE(ReplaceOpSelectsWithConditionalBranches);
|
|
REPEATED_PASS_INSTANCE(ReplaceParameterWithGlobal);
|
|
REPEATED_PASS_INSTANCE(ReplaceLinearAlgebraInstructions);
|
|
REPEATED_PASS_INSTANCE(ReplaceParamsWithStruct);
|
|
REPEATED_PASS_INSTANCE(SplitBlocks);
|
|
REPEATED_PASS_INSTANCE(SwapBranchConditionalOperands);
|
|
REPEATED_PASS_INSTANCE(WrapRegionsInSelections);
|
|
REPEATED_PASS_INSTANCE(WrapVectorSynonym);
|
|
#undef REPEATED_PASS_INSTANCE
|
|
|
|
public:
|
|
// Yields the sequence of fuzzer pass instances that have been registered.
|
|
const std::vector<std::unique_ptr<FuzzerPass>>& GetPasses() const {
|
|
return passes_;
|
|
}
|
|
|
|
private:
|
|
// The distinct fuzzer pass instances that have been registered via SetPass().
|
|
std::vector<std::unique_ptr<FuzzerPass>> passes_;
|
|
};
|
|
|
|
} // namespace fuzz
|
|
} // namespace spvtools
|
|
|
|
#endif // SOURCE_FUZZ_REPEATED_PASS_INSTANCES_H_
|