1218885Sdim//===------ SimplifyInstructions.cpp - Remove redundant instructions ------===//
2218885Sdim//
3218885Sdim//                     The LLVM Compiler Infrastructure
4218885Sdim//
5218885Sdim// This file is distributed under the University of Illinois Open Source
6218885Sdim// License. See LICENSE.TXT for details.
7218885Sdim//
8218885Sdim//===----------------------------------------------------------------------===//
9218885Sdim//
10218885Sdim// This is a utility pass used for testing the InstructionSimplify analysis.
11218885Sdim// The analysis is applied to every instruction, and if it simplifies then the
12218885Sdim// instruction is replaced by the simplification.  If you are looking for a pass
13218885Sdim// that performs serious instruction folding, use the instcombine pass instead.
14218885Sdim//
15218885Sdim//===----------------------------------------------------------------------===//
16218885Sdim
17218885Sdim#define DEBUG_TYPE "instsimplify"
18249423Sdim#include "llvm/Transforms/Scalar.h"
19218885Sdim#include "llvm/ADT/DepthFirstIterator.h"
20218885Sdim#include "llvm/ADT/SmallPtrSet.h"
21218885Sdim#include "llvm/ADT/Statistic.h"
22218885Sdim#include "llvm/Analysis/Dominators.h"
23218885Sdim#include "llvm/Analysis/InstructionSimplify.h"
24249423Sdim#include "llvm/IR/DataLayout.h"
25249423Sdim#include "llvm/IR/Function.h"
26249423Sdim#include "llvm/IR/Type.h"
27249423Sdim#include "llvm/Pass.h"
28234353Sdim#include "llvm/Target/TargetLibraryInfo.h"
29218885Sdim#include "llvm/Transforms/Utils/Local.h"
30218885Sdimusing namespace llvm;
31218885Sdim
32218885SdimSTATISTIC(NumSimplified, "Number of redundant instructions removed");
33218885Sdim
34218885Sdimnamespace {
35218885Sdim  struct InstSimplifier : public FunctionPass {
36218885Sdim    static char ID; // Pass identification, replacement for typeid
37218885Sdim    InstSimplifier() : FunctionPass(ID) {
38218885Sdim      initializeInstSimplifierPass(*PassRegistry::getPassRegistry());
39218885Sdim    }
40218885Sdim
41218885Sdim    void getAnalysisUsage(AnalysisUsage &AU) const {
42218885Sdim      AU.setPreservesCFG();
43234353Sdim      AU.addRequired<TargetLibraryInfo>();
44218885Sdim    }
45218885Sdim
46218885Sdim    /// runOnFunction - Remove instructions that simplify.
47218885Sdim    bool runOnFunction(Function &F) {
48218885Sdim      const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
49243830Sdim      const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
50234353Sdim      const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
51218885Sdim      SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
52218885Sdim      bool Changed = false;
53218885Sdim
54218885Sdim      do {
55218885Sdim        for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
56218885Sdim             DE = df_end(&F.getEntryBlock()); DI != DE; ++DI)
57218885Sdim          for (BasicBlock::iterator BI = DI->begin(), BE = DI->end(); BI != BE;) {
58218885Sdim            Instruction *I = BI++;
59218885Sdim            // The first time through the loop ToSimplify is empty and we try to
60218885Sdim            // simplify all instructions.  On later iterations ToSimplify is not
61218885Sdim            // empty and we only bother simplifying instructions that are in it.
62218885Sdim            if (!ToSimplify->empty() && !ToSimplify->count(I))
63218885Sdim              continue;
64218885Sdim            // Don't waste time simplifying unused instructions.
65218885Sdim            if (!I->use_empty())
66234353Sdim              if (Value *V = SimplifyInstruction(I, TD, TLI, DT)) {
67218885Sdim                // Mark all uses for resimplification next time round the loop.
68218885Sdim                for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
69218885Sdim                     UI != UE; ++UI)
70218885Sdim                  Next->insert(cast<Instruction>(*UI));
71218885Sdim                I->replaceAllUsesWith(V);
72218885Sdim                ++NumSimplified;
73218885Sdim                Changed = true;
74218885Sdim              }
75243830Sdim            Changed |= RecursivelyDeleteTriviallyDeadInstructions(I, TLI);
76218885Sdim          }
77218885Sdim
78218885Sdim        // Place the list of instructions to simplify on the next loop iteration
79218885Sdim        // into ToSimplify.
80218885Sdim        std::swap(ToSimplify, Next);
81218885Sdim        Next->clear();
82218885Sdim      } while (!ToSimplify->empty());
83218885Sdim
84218885Sdim      return Changed;
85218885Sdim    }
86218885Sdim  };
87218885Sdim}
88218885Sdim
89218885Sdimchar InstSimplifier::ID = 0;
90234353SdimINITIALIZE_PASS_BEGIN(InstSimplifier, "instsimplify",
91234353Sdim                      "Remove redundant instructions", false, false)
92234353SdimINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
93234353SdimINITIALIZE_PASS_END(InstSimplifier, "instsimplify",
94234353Sdim                    "Remove redundant instructions", false, false)
95218885Sdimchar &llvm::InstructionSimplifierID = InstSimplifier::ID;
96218885Sdim
97218885Sdim// Public interface to the simplify instructions pass.
98218885SdimFunctionPass *llvm::createInstructionSimplifierPass() {
99218885Sdim  return new InstSimplifier();
100218885Sdim}
101