forked from OSchip/llvm-project
[FuzzMutate] Don't use index operands as sinks
Differential Revision: https://reviews.llvm.org/D40396 llvm-svn: 319441
This commit is contained in:
parent
48147d012b
commit
65902db279
|
@ -76,12 +76,13 @@ static bool isCompatibleReplacement(const Instruction *I, const Use &Operand,
|
||||||
case Instruction::ExtractValue:
|
case Instruction::ExtractValue:
|
||||||
// TODO: We could potentially validate these, but for now just leave indices
|
// TODO: We could potentially validate these, but for now just leave indices
|
||||||
// alone.
|
// alone.
|
||||||
if (Operand.getOperandNo() > 1)
|
if (Operand.getOperandNo() >= 1)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
case Instruction::InsertValue:
|
case Instruction::InsertValue:
|
||||||
case Instruction::InsertElement:
|
case Instruction::InsertElement:
|
||||||
if (Operand.getOperandNo() > 2)
|
case Instruction::ShuffleVector:
|
||||||
|
if (Operand.getOperandNo() >= 2)
|
||||||
return false;
|
return false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -130,4 +130,38 @@ TEST(RandomIRBuilderTest, InsertValueIndexes) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(RandomIRBuilderTest, ShuffleVectorSink) {
|
||||||
|
// Check that we will never use shuffle vector mask as a sink form the
|
||||||
|
// unrelated operation.
|
||||||
|
|
||||||
|
LLVMContext Ctx;
|
||||||
|
const char *SourceCode =
|
||||||
|
"define void @test(<4 x i32> %a) {\n"
|
||||||
|
" %S1 = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> undef\n"
|
||||||
|
" %S2 = shufflevector <4 x i32> %a, <4 x i32> %a, <4 x i32> undef\n"
|
||||||
|
" ret void\n"
|
||||||
|
"}";
|
||||||
|
auto M = parseAssembly(SourceCode, Ctx);
|
||||||
|
|
||||||
|
fuzzerop::OpDescriptor IVDescr = fuzzerop::insertValueDescriptor(1);
|
||||||
|
|
||||||
|
RandomIRBuilder IB(Seed, {});
|
||||||
|
|
||||||
|
// Get first basic block of the first function
|
||||||
|
Function &F = *M->begin();
|
||||||
|
BasicBlock &BB = *F.begin();
|
||||||
|
|
||||||
|
// Source is %S1
|
||||||
|
Instruction *Source = &*BB.begin();
|
||||||
|
// Sink is %S2
|
||||||
|
SmallVector<Instruction *, 1> Sinks = {&*std::next(BB.begin())};
|
||||||
|
|
||||||
|
// Loop to account for random decisions
|
||||||
|
for (int i = 0; i < 10; ++i) {
|
||||||
|
// Try to connect S1 to S2. We should always create new sink.
|
||||||
|
IB.connectToSink(BB, Sinks, Source);
|
||||||
|
ASSERT_TRUE(!verifyModule(*M, &errs()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue