SimplifyInstructions.cpp revision 276479
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
17249423Sdim#include "llvm/Transforms/Scalar.h"
18218885Sdim#include "llvm/ADT/DepthFirstIterator.h"
19218885Sdim#include "llvm/ADT/SmallPtrSet.h"
20218885Sdim#include "llvm/ADT/Statistic.h"
21218885Sdim#include "llvm/Analysis/InstructionSimplify.h"
22249423Sdim#include "llvm/IR/DataLayout.h"
23276479Sdim#include "llvm/IR/Dominators.h"
24249423Sdim#include "llvm/IR/Function.h"
25249423Sdim#include "llvm/IR/Type.h"
26249423Sdim#include "llvm/Pass.h"
27234353Sdim#include "llvm/Target/TargetLibraryInfo.h"
28218885Sdim#include "llvm/Transforms/Utils/Local.h"
29218885Sdimusing namespace llvm;
30218885Sdim
31276479Sdim#define DEBUG_TYPE "instsimplify"
32276479Sdim
33218885SdimSTATISTIC(NumSimplified, "Number of redundant instructions removed");
34218885Sdim
35218885Sdimnamespace {
36218885Sdim  struct InstSimplifier : public FunctionPass {
37218885Sdim    static char ID; // Pass identification, replacement for typeid
38218885Sdim    InstSimplifier() : FunctionPass(ID) {
39218885Sdim      initializeInstSimplifierPass(*PassRegistry::getPassRegistry());
40218885Sdim    }
41218885Sdim
42276479Sdim    void getAnalysisUsage(AnalysisUsage &AU) const override {
43218885Sdim      AU.setPreservesCFG();
44234353Sdim      AU.addRequired<TargetLibraryInfo>();
45218885Sdim    }
46218885Sdim
47218885Sdim    /// runOnFunction - Remove instructions that simplify.
48276479Sdim    bool runOnFunction(Function &F) override {
49276479Sdim      const DominatorTreeWrapperPass *DTWP =
50276479Sdim          getAnalysisIfAvailable<DominatorTreeWrapperPass>();
51276479Sdim      const DominatorTree *DT = DTWP ? &DTWP->getDomTree() : nullptr;
52276479Sdim      DataLayoutPass *DLP = getAnalysisIfAvailable<DataLayoutPass>();
53276479Sdim      const DataLayout *DL = DLP ? &DLP->getDataLayout() : nullptr;
54234353Sdim      const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
55218885Sdim      SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
56218885Sdim      bool Changed = false;
57218885Sdim
58218885Sdim      do {
59276479Sdim        for (BasicBlock *BB : depth_first(&F.getEntryBlock()))
60276479Sdim          // Here be subtlety: the iterator must be incremented before the loop
61276479Sdim          // body (not sure why), so a range-for loop won't work here.
62276479Sdim          for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
63218885Sdim            Instruction *I = BI++;
64218885Sdim            // The first time through the loop ToSimplify is empty and we try to
65218885Sdim            // simplify all instructions.  On later iterations ToSimplify is not
66218885Sdim            // empty and we only bother simplifying instructions that are in it.
67218885Sdim            if (!ToSimplify->empty() && !ToSimplify->count(I))
68218885Sdim              continue;
69218885Sdim            // Don't waste time simplifying unused instructions.
70218885Sdim            if (!I->use_empty())
71276479Sdim              if (Value *V = SimplifyInstruction(I, DL, TLI, DT)) {
72218885Sdim                // Mark all uses for resimplification next time round the loop.
73276479Sdim                for (User *U : I->users())
74276479Sdim                  Next->insert(cast<Instruction>(U));
75218885Sdim                I->replaceAllUsesWith(V);
76218885Sdim                ++NumSimplified;
77218885Sdim                Changed = true;
78218885Sdim              }
79276479Sdim            bool res = RecursivelyDeleteTriviallyDeadInstructions(I, TLI);
80276479Sdim            if (res)  {
81276479Sdim              // RecursivelyDeleteTriviallyDeadInstruction can remove
82276479Sdim              // more than one instruction, so simply incrementing the
83276479Sdim              // iterator does not work. When instructions get deleted
84276479Sdim              // re-iterate instead.
85276479Sdim              BI = BB->begin(); BE = BB->end();
86276479Sdim              Changed |= res;
87276479Sdim            }
88218885Sdim          }
89218885Sdim
90218885Sdim        // Place the list of instructions to simplify on the next loop iteration
91218885Sdim        // into ToSimplify.
92218885Sdim        std::swap(ToSimplify, Next);
93218885Sdim        Next->clear();
94218885Sdim      } while (!ToSimplify->empty());
95218885Sdim
96218885Sdim      return Changed;
97218885Sdim    }
98218885Sdim  };
99218885Sdim}
100218885Sdim
101218885Sdimchar InstSimplifier::ID = 0;
102234353SdimINITIALIZE_PASS_BEGIN(InstSimplifier, "instsimplify",
103234353Sdim                      "Remove redundant instructions", false, false)
104234353SdimINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
105234353SdimINITIALIZE_PASS_END(InstSimplifier, "instsimplify",
106234353Sdim                    "Remove redundant instructions", false, false)
107218885Sdimchar &llvm::InstructionSimplifierID = InstSimplifier::ID;
108218885Sdim
109218885Sdim// Public interface to the simplify instructions pass.
110218885SdimFunctionPass *llvm::createInstructionSimplifierPass() {
111218885Sdim  return new InstSimplifier();
112218885Sdim}
113