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