169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//===------ SimplifyInstructions.cpp - Remove redundant instructions ------===//
269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//
369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//                     The LLVM Compiler Infrastructure
469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//
569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// This file is distributed under the University of Illinois Open Source
669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// License. See LICENSE.TXT for details.
769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//
869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//===----------------------------------------------------------------------===//
969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//
1069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// This is a utility pass used for testing the InstructionSimplify analysis.
1169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// The analysis is applied to every instruction, and if it simplifies then the
1269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// instruction is replaced by the simplification.  If you are looking for a pass
1369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// that performs serious instruction folding, use the instcombine pass instead.
1469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//
1569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands//===----------------------------------------------------------------------===//
1669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
1769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#define DEBUG_TYPE "instsimplify"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/Scalar.h"
198a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands#include "llvm/ADT/DepthFirstIterator.h"
20dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands#include "llvm/ADT/SmallPtrSet.h"
2169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/ADT/Statistic.h"
2269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Analysis/Dominators.h"
2369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Analysis/InstructionSimplify.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Function.h"
260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
27d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Pass.h"
28618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier#include "llvm/Target/TargetLibraryInfo.h"
29e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands#include "llvm/Transforms/Utils/Local.h"
3069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandsusing namespace llvm;
3169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
3269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan SandsSTATISTIC(NumSimplified, "Number of redundant instructions removed");
3369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
3469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandsnamespace {
3569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  struct InstSimplifier : public FunctionPass {
3669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    static char ID; // Pass identification, replacement for typeid
3769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    InstSimplifier() : FunctionPass(ID) {
3869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      initializeInstSimplifierPass(*PassRegistry::getPassRegistry());
3969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
4069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
4169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    void getAnalysisUsage(AnalysisUsage &AU) const {
4269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      AU.setPreservesCFG();
43618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier      AU.addRequired<TargetLibraryInfo>();
4469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
4569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
4669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    /// runOnFunction - Remove instructions that simplify.
4769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    bool runOnFunction(Function &F) {
4869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
493574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow      const DataLayout *TD = getAnalysisIfAvailable<DataLayout>();
50618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier      const TargetLibraryInfo *TLI = &getAnalysis<TargetLibraryInfo>();
51dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands      SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
52e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands      bool Changed = false;
53e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands
548a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands      do {
558a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands        for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
568a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands             DE = df_end(&F.getEntryBlock()); DI != DE; ++DI)
578a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands          for (BasicBlock::iterator BI = DI->begin(), BE = DI->end(); BI != BE;) {
588a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands            Instruction *I = BI++;
59dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // The first time through the loop ToSimplify is empty and we try to
60dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // simplify all instructions.  On later iterations ToSimplify is not
61dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // empty and we only bother simplifying instructions that are in it.
62dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            if (!ToSimplify->empty() && !ToSimplify->count(I))
63dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands              continue;
64dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // Don't waste time simplifying unused instructions.
658a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands            if (!I->use_empty())
66618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier              if (Value *V = SimplifyInstruction(I, TD, TLI, DT)) {
67dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                // Mark all uses for resimplification next time round the loop.
68dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
69dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                     UI != UE; ++UI)
70dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                  Next->insert(cast<Instruction>(*UI));
718a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands                I->replaceAllUsesWith(V);
728a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands                ++NumSimplified;
73dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                Changed = true;
748a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands              }
758e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer            Changed |= RecursivelyDeleteTriviallyDeadInstructions(I, TLI);
768a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands          }
77e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands
78dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        // Place the list of instructions to simplify on the next loop iteration
79dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        // into ToSimplify.
80dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        std::swap(ToSimplify, Next);
81dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        Next->clear();
82dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands      } while (!ToSimplify->empty());
831cd0f4637bfb8c93996b09baec8bf2bb220b74caDuncan Sands
8469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      return Changed;
8569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
8669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  };
8769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands}
8869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
8969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandschar InstSimplifier::ID = 0;
90618c1dbd293d15ee19f61b1156ab8086ad28311aChad RosierINITIALIZE_PASS_BEGIN(InstSimplifier, "instsimplify",
91618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                      "Remove redundant instructions", false, false)
92618c1dbd293d15ee19f61b1156ab8086ad28311aChad RosierINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfo)
93618c1dbd293d15ee19f61b1156ab8086ad28311aChad RosierINITIALIZE_PASS_END(InstSimplifier, "instsimplify",
94618c1dbd293d15ee19f61b1156ab8086ad28311aChad Rosier                    "Remove redundant instructions", false, false)
9569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandschar &llvm::InstructionSimplifierID = InstSimplifier::ID;
9669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
9769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// Public interface to the simplify instructions pass.
9869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan SandsFunctionPass *llvm::createInstructionSimplifierPass() {
9969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  return new InstSimplifier();
10069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands}
101