summaryrefslogtreecommitdiff
path: root/unittests
diff options
context:
space:
mode:
authorIgor Laevsky <igmyrj@gmail.com>2017-11-30 15:24:41 +0000
committerIgor Laevsky <igmyrj@gmail.com>2017-11-30 15:24:41 +0000
commit703237d8da94cc579ca0238466d44d3ccd6928ff (patch)
tree5162bd42d393d282c43837a4bac6038a86c780ba /unittests
parentc4f19979c791d2b6dd2fae30de867903de4e4cfb (diff)
[FuzzMutate] Don't create load as a new source if it doesn't match with the descriptor
Differential Revision: https://reviews.llvm.org/D40394 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@319439 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r--unittests/FuzzMutate/CMakeLists.txt1
-rw-r--r--unittests/FuzzMutate/RandomIRBuilderTest.cpp87
2 files changed, 88 insertions, 0 deletions
diff --git a/unittests/FuzzMutate/CMakeLists.txt b/unittests/FuzzMutate/CMakeLists.txt
index e50c15b377b..c4a5fcf4f14 100644
--- a/unittests/FuzzMutate/CMakeLists.txt
+++ b/unittests/FuzzMutate/CMakeLists.txt
@@ -9,4 +9,5 @@ add_llvm_unittest(FuzzMutateTests
OperationsTest.cpp
ReservoirSamplerTest.cpp
StrategiesTest.cpp
+ RandomIRBuilderTest.cpp
)
diff --git a/unittests/FuzzMutate/RandomIRBuilderTest.cpp b/unittests/FuzzMutate/RandomIRBuilderTest.cpp
new file mode 100644
index 00000000000..f8a50a117ba
--- /dev/null
+++ b/unittests/FuzzMutate/RandomIRBuilderTest.cpp
@@ -0,0 +1,87 @@
+//===- RandomIRBuilderTest.cpp - Tests for injector strategy --------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/FuzzMutate/RandomIRBuilder.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/AsmParser/Parser.h"
+#include "llvm/AsmParser/SlotMapping.h"
+#include "llvm/FuzzMutate/IRMutator.h"
+#include "llvm/FuzzMutate/OpDescriptor.h"
+#include "llvm/FuzzMutate/Operations.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IR/Verifier.h"
+#include "llvm/Support/SourceMgr.h"
+
+#include "gtest/gtest.h"
+
+using namespace llvm;
+
+static constexpr int Seed = 5;
+
+namespace {
+
+std::unique_ptr<Module> parseAssembly(
+ const char *Assembly, LLVMContext &Context) {
+
+ SMDiagnostic Error;
+ std::unique_ptr<Module> M = parseAssemblyString(Assembly, Error, Context);
+
+ std::string ErrMsg;
+ raw_string_ostream OS(ErrMsg);
+ Error.print("", OS);
+
+ assert(M && !verifyModule(*M, &errs()));
+ return M;
+}
+
+TEST(RandomIRBuilderTest, ShuffleVectorIncorrectOperands) {
+ // Test that we don't create load instruction as a source for the shuffle
+ // vector operation.
+
+ LLVMContext Ctx;
+ const char *Source =
+ "define <2 x i32> @test(<2 x i1> %cond, <2 x i32> %a) {\n"
+ " %A = alloca <2 x i32>\n"
+ " %I = insertelement <2 x i32> %a, i32 1, i32 1\n"
+ " ret <2 x i32> undef\n"
+ "}";
+ auto M = parseAssembly(Source, Ctx);
+
+ fuzzerop::OpDescriptor Descr = fuzzerop::shuffleVectorDescriptor(1);
+
+ // Empty known types since we ShuffleVector descriptor doesn't care about them
+ RandomIRBuilder IB(Seed, {});
+
+ // Get first basic block of the first function
+ Function &F = *M->begin();
+ BasicBlock &BB = *F.begin();
+
+ SmallVector<Instruction *, 32> Insts;
+ for (auto I = BB.getFirstInsertionPt(), E = BB.end(); I != E; ++I)
+ Insts.push_back(&*I);
+
+ // Pick first and second sources
+ SmallVector<Value *, 2> Srcs;
+ ASSERT_TRUE(Descr.SourcePreds[0].matches(Srcs, Insts[1]));
+ Srcs.push_back(Insts[1]);
+ ASSERT_TRUE(Descr.SourcePreds[1].matches(Srcs, Insts[1]));
+ Srcs.push_back(Insts[1]);
+
+ // Create new source. Check that it always matches with the descriptor.
+ // Run some iterations to account for random decisions.
+ for (int i = 0; i < 10; ++i) {
+ Value *LastSrc = IB.newSource(BB, Insts, Srcs, Descr.SourcePreds[2]);
+ ASSERT_TRUE(Descr.SourcePreds[2].matches(Srcs, LastSrc));
+ }
+}
+
+}