mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-27 05:10:41 +00:00
llvm-stress: Stabalize (by using an ordered container) and add randomness to the order in which loops are generated.
llvm-svn: 158908
This commit is contained in:
parent
b856af08dc
commit
e1481b910d
@ -82,6 +82,12 @@ public:
|
||||
uint64_t Val = Rand32();
|
||||
return Val | (uint64_t(Rand32()) << 32);
|
||||
}
|
||||
|
||||
/// Rand operator for STL algorithms.
|
||||
ptrdiff_t operator()(ptrdiff_t y) {
|
||||
return Rand64() % y;
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned Seed;
|
||||
};
|
||||
@ -599,15 +605,13 @@ struct CmpModifier: public Modifier {
|
||||
}
|
||||
};
|
||||
|
||||
void FillFunction(Function *F) {
|
||||
void FillFunction(Function *F, Random &R) {
|
||||
// Create a legal entry block.
|
||||
BasicBlock *BB = BasicBlock::Create(F->getContext(), "BB", F);
|
||||
ReturnInst::Create(F->getContext(), BB);
|
||||
|
||||
// Create the value table.
|
||||
Modifier::PieceTable PT;
|
||||
// Pick an initial seed value
|
||||
Random R(SeedCL);
|
||||
|
||||
// Consider arguments as legal values.
|
||||
for (Function::arg_iterator it = F->arg_begin(), e = F->arg_end();
|
||||
@ -648,15 +652,17 @@ void FillFunction(Function *F) {
|
||||
SM->ActN(5); // Throw in a few stores.
|
||||
}
|
||||
|
||||
void IntroduceControlFlow(Function *F) {
|
||||
std::set<Instruction*> BoolInst;
|
||||
void IntroduceControlFlow(Function *F, Random &R) {
|
||||
std::vector<Instruction*> BoolInst;
|
||||
for (BasicBlock::iterator it = F->begin()->begin(),
|
||||
e = F->begin()->end(); it != e; ++it) {
|
||||
if (it->getType() == IntegerType::getInt1Ty(F->getContext()))
|
||||
BoolInst.insert(it);
|
||||
BoolInst.push_back(it);
|
||||
}
|
||||
|
||||
for (std::set<Instruction*>::iterator it = BoolInst.begin(),
|
||||
std::random_shuffle(BoolInst.begin(), BoolInst.end(), R);
|
||||
|
||||
for (std::vector<Instruction*>::iterator it = BoolInst.begin(),
|
||||
e = BoolInst.end(); it != e; ++it) {
|
||||
Instruction *Instr = *it;
|
||||
BasicBlock *Curr = Instr->getParent();
|
||||
@ -678,8 +684,13 @@ int main(int argc, char **argv) {
|
||||
|
||||
std::auto_ptr<Module> M(new Module("/tmp/autogen.bc", getGlobalContext()));
|
||||
Function *F = GenEmptyFunction(M.get());
|
||||
FillFunction(F);
|
||||
IntroduceControlFlow(F);
|
||||
|
||||
// Pick an initial seed value
|
||||
Random R(SeedCL);
|
||||
// Generate lots of random instructions inside a single basic block.
|
||||
FillFunction(F, R);
|
||||
// Break the basic block into many loops.
|
||||
IntroduceControlFlow(F, R);
|
||||
|
||||
// Figure out what stream we are supposed to write to...
|
||||
OwningPtr<tool_output_file> Out;
|
||||
|
Loading…
Reference in New Issue
Block a user