Index: lib/FuzzMutate/Operations.cpp =================================================================== --- lib/FuzzMutate/Operations.cpp +++ lib/FuzzMutate/Operations.cpp @@ -240,9 +240,9 @@ auto Pred = [](ArrayRef Cur, const Value *V) { auto *CTy = cast(Cur[0]->getType()); if (auto *CI = dyn_cast(V)) - if (CI->getBitWidth() == 32) - if (CTy->getTypeAtIndex(CI->getZExtValue()) == V->getType()) - return true; + if (CI->getBitWidth() == 32 && + CTy->getTypeAtIndex(CI->getZExtValue()) == Cur[1]->getType()) + return true; return false; }; auto Make = [](ArrayRef Cur, ArrayRef Ts) { Index: unittests/FuzzMutate/RandomIRBuilderTest.cpp =================================================================== --- unittests/FuzzMutate/RandomIRBuilderTest.cpp +++ unittests/FuzzMutate/RandomIRBuilderTest.cpp @@ -84,4 +84,50 @@ } } +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 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 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)); + } + } +} + }