[llvm] 43db7cb - [FuzzMutate] SinkInstructionStrategy

Peter Rong via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 29 16:19:00 PST 2022


Author: Peter Rong
Date: 2022-11-29T16:18:55-08:00
New Revision: 43db7cb4f5d576a18be538cd6d41669c798642ec

URL: https://github.com/llvm/llvm-project/commit/43db7cb4f5d576a18be538cd6d41669c798642ec
DIFF: https://github.com/llvm/llvm-project/commit/43db7cb4f5d576a18be538cd6d41669c798642ec.diff

LOG: [FuzzMutate] SinkInstructionStrategy

Randomlly select an instruction and try to use it in the future by replacing it with another instruction's operand.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D138948

Added: 
    

Modified: 
    llvm/include/llvm/FuzzMutate/IRMutator.h
    llvm/lib/FuzzMutate/IRMutator.cpp
    llvm/unittests/FuzzMutate/StrategiesTest.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/FuzzMutate/IRMutator.h b/llvm/include/llvm/FuzzMutate/IRMutator.h
index eccbd004b7bef..3d9837289e673 100644
--- a/llvm/include/llvm/FuzzMutate/IRMutator.h
+++ b/llvm/include/llvm/FuzzMutate/IRMutator.h
@@ -118,6 +118,19 @@ class InstModificationIRStrategy : public IRMutationStrategy {
   void mutate(Instruction &Inst, RandomIRBuilder &IB) override;
 };
 
+/// Strategy to select a random instruction and add a new sink (user) to it to
+/// increate data dependency.
+class SinkInstructionStrategy : public IRMutationStrategy {
+public:
+  uint64_t getWeight(size_t CurrentSize, size_t MaxSize,
+                     uint64_t CurrentWeight) override {
+    return 2;
+  }
+
+  void mutate(Function &F, RandomIRBuilder &IB) override;
+  void mutate(BasicBlock &BB, RandomIRBuilder &IB) override;
+};
+
 /// Strategy to randomly select a block and shuffle the operations without
 /// affecting data dependency.
 class ShuffleBlockStrategy : public IRMutationStrategy {

diff  --git a/llvm/lib/FuzzMutate/IRMutator.cpp b/llvm/lib/FuzzMutate/IRMutator.cpp
index bd8a87fb7c8a5..3b57a4d3e558e 100644
--- a/llvm/lib/FuzzMutate/IRMutator.cpp
+++ b/llvm/lib/FuzzMutate/IRMutator.cpp
@@ -299,6 +299,29 @@ void InstModificationIRStrategy::mutate(Instruction &Inst,
     RS.getSelection()();
 }
 
+void SinkInstructionStrategy::mutate(Function &F, RandomIRBuilder &IB) {
+  for (BasicBlock &BB : F) {
+    this->mutate(BB, IB);
+  }
+}
+void SinkInstructionStrategy::mutate(BasicBlock &BB, RandomIRBuilder &IB) {
+  SmallVector<Instruction *, 32> Insts;
+  for (auto I = BB.getFirstInsertionPt(), E = BB.end(); I != E; ++I)
+    Insts.push_back(&*I);
+  if (Insts.size() < 1)
+    return;
+  // Choose an Instruction to mutate.
+  uint64_t Idx = uniform<uint64_t>(IB.Rand, 0, Insts.size() - 1);
+  Instruction *Inst = Insts[Idx];
+  // `Idx + 1` so we don't sink to ourselves.
+  auto InstsAfter = makeArrayRef(Insts).slice(Idx + 1);
+  LLVMContext &C = BB.getParent()->getParent()->getContext();
+  // Don't sink terminators, void function calls, etc.
+  if (Inst->getType() != Type::getVoidTy(C))
+    // Find a new sink and wire up the results of the operation.
+    IB.connectToSink(BB, InstsAfter, Inst);
+}
+
 void ShuffleBlockStrategy::mutate(BasicBlock &BB, RandomIRBuilder &IB) {
 
   SmallPtrSet<Instruction *, 8> AliveInsts;

diff  --git a/llvm/unittests/FuzzMutate/StrategiesTest.cpp b/llvm/unittests/FuzzMutate/StrategiesTest.cpp
index 8ae37d1f7d558..c720bd03530db 100644
--- a/llvm/unittests/FuzzMutate/StrategiesTest.cpp
+++ b/llvm/unittests/FuzzMutate/StrategiesTest.cpp
@@ -310,6 +310,38 @@ TEST(InstModificationIRStrategyTest, DidntShuffleFRem) {
   VerfyDivDidntShuffle(Source);
 }
 
+TEST(SinkInstructionStrategy, Operand) {
+  LLVMContext Ctx;
+  StringRef Source = "\n\
+      define i32 @test(i1 %C1, i1 %C2, i1 %C3, i32 %I, i32 %J) { \n\
+        Entry:  \n\
+          %I100 = add i32 %I, 100  \n\
+          switch i32 %I100, label %BB0 [ \n\
+            i32 42, label %BB1  \n\
+          ] \n\
+        BB0:  \n\
+          %IAJ = add i32 %I, %J  \n\
+          %ISJ = sub i32 %I, %J  \n\
+          br label %Exit  \n\
+        BB1:  \n\
+          %IJ = mul i32 %I, %J  \n\
+          %C = and i1 %C2, %C3  \n\
+          br i1 %C, label %BB0, label %Exit  \n\
+        Exit:  \n\
+          ret i32 %I  \n\
+      }";
+  auto Mutator = createMutator<SinkInstructionStrategy>();
+  ASSERT_TRUE(Mutator);
+
+  auto M = parseAssembly(Source.data(), Ctx);
+  std::mt19937 mt(Seed);
+  std::uniform_int_distribution<int> RandInt(INT_MIN, INT_MAX);
+  for (int i = 0; i < 100; i++) {
+    Mutator->mutateModule(*M, RandInt(mt), Source.size(), Source.size() + 1024);
+    EXPECT_FALSE(verifyModule(*M, &errs()));
+  }
+}
+
 static void VerifyBlockShuffle(StringRef Source) {
   LLVMContext Ctx;
   auto Mutator = createMutator<ShuffleBlockStrategy>();


        


More information about the llvm-commits mailing list