diff options
-rw-r--r-- | llvm/lib/FuzzMutate/RandomIRBuilder.cpp | 5 | ||||
-rw-r--r-- | llvm/unittests/FuzzMutate/RandomIRBuilderTest.cpp | 34 |
2 files changed, 37 insertions, 2 deletions
diff --git a/llvm/lib/FuzzMutate/RandomIRBuilder.cpp b/llvm/lib/FuzzMutate/RandomIRBuilder.cpp index 3c9a35986be..7dfe4c63e0b 100644 --- a/llvm/lib/FuzzMutate/RandomIRBuilder.cpp +++ b/llvm/lib/FuzzMutate/RandomIRBuilder.cpp @@ -76,12 +76,13 @@ static bool isCompatibleReplacement(const Instruction *I, const Use &Operand, case Instruction::ExtractValue: // TODO: We could potentially validate these, but for now just leave indices // alone. - if (Operand.getOperandNo() > 1) + if (Operand.getOperandNo() >= 1) return false; break; case Instruction::InsertValue: case Instruction::InsertElement: - if (Operand.getOperandNo() > 2) + case Instruction::ShuffleVector: + if (Operand.getOperandNo() >= 2) return false; break; default: diff --git a/llvm/unittests/FuzzMutate/RandomIRBuilderTest.cpp b/llvm/unittests/FuzzMutate/RandomIRBuilderTest.cpp index 55b75cd2653..5e1b338a95f 100644 --- a/llvm/unittests/FuzzMutate/RandomIRBuilderTest.cpp +++ b/llvm/unittests/FuzzMutate/RandomIRBuilderTest.cpp @@ -130,4 +130,38 @@ TEST(RandomIRBuilderTest, InsertValueIndexes) { } } +TEST(RandomIRBuilderTest, ShuffleVectorSink) { + // Check that we will never use shuffle vector mask as a sink form the + // unrelated operation. + + LLVMContext Ctx; + const char *SourceCode = + "define void @test(<4 x i32> %a) {\n" + " %S1 = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> undef\n" + " %S2 = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> undef\n" + " ret void\n" + "}"; + auto M = parseAssembly(SourceCode, Ctx); + + fuzzerop::OpDescriptor IVDescr = fuzzerop::insertValueDescriptor(1); + + RandomIRBuilder IB(Seed, {}); + + // Get first basic block of the first function + Function &F = *M->begin(); + BasicBlock &BB = *F.begin(); + + // Source is %S1 + Instruction *Source = &*BB.begin(); + // Sink is %S2 + SmallVector<Instruction *, 1> Sinks = {&*std::next(BB.begin())}; + + // Loop to account for random decisions + for (int i = 0; i < 10; ++i) { + // Try to connect S1 to S2. We should always create new sink. + IB.connectToSink(BB, Sinks, Source); + ASSERT_TRUE(!verifyModule(*M, &errs())); + } +} + } |