149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//===- llvm/unittest/IR/LegacyPassManager.cpp - Legacy PassManager tests --===//
21970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin//
31970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin//                     The LLVM Compiler Infrastructure
41970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin//
51970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin// This file is distributed under the University of Illinois Open Source
61970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin// License. See LICENSE.TXT for details.
71970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin//
81970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin//===----------------------------------------------------------------------===//
949837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
1049837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// This unit test exercises the legacy pass manager infrastructure. We use the
1149837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// old names as well to ensure that the source-level compatibility wrapper
1249837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// works for out-of-tree code that expects to include llvm/PassManager.h and
1349837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth// subclass the core pass classes.
1449837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//
1549837ef8111fbeace7ae6379ca733c8f8fa94cfeChandler Carruth//===----------------------------------------------------------------------===//
161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
171970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "llvm/PassManager.h"
185a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/ADT/SmallVector.h"
193251e81d793a293b78f4914be6093b405c24fc2aChandler Carruth#include "llvm/Analysis/CallGraphSCCPass.h"
201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "llvm/Analysis/LoopInfo.h"
211970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "llvm/Analysis/LoopPass.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Constants.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalVariable.h"
2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h"
300b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InlineAsm.h"
310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
330b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Verifier.h"
355a88dda4be791426ab4d20a6a6c9c65d66614a27Chandler Carruth#include "llvm/Pass.h"
361970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "llvm/Support/MathExtras.h"
371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "llvm/Support/raw_ostream.h"
381970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin#include "gtest/gtest.h"
391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
40081c34b725980f995be9080eaec24cd3dfaaf065Owen Andersonusing namespace llvm;
41081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson
421970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwinnamespace llvm {
43081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  void initializeModuleNDMPass(PassRegistry&);
44081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  void initializeFPassPass(PassRegistry&);
45081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  void initializeCGPassPass(PassRegistry&);
46081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  void initializeLPassPass(PassRegistry&);
47081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  void initializeBPassPass(PassRegistry&);
48f202c43de1975cd2ecc343819834275213881131Duncan Sands
491970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin  namespace {
501970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    // ND = no deps
511970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    // NM = no modifications
521970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct ModuleNDNM: public ModulePass {
531970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
541970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char run;
551970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
56081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      ModuleNDNM() : ModulePass(ID) { }
571970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnModule(Module &M) {
581970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run++;
591970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
601970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
611970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
621970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        AU.setPreservesAll();
631970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
641970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
651970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDNM::ID=0;
661970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDNM::run=0;
671970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
681970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct ModuleNDM : public ModulePass {
691970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
701970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char run;
711970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
7290c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      ModuleNDM() : ModulePass(ID) {}
731970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnModule(Module &M) {
741970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run++;
751970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return true;
761970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
771970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
781970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDM::ID=0;
791970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDM::run=0;
801970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
811970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct ModuleNDM2 : public ModulePass {
821970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
831970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char run;
841970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
8590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      ModuleNDM2() : ModulePass(ID) {}
861970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnModule(Module &M) {
871970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run++;
881970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return true;
891970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
901970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
911970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDM2::ID=0;
921970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleNDM2::run=0;
931970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
941970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct ModuleDNM : public ModulePass {
951970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
961970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char run;
971970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
98081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      ModuleDNM() : ModulePass(ID) {
99081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeModuleNDMPass(*PassRegistry::getPassRegistry());
100081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
1011970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnModule(Module &M) {
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        EXPECT_TRUE(getAnalysisIfAvailable<DataLayoutPass>());
1031970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run++;
1041970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
1051970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1061970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
1071970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        AU.addRequired<ModuleNDM>();
1081970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        AU.setPreservesAll();
1091970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1101970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
1111970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleDNM::ID=0;
1121970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char ModuleDNM::run=0;
1131970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1141970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename P>
1151970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct PassTestBase : public P {
1161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    protected:
1171970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static int runc;
1181970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static bool initialized;
1191970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static bool finalized;
1201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      int allocated;
1211970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      void run() {
12248b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_TRUE(initialized);
12348b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(finalized);
1241970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(0, allocated);
1251970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        allocated++;
1261970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        runc++;
1271970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1281970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
1291970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
1301970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static void finishedOK(int run) {
1311970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_GT(runc, 0);
13248b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_TRUE(initialized);
13348b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_TRUE(finalized);
1341970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(run, runc);
1351970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
13690c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      PassTestBase() : P(ID), allocated(0) {
1371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        initialized = false;
1381970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        finalized = false;
1391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        runc = 0;
1401970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1411970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1421970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual void releaseMemory() {
1431970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_GT(runc, 0);
1441970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_GT(allocated, 0);
1451970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        allocated--;
1461970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1471970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
1481970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename P> char PassTestBase<P>::ID;
1491970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename P> int PassTestBase<P>::runc;
1501970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename P> bool PassTestBase<P>::initialized;
1511970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename P> bool PassTestBase<P>::finalized;
1521970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1531970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename T, typename P>
1541970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct PassTest : public PassTestBase<P> {
1551970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
1564cd0a82fbf0b624bb5925b711204451c2734007eNAKAMURA Takumi#ifndef _MSC_VER // MSVC complains that Pass is not base class.
157ee721156701ec3afb198d4cfede00095b228eeacMatt Beaumont-Gay      using llvm::Pass::doInitialization;
158ee721156701ec3afb198d4cfede00095b228eeacMatt Beaumont-Gay      using llvm::Pass::doFinalization;
1594cd0a82fbf0b624bb5925b711204451c2734007eNAKAMURA Takumi#endif
1601970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doInitialization(T &t) {
16148b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(PassTestBase<P>::initialized);
1621970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        PassTestBase<P>::initialized = true;
1631970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
1641970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1651970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doFinalization(T &t) {
16648b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(PassTestBase<P>::finalized);
1671970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        PassTestBase<P>::finalized = true;
1681970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(0, PassTestBase<P>::allocated);
1691970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
1701970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1711970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
1721970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1731970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct CGPass : public PassTest<CallGraph, CallGraphSCCPass> {
1741970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
175081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      CGPass() {
176081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeCGPassPass(*PassRegistry::getPassRegistry());
177081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
1782decb22222cac46bb1d9163e7b89d7e5be8ef65fChris Lattner      virtual bool runOnSCC(CallGraphSCC &SCMM) {
17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        EXPECT_TRUE(getAnalysisIfAvailable<DataLayoutPass>());
1801970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run();
1811970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
1821970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1831970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
1841970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1851970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct FPass : public PassTest<Module, FunctionPass> {
1861970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
1871970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnFunction(Function &F) {
1881970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // FIXME: PR4112
189791cfc211a9801002bfda6b3eb4de7e041f04f53Micah Villmow        // EXPECT_TRUE(getAnalysisIfAvailable<DataLayout>());
1901970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run();
1911970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
1921970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
1931970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
1941970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
1951970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct LPass : public PassTestBase<LoopPass> {
1961970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    private:
1971970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static int initcount;
1981970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static int fincount;
1991970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
2001970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      LPass() {
201081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeLPassPass(*PassRegistry::getPassRegistry());
2021970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        initcount = 0; fincount=0;
20348b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(initialized);
2041970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2051970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static void finishedOK(int run, int finalized) {
2061970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        PassTestBase<LoopPass>::finishedOK(run);
2071970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(run, initcount);
2081970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(finalized, fincount);
2091970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
210ee721156701ec3afb198d4cfede00095b228eeacMatt Beaumont-Gay      using llvm::Pass::doInitialization;
211ee721156701ec3afb198d4cfede00095b228eeacMatt Beaumont-Gay      using llvm::Pass::doFinalization;
2121970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doInitialization(Loop* L, LPPassManager &LPM) {
2131970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        initialized = true;
2141970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        initcount++;
2151970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2171970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnLoop(Loop *L, LPPassManager &LPM) {
21836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        EXPECT_TRUE(getAnalysisIfAvailable<DataLayoutPass>());
2191970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run();
2201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2211970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2221970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doFinalization() {
2231970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        fincount++;
2241970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        finalized = true;
2251970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2261970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2271970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
2281970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    int LPass::initcount=0;
2291970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    int LPass::fincount=0;
2301970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
2311970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct BPass : public PassTestBase<BasicBlockPass> {
2321970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    private:
2331970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static int inited;
2341970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static int fin;
2351970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
2361970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static void finishedOK(int run, int N) {
2371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        PassTestBase<BasicBlockPass>::finishedOK(run);
2381970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(inited, N);
2391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(fin, N);
2401970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2411970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      BPass() {
2421970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        inited = 0;
2431970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        fin = 0;
2441970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2451970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doInitialization(Module &M) {
24648b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(initialized);
2471970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        initialized = true;
2481970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2491970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2501970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doInitialization(Function &F) {
2511970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        inited++;
2521970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2531970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2541970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnBasicBlock(BasicBlock &BB) {
25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        EXPECT_TRUE(getAnalysisIfAvailable<DataLayoutPass>());
2561970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        run();
2571970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2581970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2591970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doFinalization(Function &F) {
2601970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        fin++;
2611970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2621970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2631970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool doFinalization(Module &M) {
26448b17fa5bebf46ecdbcb51ebab1c3d8b483afd3cChandler Carruth        EXPECT_FALSE(finalized);
2651970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        finalized = true;
2661970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        EXPECT_EQ(0, allocated);
2671970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2681970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2691970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
2701970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    int BPass::inited=0;
2711970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    int BPass::fin=0;
2721970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
2731970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    struct OnTheFlyTest: public ModulePass {
2741970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    public:
2751970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      static char ID;
276081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      OnTheFlyTest() : ModulePass(ID) {
277081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson        initializeFPassPass(*PassRegistry::getPassRegistry());
278081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      }
2791970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual bool runOnModule(Module &M) {
28036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        EXPECT_TRUE(getAnalysisIfAvailable<DataLayoutPass>());
2811970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        for (Module::iterator I=M.begin(),E=M.end(); I != E; ++I) {
2821970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin          Function &F = *I;
2831970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin          {
2841970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin            SCOPED_TRACE("Running on the fly function pass");
2851970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin            getAnalysis<FPass>(F);
2861970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin          }
2871970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        }
2881970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        return false;
2891970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2901970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      virtual void getAnalysisUsage(AnalysisUsage &AU) const {
2911970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        AU.addRequired<FPass>();
2921970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
2931970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    };
2941970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    char OnTheFlyTest::ID=0;
2951970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
2961970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    TEST(PassManager, RunOnce) {
2971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      Module M("test-once", getGlobalContext());
2981970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDNM *mNDNM = new ModuleNDNM();
2991970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleDNM *mDNM = new ModuleDNM();
3001970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDM *mNDM = new ModuleNDM();
3011970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDM2 *mNDM2 = new ModuleNDM2();
3021970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3031970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      mNDM->run = mNDNM->run = mDNM->run = mNDM2->run = 0;
3041970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3051970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      PassManager Passes;
30636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(new DataLayoutPass(&M));
3071970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDM2);
3081970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDM);
3091970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDNM);
3101970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mDNM);
3111970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3121970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.run(M);
3131970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // each pass must be run exactly once, since nothing invalidates them
3141970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mNDM->run);
3151970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mNDNM->run);
3161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mDNM->run);
3171970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mNDM2->run);
3181970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
3191970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    TEST(PassManager, ReRun) {
3211d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      Module M("test-rerun", getGlobalContext());
3221970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDNM *mNDNM = new ModuleNDNM();
3231970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleDNM *mDNM = new ModuleDNM();
3241970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDM *mNDM = new ModuleNDM();
3251970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      struct ModuleNDM2 *mNDM2 = new ModuleNDM2();
3261970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3271970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      mNDM->run = mNDNM->run = mDNM->run = mNDM2->run = 0;
3281970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3291970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      PassManager Passes;
33036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(new DataLayoutPass(&M));
3311970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDM);
3321970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDNM);
3331970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mNDM2);// invalidates mNDM needed by mDNM
3341970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(mDNM);
3351970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3361970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.run(M);
3371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Some passes must be rerun because a pass that modified the
338d9b0b025612992a0b724eeca8bdf10b1d7a5c355Benjamin Kramer      // module/function was run in between
3391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(2, mNDM->run);
3401970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mNDNM->run);
3411970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mNDM2->run);
3421970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      EXPECT_EQ(1, mDNM->run);
3431970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
3441970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3451970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    Module* makeLLVMModule();
3461970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3471970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename T>
3481970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    void MemoryTestHelper(int run) {
34936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      std::unique_ptr<Module> M(makeLLVMModule());
3501970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      T *P = new T();
3511970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      PassManager Passes;
35236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(new DataLayoutPass(M.get()));
3531970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(P);
3541970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.run(*M);
3551970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      T::finishedOK(run);
3561970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
3571970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3581970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    template<typename T>
3591970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    void MemoryTestHelper(int run, int N) {
3601970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Module *M = makeLLVMModule();
3611970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      T *P = new T();
3621970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      PassManager Passes;
36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      Passes.add(new DataLayoutPass(M));
3641970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.add(P);
3651970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Passes.run(*M);
3661970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      T::finishedOK(run, N);
3671970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      delete M;
3681970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
3691970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3701970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    TEST(PassManager, Memory) {
3711970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // SCC#1: test1->test2->test3->test1
3721970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // SCC#2: test4
3731970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // SCC#3: indirect call node
3741970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
3751970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        SCOPED_TRACE("Callgraph pass");
3761970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        MemoryTestHelper<CGPass>(3);
3771970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
3781970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3791970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
3801970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        SCOPED_TRACE("Function pass");
3811970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        MemoryTestHelper<FPass>(4);// 4 functions
3821970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
3831970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3841970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
3851970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        SCOPED_TRACE("Loop pass");
3861970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        MemoryTestHelper<LPass>(2, 1); //2 loops, 1 function
3871970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
3881970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
3891970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        SCOPED_TRACE("Basic block pass");
3901970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        MemoryTestHelper<BPass>(7, 4); //9 basic blocks
3911970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
3921970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3931970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
3941970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
3951970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    TEST(PassManager, MemoryOnTheFly) {
3961970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Module *M = makeLLVMModule();
3971970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
3981970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        SCOPED_TRACE("Running OnTheFlyTest");
3991970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        struct OnTheFlyTest *O = new OnTheFlyTest();
4001970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        PassManager Passes;
40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines        Passes.add(new DataLayoutPass(M));
4021970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        Passes.add(O);
4031970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        Passes.run(*M);
4041970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4051970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        FPass::finishedOK(4);
4061970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
4071970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      delete M;
4081970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
4091970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4101970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    Module* makeLLVMModule() {
4111970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Module Construction
4121d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      Module* mod = new Module("test-mem", getGlobalContext());
4131970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      mod->setDataLayout("e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-"
4141970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin                         "i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-"
41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                         "a:0:64-s:64:64-f80:128:128");
4161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      mod->setTargetTriple("x86_64-unknown-linux-gnu");
4171970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4181970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Type Definitions
4195fdd6c8793462549e3593890ec61573da06e3346Jay Foad      std::vector<Type*>FuncTy_0_args;
4201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      FunctionType* FuncTy_0 = FunctionType::get(
4211d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        /*Result=*/IntegerType::get(getGlobalContext(), 32),
4221970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Params=*/FuncTy_0_args,
4231970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*isVarArg=*/false);
4241970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4255fdd6c8793462549e3593890ec61573da06e3346Jay Foad      std::vector<Type*>FuncTy_2_args;
4261d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      FuncTy_2_args.push_back(IntegerType::get(getGlobalContext(), 1));
4271970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      FunctionType* FuncTy_2 = FunctionType::get(
4281d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        /*Result=*/Type::getVoidTy(getGlobalContext()),
4291970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Params=*/FuncTy_2_args,
4301970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*isVarArg=*/false);
4311970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4321970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4331970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function Declarations
4341970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4351970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Function* func_test1 = Function::Create(
4361970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Type=*/FuncTy_0,
4371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Linkage=*/GlobalValue::ExternalLinkage,
4381970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Name=*/"test1", mod);
4391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test1->setCallingConv(CallingConv::C);
44099faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling      AttributeSet func_test1_PAL;
4411970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test1->setAttributes(func_test1_PAL);
4421970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4431970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Function* func_test2 = Function::Create(
4441970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Type=*/FuncTy_0,
4451970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Linkage=*/GlobalValue::ExternalLinkage,
4461970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Name=*/"test2", mod);
4471970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test2->setCallingConv(CallingConv::C);
44899faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling      AttributeSet func_test2_PAL;
4491970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test2->setAttributes(func_test2_PAL);
4501970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4511970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Function* func_test3 = Function::Create(
4521970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Type=*/FuncTy_0,
4531970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Linkage=*/GlobalValue::ExternalLinkage,
4541970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Name=*/"test3", mod);
4551970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test3->setCallingConv(CallingConv::C);
45699faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling      AttributeSet func_test3_PAL;
4571970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test3->setAttributes(func_test3_PAL);
4581970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4591970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      Function* func_test4 = Function::Create(
4601970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Type=*/FuncTy_2,
4611970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Linkage=*/GlobalValue::ExternalLinkage,
4621970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        /*Name=*/"test4", mod);
4631970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test4->setCallingConv(CallingConv::C);
46499faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling      AttributeSet func_test4_PAL;
4651970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      func_test4->setAttributes(func_test4_PAL);
4661970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4671970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Global Variable Declarations
4681970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4691970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4701970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Constant Definitions
4711970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4721970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Global Variable Definitions
4731970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4741970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function Definitions
4751970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4761970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function: test1 (func_test1)
4771970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
4781970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
479cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_entry = BasicBlock::Create(getGlobalContext(), "entry",func_test1,nullptr);
4801970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4811970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block entry (label_entry)
4821970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        CallInst* int32_3 = CallInst::Create(func_test2, "", label_entry);
4831970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_3->setCallingConv(CallingConv::C);
48499faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling        int32_3->setTailCall(false);AttributeSet int32_3_PAL;
4851970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_3->setAttributes(int32_3_PAL);
4861970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4871d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        ReturnInst::Create(getGlobalContext(), int32_3, label_entry);
4881970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4891970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
4901970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4911970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function: test2 (func_test2)
4921970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
4931970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
494cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_entry_5 = BasicBlock::Create(getGlobalContext(), "entry",func_test2,nullptr);
4951970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
4961970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block entry (label_entry_5)
4971970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        CallInst* int32_6 = CallInst::Create(func_test3, "", label_entry_5);
4981970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_6->setCallingConv(CallingConv::C);
49999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling        int32_6->setTailCall(false);AttributeSet int32_6_PAL;
5001970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_6->setAttributes(int32_6_PAL);
5011970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5021d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        ReturnInst::Create(getGlobalContext(), int32_6, label_entry_5);
5031970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5041970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
5051970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5061970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function: test3 (func_test3)
5071970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
5081970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
509cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_entry_8 = BasicBlock::Create(getGlobalContext(), "entry",func_test3,nullptr);
5101970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5111970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block entry (label_entry_8)
5121970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        CallInst* int32_9 = CallInst::Create(func_test1, "", label_entry_8);
5131970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_9->setCallingConv(CallingConv::C);
51499faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling        int32_9->setTailCall(false);AttributeSet int32_9_PAL;
5151970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int32_9->setAttributes(int32_9_PAL);
5161970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5171d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        ReturnInst::Create(getGlobalContext(), int32_9, label_entry_8);
5181970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5191970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
5201970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5211970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      // Function: test4 (func_test4)
5221970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      {
5231970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        Function::arg_iterator args = func_test4->arg_begin();
5241970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        Value* int1_f = args++;
5251970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        int1_f->setName("f");
5261970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
527cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_entry_11 = BasicBlock::Create(getGlobalContext(), "entry",func_test4,nullptr);
528cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_bb = BasicBlock::Create(getGlobalContext(), "bb",func_test4,nullptr);
529cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_bb1 = BasicBlock::Create(getGlobalContext(), "bb1",func_test4,nullptr);
530cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines        BasicBlock* label_return = BasicBlock::Create(getGlobalContext(), "return",func_test4,nullptr);
5311970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5321970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block entry (label_entry_11)
5331970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        BranchInst::Create(label_bb, label_entry_11);
5341970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5351970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block bb (label_bb)
5361970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        BranchInst::Create(label_bb, label_bb1, int1_f, label_bb);
5371970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5381970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block bb1 (label_bb1)
5391970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        BranchInst::Create(label_bb1, label_return, int1_f, label_bb1);
5401970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5411970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin        // Block return (label_return)
5421d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson        ReturnInst::Create(getGlobalContext(), label_return);
5431970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5441970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      }
5451970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin      return mod;
5461970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin    }
5471970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin
5481970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin  }
5491970a89a49a76ef117c92e58a508e26ecc43ccdbTorok Edwin}
550081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson
551081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS(ModuleNDM, "mndm", "mndm", false, false)
552081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS_BEGIN(CGPass, "cgp","cgp", false, false)
55336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
554081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS_END(CGPass, "cgp","cgp", false, false)
555081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS(FPass, "fp","fp", false, false)
556081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS_BEGIN(LPass, "lp","lp", false, false)
557081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS_DEPENDENCY(LoopInfo)
558081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS_END(LPass, "lp","lp", false, false)
559081c34b725980f995be9080eaec24cd3dfaaf065Owen AndersonINITIALIZE_PASS(BPass, "bp","bp", false, false)
560