diff options
author | Igor Laevsky <igmyrj@gmail.com> | 2017-11-30 15:26:48 +0000 |
---|---|---|
committer | Igor Laevsky <igmyrj@gmail.com> | 2017-11-30 15:26:48 +0000 |
commit | 59e987ce53b475ea607d8cdfef1af7d8f2323e07 (patch) | |
tree | f15a6a961d0f01035e507c3934310cf38a3022b5 /unittests | |
parent | 703237d8da94cc579ca0238466d44d3ccd6928ff (diff) |
[FuzzMutate] Pick correct index for the insertvalue instruction
Differential Revision: https://reviews.llvm.org/D40395
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319440 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/FuzzMutate/RandomIRBuilderTest.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/unittests/FuzzMutate/RandomIRBuilderTest.cpp b/unittests/FuzzMutate/RandomIRBuilderTest.cpp index f8a50a117ba..55b75cd2653 100644 --- a/unittests/FuzzMutate/RandomIRBuilderTest.cpp +++ b/unittests/FuzzMutate/RandomIRBuilderTest.cpp @@ -84,4 +84,50 @@ TEST(RandomIRBuilderTest, ShuffleVectorIncorrectOperands) { } } +TEST(RandomIRBuilderTest, InsertValueIndexes) { + // Check that we will generate correct indexes for the insertvalue operation + + LLVMContext Ctx; + const char *Source = + "%T = type {i8, i32, i64}\n" + "define void @test() {\n" + " %A = alloca %T\n" + " %L = load %T, %T* %A" + " ret void\n" + "}"; + auto M = parseAssembly(Source, Ctx); + + fuzzerop::OpDescriptor IVDescr = fuzzerop::insertValueDescriptor(1); + + std::vector<Type *> Types = + {Type::getInt8Ty(Ctx), Type::getInt32Ty(Ctx), Type::getInt64Ty(Ctx)}; + RandomIRBuilder IB(Seed, Types); + + // Get first basic block of the first function + Function &F = *M->begin(); + BasicBlock &BB = *F.begin(); + + // Pick first source + Instruction *Src = &*std::next(BB.begin()); + + SmallVector<Value *, 2> Srcs(2); + ASSERT_TRUE(IVDescr.SourcePreds[0].matches({}, Src)); + Srcs[0] = Src; + + // Generate constants for each of the types and check that we pick correct + // index for the given type + for (auto *T: Types) { + // Loop to account for possible random decisions + for (int i = 0; i < 10; ++i) { + // Create value we want to insert. Only it's type matters. + Srcs[1] = ConstantInt::get(T, 5); + + // Try to pick correct index + Value *Src = IB.findOrCreateSource( + BB, &*BB.begin(), Srcs, IVDescr.SourcePreds[2]); + ASSERT_TRUE(IVDescr.SourcePreds[2].matches(Srcs, Src)); + } + } +} + } |