Home | History | Annotate | Download | only in llvm-stress
      1 //===-- llvm-stress.cpp - Generate random LL files to stress-test LLVM ----===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This program is a utility that generates random .ll files to stress-test
     11 // different components in LLVM.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/Analysis/CallGraphSCCPass.h"
     16 #include "llvm/IR/Constants.h"
     17 #include "llvm/IR/IRPrintingPasses.h"
     18 #include "llvm/IR/Instruction.h"
     19 #include "llvm/IR/LLVMContext.h"
     20 #include "llvm/IR/LegacyPassNameParser.h"
     21 #include "llvm/IR/Module.h"
     22 #include "llvm/IR/Verifier.h"
     23 #include "llvm/PassManager.h"
     24 #include "llvm/Support/Debug.h"
     25 #include "llvm/Support/FileSystem.h"
     26 #include "llvm/Support/ManagedStatic.h"
     27 #include "llvm/Support/PluginLoader.h"
     28 #include "llvm/Support/PrettyStackTrace.h"
     29 #include "llvm/Support/ToolOutputFile.h"
     30 #include <algorithm>
     31 #include <set>
     32 #include <sstream>
     33 #include <vector>
     34 using namespace llvm;
     35 
     36 static cl::opt<unsigned> SeedCL("seed",
     37   cl::desc("Seed used for randomness"), cl::init(0));
     38 static cl::opt<unsigned> SizeCL("size",
     39   cl::desc("The estimated size of the generated function (# of instrs)"),
     40   cl::init(100));
     41 static cl::opt<std::string>
     42 OutputFilename("o", cl::desc("Override output filename"),
     43                cl::value_desc("filename"));
     44 
     45 static cl::opt<bool> GenHalfFloat("generate-half-float",
     46   cl::desc("Generate half-length floating-point values"), cl::init(false));
     47 static cl::opt<bool> GenX86FP80("generate-x86-fp80",
     48   cl::desc("Generate 80-bit X86 floating-point values"), cl::init(false));
     49 static cl::opt<bool> GenFP128("generate-fp128",
     50   cl::desc("Generate 128-bit floating-point values"), cl::init(false));
     51 static cl::opt<bool> GenPPCFP128("generate-ppc-fp128",
     52   cl::desc("Generate 128-bit PPC floating-point values"), cl::init(false));
     53 static cl::opt<bool> GenX86MMX("generate-x86-mmx",
     54   cl::desc("Generate X86 MMX floating-point values"), cl::init(false));
     55 
     56 namespace {
     57 /// A utility class to provide a pseudo-random number generator which is
     58 /// the same across all platforms. This is somewhat close to the libc
     59 /// implementation. Note: This is not a cryptographically secure pseudorandom
     60 /// number generator.
     61 class Random {
     62 public:
     63   /// C'tor
     64   Random(unsigned _seed):Seed(_seed) {}
     65 
     66   /// Return a random integer, up to a
     67   /// maximum of 2**19 - 1.
     68   uint32_t Rand() {
     69     uint32_t Val = Seed + 0x000b07a1;
     70     Seed = (Val * 0x3c7c0ac1);
     71     // Only lowest 19 bits are random-ish.
     72     return Seed & 0x7ffff;
     73   }
     74 
     75   /// Return a random 32 bit integer.
     76   uint32_t Rand32() {
     77     uint32_t Val = Rand();
     78     Val &= 0xffff;
     79     return Val | (Rand() << 16);
     80   }
     81 
     82   /// Return a random 64 bit integer.
     83   uint64_t Rand64() {
     84     uint64_t Val = Rand32();
     85     return Val | (uint64_t(Rand32()) << 32);
     86   }
     87 
     88   /// Rand operator for STL algorithms.
     89   ptrdiff_t operator()(ptrdiff_t y) {
     90     return  Rand64() % y;
     91   }
     92 
     93 private:
     94   unsigned Seed;
     95 };
     96 
     97 /// Generate an empty function with a default argument list.
     98 Function *GenEmptyFunction(Module *M) {
     99   // Type Definitions
    100   std::vector<Type*> ArgsTy;
    101   // Define a few arguments
    102   LLVMContext &Context = M->getContext();
    103   ArgsTy.push_back(PointerType::get(IntegerType::getInt8Ty(Context), 0));
    104   ArgsTy.push_back(PointerType::get(IntegerType::getInt32Ty(Context), 0));
    105   ArgsTy.push_back(PointerType::get(IntegerType::getInt64Ty(Context), 0));
    106   ArgsTy.push_back(IntegerType::getInt32Ty(Context));
    107   ArgsTy.push_back(IntegerType::getInt64Ty(Context));
    108   ArgsTy.push_back(IntegerType::getInt8Ty(Context));
    109 
    110   FunctionType *FuncTy = FunctionType::get(Type::getVoidTy(Context), ArgsTy, 0);
    111   // Pick a unique name to describe the input parameters
    112   std::stringstream ss;
    113   ss<<"autogen_SD"<<SeedCL;
    114   Function *Func = Function::Create(FuncTy, GlobalValue::ExternalLinkage,
    115                                     ss.str(), M);
    116 
    117   Func->setCallingConv(CallingConv::C);
    118   return Func;
    119 }
    120 
    121 /// A base class, implementing utilities needed for
    122 /// modifying and adding new random instructions.
    123 struct Modifier {
    124   /// Used to store the randomly generated values.
    125   typedef std::vector<Value*> PieceTable;
    126 
    127 public:
    128   /// C'tor
    129   Modifier(BasicBlock *Block, PieceTable *PT, Random *R):
    130     BB(Block),PT(PT),Ran(R),Context(BB->getContext()) {}
    131 
    132   /// virtual D'tor to silence warnings.
    133   virtual ~Modifier() {}
    134 
    135   /// Add a new instruction.
    136   virtual void Act() = 0;
    137   /// Add N new instructions,
    138   virtual void ActN(unsigned n) {
    139     for (unsigned i=0; i<n; ++i)
    140       Act();
    141   }
    142 
    143 protected:
    144   /// Return a random value from the list of known values.
    145   Value *getRandomVal() {
    146     assert(PT->size());
    147     return PT->at(Ran->Rand() % PT->size());
    148   }
    149 
    150   Constant *getRandomConstant(Type *Tp) {
    151     if (Tp->isIntegerTy()) {
    152       if (Ran->Rand() & 1)
    153         return ConstantInt::getAllOnesValue(Tp);
    154       return ConstantInt::getNullValue(Tp);
    155     } else if (Tp->isFloatingPointTy()) {
    156       if (Ran->Rand() & 1)
    157         return ConstantFP::getAllOnesValue(Tp);
    158       return ConstantFP::getNullValue(Tp);
    159     }
    160     return UndefValue::get(Tp);
    161   }
    162 
    163   /// Return a random value with a known type.
    164   Value *getRandomValue(Type *Tp) {
    165     unsigned index = Ran->Rand();
    166     for (unsigned i=0; i<PT->size(); ++i) {
    167       Value *V = PT->at((index + i) % PT->size());
    168       if (V->getType() == Tp)
    169         return V;
    170     }
    171 
    172     // If the requested type was not found, generate a constant value.
    173     if (Tp->isIntegerTy()) {
    174       if (Ran->Rand() & 1)
    175         return ConstantInt::getAllOnesValue(Tp);
    176       return ConstantInt::getNullValue(Tp);
    177     } else if (Tp->isFloatingPointTy()) {
    178       if (Ran->Rand() & 1)
    179         return ConstantFP::getAllOnesValue(Tp);
    180       return ConstantFP::getNullValue(Tp);
    181     } else if (Tp->isVectorTy()) {
    182       VectorType *VTp = cast<VectorType>(Tp);
    183 
    184       std::vector<Constant*> TempValues;
    185       TempValues.reserve(VTp->getNumElements());
    186       for (unsigned i = 0; i < VTp->getNumElements(); ++i)
    187         TempValues.push_back(getRandomConstant(VTp->getScalarType()));
    188 
    189       ArrayRef<Constant*> VectorValue(TempValues);
    190       return ConstantVector::get(VectorValue);
    191     }
    192 
    193     return UndefValue::get(Tp);
    194   }
    195 
    196   /// Return a random value of any pointer type.
    197   Value *getRandomPointerValue() {
    198     unsigned index = Ran->Rand();
    199     for (unsigned i=0; i<PT->size(); ++i) {
    200       Value *V = PT->at((index + i) % PT->size());
    201       if (V->getType()->isPointerTy())
    202         return V;
    203     }
    204     return UndefValue::get(pickPointerType());
    205   }
    206 
    207   /// Return a random value of any vector type.
    208   Value *getRandomVectorValue() {
    209     unsigned index = Ran->Rand();
    210     for (unsigned i=0; i<PT->size(); ++i) {
    211       Value *V = PT->at((index + i) % PT->size());
    212       if (V->getType()->isVectorTy())
    213         return V;
    214     }
    215     return UndefValue::get(pickVectorType());
    216   }
    217 
    218   /// Pick a random type.
    219   Type *pickType() {
    220     return (Ran->Rand() & 1 ? pickVectorType() : pickScalarType());
    221   }
    222 
    223   /// Pick a random pointer type.
    224   Type *pickPointerType() {
    225     Type *Ty = pickType();
    226     return PointerType::get(Ty, 0);
    227   }
    228 
    229   /// Pick a random vector type.
    230   Type *pickVectorType(unsigned len = (unsigned)-1) {
    231     // Pick a random vector width in the range 2**0 to 2**4.
    232     // by adding two randoms we are generating a normal-like distribution
    233     // around 2**3.
    234     unsigned width = 1<<((Ran->Rand() % 3) + (Ran->Rand() % 3));
    235     Type *Ty;
    236 
    237     // Vectors of x86mmx are illegal; keep trying till we get something else.
    238     do {
    239       Ty = pickScalarType();
    240     } while (Ty->isX86_MMXTy());
    241 
    242     if (len != (unsigned)-1)
    243       width = len;
    244     return VectorType::get(Ty, width);
    245   }
    246 
    247   /// Pick a random scalar type.
    248   Type *pickScalarType() {
    249     Type *t = nullptr;
    250     do {
    251       switch (Ran->Rand() % 30) {
    252       case 0: t = Type::getInt1Ty(Context); break;
    253       case 1: t = Type::getInt8Ty(Context); break;
    254       case 2: t = Type::getInt16Ty(Context); break;
    255       case 3: case 4:
    256       case 5: t = Type::getFloatTy(Context); break;
    257       case 6: case 7:
    258       case 8: t = Type::getDoubleTy(Context); break;
    259       case 9: case 10:
    260       case 11: t = Type::getInt32Ty(Context); break;
    261       case 12: case 13:
    262       case 14: t = Type::getInt64Ty(Context); break;
    263       case 15: case 16:
    264       case 17: if (GenHalfFloat) t = Type::getHalfTy(Context); break;
    265       case 18: case 19:
    266       case 20: if (GenX86FP80) t = Type::getX86_FP80Ty(Context); break;
    267       case 21: case 22:
    268       case 23: if (GenFP128) t = Type::getFP128Ty(Context); break;
    269       case 24: case 25:
    270       case 26: if (GenPPCFP128) t = Type::getPPC_FP128Ty(Context); break;
    271       case 27: case 28:
    272       case 29: if (GenX86MMX) t = Type::getX86_MMXTy(Context); break;
    273       default: llvm_unreachable("Invalid scalar value");
    274       }
    275     } while (t == nullptr);
    276 
    277     return t;
    278   }
    279 
    280   /// Basic block to populate
    281   BasicBlock *BB;
    282   /// Value table
    283   PieceTable *PT;
    284   /// Random number generator
    285   Random *Ran;
    286   /// Context
    287   LLVMContext &Context;
    288 };
    289 
    290 struct LoadModifier: public Modifier {
    291   LoadModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    292   void Act() override {
    293     // Try to use predefined pointers. If non-exist, use undef pointer value;
    294     Value *Ptr = getRandomPointerValue();
    295     Value *V = new LoadInst(Ptr, "L", BB->getTerminator());
    296     PT->push_back(V);
    297   }
    298 };
    299 
    300 struct StoreModifier: public Modifier {
    301   StoreModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    302   void Act() override {
    303     // Try to use predefined pointers. If non-exist, use undef pointer value;
    304     Value *Ptr = getRandomPointerValue();
    305     Type  *Tp = Ptr->getType();
    306     Value *Val = getRandomValue(Tp->getContainedType(0));
    307     Type  *ValTy = Val->getType();
    308 
    309     // Do not store vectors of i1s because they are unsupported
    310     // by the codegen.
    311     if (ValTy->isVectorTy() && ValTy->getScalarSizeInBits() == 1)
    312       return;
    313 
    314     new StoreInst(Val, Ptr, BB->getTerminator());
    315   }
    316 };
    317 
    318 struct BinModifier: public Modifier {
    319   BinModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    320 
    321   void Act() override {
    322     Value *Val0 = getRandomVal();
    323     Value *Val1 = getRandomValue(Val0->getType());
    324 
    325     // Don't handle pointer types.
    326     if (Val0->getType()->isPointerTy() ||
    327         Val1->getType()->isPointerTy())
    328       return;
    329 
    330     // Don't handle i1 types.
    331     if (Val0->getType()->getScalarSizeInBits() == 1)
    332       return;
    333 
    334 
    335     bool isFloat = Val0->getType()->getScalarType()->isFloatingPointTy();
    336     Instruction* Term = BB->getTerminator();
    337     unsigned R = Ran->Rand() % (isFloat ? 7 : 13);
    338     Instruction::BinaryOps Op;
    339 
    340     switch (R) {
    341     default: llvm_unreachable("Invalid BinOp");
    342     case 0:{Op = (isFloat?Instruction::FAdd : Instruction::Add); break; }
    343     case 1:{Op = (isFloat?Instruction::FSub : Instruction::Sub); break; }
    344     case 2:{Op = (isFloat?Instruction::FMul : Instruction::Mul); break; }
    345     case 3:{Op = (isFloat?Instruction::FDiv : Instruction::SDiv); break; }
    346     case 4:{Op = (isFloat?Instruction::FDiv : Instruction::UDiv); break; }
    347     case 5:{Op = (isFloat?Instruction::FRem : Instruction::SRem); break; }
    348     case 6:{Op = (isFloat?Instruction::FRem : Instruction::URem); break; }
    349     case 7: {Op = Instruction::Shl;  break; }
    350     case 8: {Op = Instruction::LShr; break; }
    351     case 9: {Op = Instruction::AShr; break; }
    352     case 10:{Op = Instruction::And;  break; }
    353     case 11:{Op = Instruction::Or;   break; }
    354     case 12:{Op = Instruction::Xor;  break; }
    355     }
    356 
    357     PT->push_back(BinaryOperator::Create(Op, Val0, Val1, "B", Term));
    358   }
    359 };
    360 
    361 /// Generate constant values.
    362 struct ConstModifier: public Modifier {
    363   ConstModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    364   void Act() override {
    365     Type *Ty = pickType();
    366 
    367     if (Ty->isVectorTy()) {
    368       switch (Ran->Rand() % 2) {
    369       case 0: if (Ty->getScalarType()->isIntegerTy())
    370                 return PT->push_back(ConstantVector::getAllOnesValue(Ty));
    371       case 1: if (Ty->getScalarType()->isIntegerTy())
    372                 return PT->push_back(ConstantVector::getNullValue(Ty));
    373       }
    374     }
    375 
    376     if (Ty->isFloatingPointTy()) {
    377       // Generate 128 random bits, the size of the (currently)
    378       // largest floating-point types.
    379       uint64_t RandomBits[2];
    380       for (unsigned i = 0; i < 2; ++i)
    381         RandomBits[i] = Ran->Rand64();
    382 
    383       APInt RandomInt(Ty->getPrimitiveSizeInBits(), makeArrayRef(RandomBits));
    384       APFloat RandomFloat(Ty->getFltSemantics(), RandomInt);
    385 
    386       if (Ran->Rand() & 1)
    387         return PT->push_back(ConstantFP::getNullValue(Ty));
    388       return PT->push_back(ConstantFP::get(Ty->getContext(), RandomFloat));
    389     }
    390 
    391     if (Ty->isIntegerTy()) {
    392       switch (Ran->Rand() % 7) {
    393       case 0: if (Ty->isIntegerTy())
    394                 return PT->push_back(ConstantInt::get(Ty,
    395                   APInt::getAllOnesValue(Ty->getPrimitiveSizeInBits())));
    396       case 1: if (Ty->isIntegerTy())
    397                 return PT->push_back(ConstantInt::get(Ty,
    398                   APInt::getNullValue(Ty->getPrimitiveSizeInBits())));
    399       case 2: case 3: case 4: case 5:
    400       case 6: if (Ty->isIntegerTy())
    401                 PT->push_back(ConstantInt::get(Ty, Ran->Rand()));
    402       }
    403     }
    404 
    405   }
    406 };
    407 
    408 struct AllocaModifier: public Modifier {
    409   AllocaModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R){}
    410 
    411   void Act() override {
    412     Type *Tp = pickType();
    413     PT->push_back(new AllocaInst(Tp, "A", BB->getFirstNonPHI()));
    414   }
    415 };
    416 
    417 struct ExtractElementModifier: public Modifier {
    418   ExtractElementModifier(BasicBlock *BB, PieceTable *PT, Random *R):
    419     Modifier(BB, PT, R) {}
    420 
    421   void Act() override {
    422     Value *Val0 = getRandomVectorValue();
    423     Value *V = ExtractElementInst::Create(Val0,
    424              ConstantInt::get(Type::getInt32Ty(BB->getContext()),
    425              Ran->Rand() % cast<VectorType>(Val0->getType())->getNumElements()),
    426              "E", BB->getTerminator());
    427     return PT->push_back(V);
    428   }
    429 };
    430 
    431 struct ShuffModifier: public Modifier {
    432   ShuffModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    433   void Act() override {
    434 
    435     Value *Val0 = getRandomVectorValue();
    436     Value *Val1 = getRandomValue(Val0->getType());
    437 
    438     unsigned Width = cast<VectorType>(Val0->getType())->getNumElements();
    439     std::vector<Constant*> Idxs;
    440 
    441     Type *I32 = Type::getInt32Ty(BB->getContext());
    442     for (unsigned i=0; i<Width; ++i) {
    443       Constant *CI = ConstantInt::get(I32, Ran->Rand() % (Width*2));
    444       // Pick some undef values.
    445       if (!(Ran->Rand() % 5))
    446         CI = UndefValue::get(I32);
    447       Idxs.push_back(CI);
    448     }
    449 
    450     Constant *Mask = ConstantVector::get(Idxs);
    451 
    452     Value *V = new ShuffleVectorInst(Val0, Val1, Mask, "Shuff",
    453                                      BB->getTerminator());
    454     PT->push_back(V);
    455   }
    456 };
    457 
    458 struct InsertElementModifier: public Modifier {
    459   InsertElementModifier(BasicBlock *BB, PieceTable *PT, Random *R):
    460     Modifier(BB, PT, R) {}
    461 
    462   void Act() override {
    463     Value *Val0 = getRandomVectorValue();
    464     Value *Val1 = getRandomValue(Val0->getType()->getScalarType());
    465 
    466     Value *V = InsertElementInst::Create(Val0, Val1,
    467               ConstantInt::get(Type::getInt32Ty(BB->getContext()),
    468               Ran->Rand() % cast<VectorType>(Val0->getType())->getNumElements()),
    469               "I",  BB->getTerminator());
    470     return PT->push_back(V);
    471   }
    472 
    473 };
    474 
    475 struct CastModifier: public Modifier {
    476   CastModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    477   void Act() override {
    478 
    479     Value *V = getRandomVal();
    480     Type *VTy = V->getType();
    481     Type *DestTy = pickScalarType();
    482 
    483     // Handle vector casts vectors.
    484     if (VTy->isVectorTy()) {
    485       VectorType *VecTy = cast<VectorType>(VTy);
    486       DestTy = pickVectorType(VecTy->getNumElements());
    487     }
    488 
    489     // no need to cast.
    490     if (VTy == DestTy) return;
    491 
    492     // Pointers:
    493     if (VTy->isPointerTy()) {
    494       if (!DestTy->isPointerTy())
    495         DestTy = PointerType::get(DestTy, 0);
    496       return PT->push_back(
    497         new BitCastInst(V, DestTy, "PC", BB->getTerminator()));
    498     }
    499 
    500     unsigned VSize = VTy->getScalarType()->getPrimitiveSizeInBits();
    501     unsigned DestSize = DestTy->getScalarType()->getPrimitiveSizeInBits();
    502 
    503     // Generate lots of bitcasts.
    504     if ((Ran->Rand() & 1) && VSize == DestSize) {
    505       return PT->push_back(
    506         new BitCastInst(V, DestTy, "BC", BB->getTerminator()));
    507     }
    508 
    509     // Both types are integers:
    510     if (VTy->getScalarType()->isIntegerTy() &&
    511         DestTy->getScalarType()->isIntegerTy()) {
    512       if (VSize > DestSize) {
    513         return PT->push_back(
    514           new TruncInst(V, DestTy, "Tr", BB->getTerminator()));
    515       } else {
    516         assert(VSize < DestSize && "Different int types with the same size?");
    517         if (Ran->Rand() & 1)
    518           return PT->push_back(
    519             new ZExtInst(V, DestTy, "ZE", BB->getTerminator()));
    520         return PT->push_back(new SExtInst(V, DestTy, "Se", BB->getTerminator()));
    521       }
    522     }
    523 
    524     // Fp to int.
    525     if (VTy->getScalarType()->isFloatingPointTy() &&
    526         DestTy->getScalarType()->isIntegerTy()) {
    527       if (Ran->Rand() & 1)
    528         return PT->push_back(
    529           new FPToSIInst(V, DestTy, "FC", BB->getTerminator()));
    530       return PT->push_back(new FPToUIInst(V, DestTy, "FC", BB->getTerminator()));
    531     }
    532 
    533     // Int to fp.
    534     if (VTy->getScalarType()->isIntegerTy() &&
    535         DestTy->getScalarType()->isFloatingPointTy()) {
    536       if (Ran->Rand() & 1)
    537         return PT->push_back(
    538           new SIToFPInst(V, DestTy, "FC", BB->getTerminator()));
    539       return PT->push_back(new UIToFPInst(V, DestTy, "FC", BB->getTerminator()));
    540 
    541     }
    542 
    543     // Both floats.
    544     if (VTy->getScalarType()->isFloatingPointTy() &&
    545         DestTy->getScalarType()->isFloatingPointTy()) {
    546       if (VSize > DestSize) {
    547         return PT->push_back(
    548           new FPTruncInst(V, DestTy, "Tr", BB->getTerminator()));
    549       } else if (VSize < DestSize) {
    550         return PT->push_back(
    551           new FPExtInst(V, DestTy, "ZE", BB->getTerminator()));
    552       }
    553       // If VSize == DestSize, then the two types must be fp128 and ppc_fp128,
    554       // for which there is no defined conversion. So do nothing.
    555     }
    556   }
    557 
    558 };
    559 
    560 struct SelectModifier: public Modifier {
    561   SelectModifier(BasicBlock *BB, PieceTable *PT, Random *R):
    562     Modifier(BB, PT, R) {}
    563 
    564   void Act() override {
    565     // Try a bunch of different select configuration until a valid one is found.
    566       Value *Val0 = getRandomVal();
    567       Value *Val1 = getRandomValue(Val0->getType());
    568 
    569       Type *CondTy = Type::getInt1Ty(Context);
    570 
    571       // If the value type is a vector, and we allow vector select, then in 50%
    572       // of the cases generate a vector select.
    573       if (Val0->getType()->isVectorTy() && (Ran->Rand() % 1)) {
    574         unsigned NumElem = cast<VectorType>(Val0->getType())->getNumElements();
    575         CondTy = VectorType::get(CondTy, NumElem);
    576       }
    577 
    578       Value *Cond = getRandomValue(CondTy);
    579       Value *V = SelectInst::Create(Cond, Val0, Val1, "Sl", BB->getTerminator());
    580       return PT->push_back(V);
    581   }
    582 };
    583 
    584 
    585 struct CmpModifier: public Modifier {
    586   CmpModifier(BasicBlock *BB, PieceTable *PT, Random *R):Modifier(BB, PT, R) {}
    587   void Act() override {
    588 
    589     Value *Val0 = getRandomVal();
    590     Value *Val1 = getRandomValue(Val0->getType());
    591 
    592     if (Val0->getType()->isPointerTy()) return;
    593     bool fp = Val0->getType()->getScalarType()->isFloatingPointTy();
    594 
    595     int op;
    596     if (fp) {
    597       op = Ran->Rand() %
    598       (CmpInst::LAST_FCMP_PREDICATE - CmpInst::FIRST_FCMP_PREDICATE) +
    599        CmpInst::FIRST_FCMP_PREDICATE;
    600     } else {
    601       op = Ran->Rand() %
    602       (CmpInst::LAST_ICMP_PREDICATE - CmpInst::FIRST_ICMP_PREDICATE) +
    603        CmpInst::FIRST_ICMP_PREDICATE;
    604     }
    605 
    606     Value *V = CmpInst::Create(fp ? Instruction::FCmp : Instruction::ICmp,
    607                                op, Val0, Val1, "Cmp", BB->getTerminator());
    608     return PT->push_back(V);
    609   }
    610 };
    611 
    612 } // end anonymous namespace
    613 
    614 static void FillFunction(Function *F, Random &R) {
    615   // Create a legal entry block.
    616   BasicBlock *BB = BasicBlock::Create(F->getContext(), "BB", F);
    617   ReturnInst::Create(F->getContext(), BB);
    618 
    619   // Create the value table.
    620   Modifier::PieceTable PT;
    621 
    622   // Consider arguments as legal values.
    623   for (Function::arg_iterator it = F->arg_begin(), e = F->arg_end();
    624        it != e; ++it)
    625     PT.push_back(it);
    626 
    627   // List of modifiers which add new random instructions.
    628   std::vector<Modifier*> Modifiers;
    629   std::unique_ptr<Modifier> LM(new LoadModifier(BB, &PT, &R));
    630   std::unique_ptr<Modifier> SM(new StoreModifier(BB, &PT, &R));
    631   std::unique_ptr<Modifier> EE(new ExtractElementModifier(BB, &PT, &R));
    632   std::unique_ptr<Modifier> SHM(new ShuffModifier(BB, &PT, &R));
    633   std::unique_ptr<Modifier> IE(new InsertElementModifier(BB, &PT, &R));
    634   std::unique_ptr<Modifier> BM(new BinModifier(BB, &PT, &R));
    635   std::unique_ptr<Modifier> CM(new CastModifier(BB, &PT, &R));
    636   std::unique_ptr<Modifier> SLM(new SelectModifier(BB, &PT, &R));
    637   std::unique_ptr<Modifier> PM(new CmpModifier(BB, &PT, &R));
    638   Modifiers.push_back(LM.get());
    639   Modifiers.push_back(SM.get());
    640   Modifiers.push_back(EE.get());
    641   Modifiers.push_back(SHM.get());
    642   Modifiers.push_back(IE.get());
    643   Modifiers.push_back(BM.get());
    644   Modifiers.push_back(CM.get());
    645   Modifiers.push_back(SLM.get());
    646   Modifiers.push_back(PM.get());
    647 
    648   // Generate the random instructions
    649   AllocaModifier AM(BB, &PT, &R); AM.ActN(5); // Throw in a few allocas
    650   ConstModifier COM(BB, &PT, &R);  COM.ActN(40); // Throw in a few constants
    651 
    652   for (unsigned i=0; i< SizeCL / Modifiers.size(); ++i)
    653     for (std::vector<Modifier*>::iterator it = Modifiers.begin(),
    654          e = Modifiers.end(); it != e; ++it) {
    655       (*it)->Act();
    656     }
    657 
    658   SM->ActN(5); // Throw in a few stores.
    659 }
    660 
    661 static void IntroduceControlFlow(Function *F, Random &R) {
    662   std::vector<Instruction*> BoolInst;
    663   for (BasicBlock::iterator it = F->begin()->begin(),
    664        e = F->begin()->end(); it != e; ++it) {
    665     if (it->getType() == IntegerType::getInt1Ty(F->getContext()))
    666       BoolInst.push_back(it);
    667   }
    668 
    669   std::random_shuffle(BoolInst.begin(), BoolInst.end(), R);
    670 
    671   for (std::vector<Instruction*>::iterator it = BoolInst.begin(),
    672        e = BoolInst.end(); it != e; ++it) {
    673     Instruction *Instr = *it;
    674     BasicBlock *Curr = Instr->getParent();
    675     BasicBlock::iterator Loc= Instr;
    676     BasicBlock *Next = Curr->splitBasicBlock(Loc, "CF");
    677     Instr->moveBefore(Curr->getTerminator());
    678     if (Curr != &F->getEntryBlock()) {
    679       BranchInst::Create(Curr, Next, Instr, Curr->getTerminator());
    680       Curr->getTerminator()->eraseFromParent();
    681     }
    682   }
    683 }
    684 
    685 int main(int argc, char **argv) {
    686   // Init LLVM, call llvm_shutdown() on exit, parse args, etc.
    687   llvm::PrettyStackTraceProgram X(argc, argv);
    688   cl::ParseCommandLineOptions(argc, argv, "llvm codegen stress-tester\n");
    689   llvm_shutdown_obj Y;
    690 
    691   std::unique_ptr<Module> M(new Module("/tmp/autogen.bc", getGlobalContext()));
    692   Function *F = GenEmptyFunction(M.get());
    693 
    694   // Pick an initial seed value
    695   Random R(SeedCL);
    696   // Generate lots of random instructions inside a single basic block.
    697   FillFunction(F, R);
    698   // Break the basic block into many loops.
    699   IntroduceControlFlow(F, R);
    700 
    701   // Figure out what stream we are supposed to write to...
    702   std::unique_ptr<tool_output_file> Out;
    703   // Default to standard output.
    704   if (OutputFilename.empty())
    705     OutputFilename = "-";
    706 
    707   std::string ErrorInfo;
    708   Out.reset(new tool_output_file(OutputFilename.c_str(), ErrorInfo,
    709                                  sys::fs::F_None));
    710   if (!ErrorInfo.empty()) {
    711     errs() << ErrorInfo << '\n';
    712     return 1;
    713   }
    714 
    715   PassManager Passes;
    716   Passes.add(createVerifierPass());
    717   Passes.add(createDebugInfoVerifierPass());
    718   Passes.add(createPrintModulePass(Out->os()));
    719   Passes.run(*M.get());
    720   Out->keep();
    721 
    722   return 0;
    723 }
    724