spirv-fuzz: Enable some passes with high probability (#3860)
Fixes #3764.
diff --git a/source/fuzz/fuzzer.cpp b/source/fuzz/fuzzer.cpp
index 4bf7338..4c196b6 100644
--- a/source/fuzz/fuzzer.cpp
+++ b/source/fuzz/fuzzer.cpp
@@ -132,9 +132,11 @@
Fuzzer::~Fuzzer() = default;
template <typename FuzzerPassT, typename... Args>
-void Fuzzer::MaybeAddRepeatedPass(RepeatedPassInstances* pass_instances,
+void Fuzzer::MaybeAddRepeatedPass(uint32_t percentage_chance_of_adding_pass,
+ RepeatedPassInstances* pass_instances,
Args&&... extra_args) {
- if (enable_all_passes_ || fuzzer_context_->ChooseEven()) {
+ if (enable_all_passes_ ||
+ fuzzer_context_->ChoosePercentage(percentage_chance_of_adding_pass)) {
pass_instances->SetPass(MakeUnique<FuzzerPassT>(
ir_context_.get(), transformation_context_.get(), fuzzer_context_.get(),
&transformation_sequence_out_, std::forward<Args>(extra_args)...));
@@ -217,12 +219,18 @@
initial_facts_);
RepeatedPassInstances pass_instances{};
+
+ // The following passes are likely to be very useful: many other passes
+ // introduce synonyms, irrelevant ids and constants that these passes can work
+ // with. We thus enable them with high probability.
+ MaybeAddRepeatedPass<FuzzerPassObfuscateConstants>(90, &pass_instances);
+ MaybeAddRepeatedPass<FuzzerPassApplyIdSynonyms>(90, &pass_instances);
+ MaybeAddRepeatedPass<FuzzerPassReplaceIrrelevantIds>(90, &pass_instances);
+
do {
// Each call to MaybeAddRepeatedPass randomly decides whether the given pass
// should be enabled, and adds an instance of the pass to |pass_instances|
// if it is enabled.
- // TODO(https://github.com/KhronosGroup/SPIRV-Tools/issues/3764): Consider
- // enabling some passes always, or with higher probability.
MaybeAddRepeatedPass<FuzzerPassAddAccessChains>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassAddBitInstructionSynonyms>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassAddCompositeInserts>(&pass_instances);
@@ -248,7 +256,6 @@
MaybeAddRepeatedPass<FuzzerPassAddSynonyms>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassAddVectorShuffleInstructions>(
&pass_instances);
- MaybeAddRepeatedPass<FuzzerPassApplyIdSynonyms>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassConstructComposites>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassCopyObjects>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassDonateModules>(&pass_instances,
@@ -262,7 +269,6 @@
&pass_instances);
MaybeAddRepeatedPass<FuzzerPassMergeBlocks>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassMutatePointers>(&pass_instances);
- MaybeAddRepeatedPass<FuzzerPassObfuscateConstants>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassOutlineFunctions>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassPermuteBlocks>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassPermuteFunctionParameters>(&pass_instances);
@@ -280,7 +286,6 @@
MaybeAddRepeatedPass<FuzzerPassReplaceParameterWithGlobal>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassReplaceLinearAlgebraInstructions>(
&pass_instances);
- MaybeAddRepeatedPass<FuzzerPassReplaceIrrelevantIds>(&pass_instances);
MaybeAddRepeatedPass<FuzzerPassReplaceOpPhiIdsFromDeadPredecessors>(
&pass_instances);
MaybeAddRepeatedPass<FuzzerPassReplaceOpSelectsWithConditionalBranches>(
diff --git a/source/fuzz/fuzzer.h b/source/fuzz/fuzzer.h
index 379c041..e502719 100644
--- a/source/fuzz/fuzzer.h
+++ b/source/fuzz/fuzzer.h
@@ -16,6 +16,7 @@
#define SOURCE_FUZZ_FUZZER_H_
#include <memory>
+#include <utility>
#include <vector>
#include "source/fuzz/fuzzer_context.h"
@@ -87,17 +88,27 @@
private:
// A convenience method to add a repeated fuzzer pass to |pass_instances| with
- // probability 0.5, or with probability 1 if |enable_all_passes_| is true.
+ // probability |percentage_chance_of_adding_pass|%, or with probability 100%
+ // if |enable_all_passes_| is true.
//
// All fuzzer passes take members |ir_context_|, |transformation_context_|,
// |fuzzer_context_| and |transformation_sequence_out_| as parameters. Extra
// arguments can be provided via |extra_args|.
template <typename FuzzerPassT, typename... Args>
- void MaybeAddRepeatedPass(RepeatedPassInstances* pass_instances,
+ void MaybeAddRepeatedPass(uint32_t percentage_chance_of_adding_pass,
+ RepeatedPassInstances* pass_instances,
Args&&... extra_args);
+ // The same as the above, with |percentage_chance_of_adding_pass| == 50%.
+ template <typename FuzzerPassT, typename... Args>
+ void MaybeAddRepeatedPass(RepeatedPassInstances* pass_instances,
+ Args&&... extra_args) {
+ MaybeAddRepeatedPass<FuzzerPassT>(50, pass_instances,
+ std::forward<Args>(extra_args)...);
+ }
+
// A convenience method to add a final fuzzer pass to |passes| with
- // probability 0.5, or with probability 1 if |enable_all_passes_| is true.
+ // probability 50%, or with probability 100% if |enable_all_passes_| is true.
//
// All fuzzer passes take members |ir_context_|, |transformation_context_|,
// |fuzzer_context_| and |transformation_sequence_out_| as parameters. Extra