diff --git a/llvm/lib/FuzzMutate/IRMutator.cpp b/llvm/lib/FuzzMutate/IRMutator.cpp --- a/llvm/lib/FuzzMutate/IRMutator.cpp +++ b/llvm/lib/FuzzMutate/IRMutator.cpp @@ -243,7 +243,7 @@ break; case Instruction::FCmp: - CI = cast(&Inst); + CI = cast(&Inst); for (unsigned p = CmpInst::FIRST_FCMP_PREDICATE; p <= CmpInst::LAST_FCMP_PREDICATE; p++) { Modifications.push_back( diff --git a/llvm/unittests/FuzzMutate/StrategiesTest.cpp b/llvm/unittests/FuzzMutate/StrategiesTest.cpp --- a/llvm/unittests/FuzzMutate/StrategiesTest.cpp +++ b/llvm/unittests/FuzzMutate/StrategiesTest.cpp @@ -245,6 +245,31 @@ EXPECT_TRUE(FoundNE); } +TEST(InstModificationIRStrategyTest, FCmp) { + LLVMContext Ctx; + StringRef Source = "\n\ + define i1 @test(float %x) {\n\ + %a = fcmp oeq float %x, 10.0\n\ + ret i1 %a\n\ + }"; + + auto Mutator = createMutator(); + ASSERT_TRUE(Mutator); + + auto M = parseAssembly(Source.data(), Ctx); + auto &F = *M->begin(); + CmpInst *CI = cast(&*F.begin()->begin()); + ASSERT_TRUE(M && !verifyModule(*M, &errs())); + bool FoundONE = false; + for (int i = 0; i < 100; ++i) { + Mutator->mutateModule(*M, Seed + i, Source.size(), Source.size() + 100); + EXPECT_TRUE(!verifyModule(*M, &errs())); + FoundONE |= CI->getPredicate() == CmpInst::FCMP_ONE; + } + + EXPECT_TRUE(FoundONE); +} + TEST(InstModificationIRStrategyTest, GEP) { LLVMContext Ctx; StringRef Source = "\n\