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"
21280031Sdim#include "llvm/Analysis/AssumptionCache.h"
22218885Sdim#include "llvm/Analysis/InstructionSimplify.h"
23296417Sdim#include "llvm/Analysis/TargetLibraryInfo.h"
24249423Sdim#include "llvm/IR/DataLayout.h"
25276479Sdim#include "llvm/IR/Dominators.h"
26249423Sdim#include "llvm/IR/Function.h"
27249423Sdim#include "llvm/IR/Type.h"
28249423Sdim#include "llvm/Pass.h"
29218885Sdim#include "llvm/Transforms/Utils/Local.h"
30218885Sdimusing namespace llvm;
31218885Sdim
32276479Sdim#define DEBUG_TYPE "instsimplify"
33276479Sdim
34218885SdimSTATISTIC(NumSimplified, "Number of redundant instructions removed");
35218885Sdim
36218885Sdimnamespace {
37218885Sdim  struct InstSimplifier : public FunctionPass {
38218885Sdim    static char ID; // Pass identification, replacement for typeid
39218885Sdim    InstSimplifier() : FunctionPass(ID) {
40218885Sdim      initializeInstSimplifierPass(*PassRegistry::getPassRegistry());
41218885Sdim    }
42218885Sdim
43276479Sdim    void getAnalysisUsage(AnalysisUsage &AU) const override {
44218885Sdim      AU.setPreservesCFG();
45280031Sdim      AU.addRequired<AssumptionCacheTracker>();
46288943Sdim      AU.addRequired<TargetLibraryInfoWrapperPass>();
47218885Sdim    }
48218885Sdim
49218885Sdim    /// runOnFunction - Remove instructions that simplify.
50276479Sdim    bool runOnFunction(Function &F) override {
51276479Sdim      const DominatorTreeWrapperPass *DTWP =
52276479Sdim          getAnalysisIfAvailable<DominatorTreeWrapperPass>();
53276479Sdim      const DominatorTree *DT = DTWP ? &DTWP->getDomTree() : nullptr;
54288943Sdim      const DataLayout &DL = F.getParent()->getDataLayout();
55288943Sdim      const TargetLibraryInfo *TLI =
56288943Sdim          &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
57280031Sdim      AssumptionCache *AC =
58280031Sdim          &getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
59218885Sdim      SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
60218885Sdim      bool Changed = false;
61218885Sdim
62218885Sdim      do {
63276479Sdim        for (BasicBlock *BB : depth_first(&F.getEntryBlock()))
64276479Sdim          // Here be subtlety: the iterator must be incremented before the loop
65276479Sdim          // body (not sure why), so a range-for loop won't work here.
66276479Sdim          for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE;) {
67296417Sdim            Instruction *I = &*BI++;
68218885Sdim            // The first time through the loop ToSimplify is empty and we try to
69218885Sdim            // simplify all instructions.  On later iterations ToSimplify is not
70218885Sdim            // empty and we only bother simplifying instructions that are in it.
71218885Sdim            if (!ToSimplify->empty() && !ToSimplify->count(I))
72218885Sdim              continue;
73218885Sdim            // Don't waste time simplifying unused instructions.
74218885Sdim            if (!I->use_empty())
75280031Sdim              if (Value *V = SimplifyInstruction(I, DL, TLI, DT, AC)) {
76218885Sdim                // Mark all uses for resimplification next time round the loop.
77276479Sdim                for (User *U : I->users())
78276479Sdim                  Next->insert(cast<Instruction>(U));
79218885Sdim                I->replaceAllUsesWith(V);
80218885Sdim                ++NumSimplified;
81218885Sdim                Changed = true;
82218885Sdim              }
83276479Sdim            bool res = RecursivelyDeleteTriviallyDeadInstructions(I, TLI);
84276479Sdim            if (res)  {
85276479Sdim              // RecursivelyDeleteTriviallyDeadInstruction can remove
86276479Sdim              // more than one instruction, so simply incrementing the
87276479Sdim              // iterator does not work. When instructions get deleted
88276479Sdim              // re-iterate instead.
89276479Sdim              BI = BB->begin(); BE = BB->end();
90276479Sdim              Changed |= res;
91276479Sdim            }
92218885Sdim          }
93218885Sdim
94218885Sdim        // Place the list of instructions to simplify on the next loop iteration
95218885Sdim        // into ToSimplify.
96218885Sdim        std::swap(ToSimplify, Next);
97218885Sdim        Next->clear();
98218885Sdim      } while (!ToSimplify->empty());
99218885Sdim
100218885Sdim      return Changed;
101218885Sdim    }
102218885Sdim  };
103218885Sdim}
104218885Sdim
105218885Sdimchar InstSimplifier::ID = 0;
106234353SdimINITIALIZE_PASS_BEGIN(InstSimplifier, "instsimplify",
107234353Sdim                      "Remove redundant instructions", false, false)
108280031SdimINITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
109288943SdimINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
110234353SdimINITIALIZE_PASS_END(InstSimplifier, "instsimplify",
111234353Sdim                    "Remove redundant instructions", false, false)
112218885Sdimchar &llvm::InstructionSimplifierID = InstSimplifier::ID;
113218885Sdim
114218885Sdim// Public interface to the simplify instructions pass.
115218885SdimFunctionPass *llvm::createInstructionSimplifierPass() {
116218885Sdim  return new InstSimplifier();
117218885Sdim}
118