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