Index: llvm/trunk/include/llvm/FuzzMutate/OpDescriptor.h =================================================================== --- llvm/trunk/include/llvm/FuzzMutate/OpDescriptor.h +++ llvm/trunk/include/llvm/FuzzMutate/OpDescriptor.h @@ -20,6 +20,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DerivedTypes.h" +#include "llvm/IR/Instructions.h" #include "llvm/IR/Type.h" #include "llvm/IR/Value.h" #include @@ -128,7 +129,7 @@ static inline SourcePred anyPtrType() { auto Pred = [](ArrayRef, const Value *V) { - return V->getType()->isPointerTy(); + return V->getType()->isPointerTy() && !V->isSwiftError(); }; auto Make = [](ArrayRef, ArrayRef Ts) { std::vector Result; @@ -142,6 +143,9 @@ static inline SourcePred sizedPtrType() { auto Pred = [](ArrayRef, const Value *V) { + if (V->isSwiftError()) + return false; + if (const auto *PtrT = dyn_cast(V->getType())) return PtrT->getElementType()->isSized(); return false; Index: llvm/trunk/unittests/FuzzMutate/RandomIRBuilderTest.cpp =================================================================== --- llvm/trunk/unittests/FuzzMutate/RandomIRBuilderTest.cpp +++ llvm/trunk/unittests/FuzzMutate/RandomIRBuilderTest.cpp @@ -266,4 +266,34 @@ } } +TEST(RandomIRBuilderTest, SwiftError) { + // Check that we never pick swifterror value as a source for operation + // other than load, store and call. + + LLVMContext Ctx; + const char *SourceCode = "declare void @use(i8** swifterror %err)" + "define void @test() {\n" + "entry:\n" + " %err = alloca swifterror i8*, align 8\n" + " call void @use(i8** swifterror %err)\n" + " ret void\n" + "}"; + auto M = parseAssembly(SourceCode, Ctx); + + std::vector Types = {Type::getInt8Ty(Ctx)}; + RandomIRBuilder IB(Seed, Types); + + // Get first basic block of the test function + Function &F = *M->getFunction("test"); + BasicBlock &BB = *F.begin(); + Instruction *Alloca = &*BB.begin(); + + fuzzerop::OpDescriptor Descr = fuzzerop::gepDescriptor(1); + + for (int i = 0; i < 10; ++i) { + Value *V = IB.findOrCreateSource(BB, {Alloca}, {}, Descr.SourcePreds[0]); + ASSERT_FALSE(isa(V)); + } +} + }