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"
1869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Function.h"
1969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Pass.h"
2069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Type.h"
218a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands#include "llvm/ADT/DepthFirstIterator.h"
22dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands#include "llvm/ADT/SmallPtrSet.h"
2369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/ADT/Statistic.h"
2469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Analysis/Dominators.h"
2569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Analysis/InstructionSimplify.h"
2669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Target/TargetData.h"
2769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands#include "llvm/Transforms/Scalar.h"
28e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands#include "llvm/Transforms/Utils/Local.h"
2969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandsusing namespace llvm;
3069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
3169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan SandsSTATISTIC(NumSimplified, "Number of redundant instructions removed");
3269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
3369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandsnamespace {
3469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  struct InstSimplifier : public FunctionPass {
3569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    static char ID; // Pass identification, replacement for typeid
3669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    InstSimplifier() : FunctionPass(ID) {
3769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      initializeInstSimplifierPass(*PassRegistry::getPassRegistry());
3869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
3969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
4069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    void getAnalysisUsage(AnalysisUsage &AU) const {
4169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      AU.setPreservesCFG();
4269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
4369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
4469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    /// runOnFunction - Remove instructions that simplify.
4569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    bool runOnFunction(Function &F) {
4669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      const DominatorTree *DT = getAnalysisIfAvailable<DominatorTree>();
478a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands      const TargetData *TD = getAnalysisIfAvailable<TargetData>();
48dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands      SmallPtrSet<const Instruction*, 8> S1, S2, *ToSimplify = &S1, *Next = &S2;
49e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands      bool Changed = false;
50e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands
518a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands      do {
528a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands        for (df_iterator<BasicBlock*> DI = df_begin(&F.getEntryBlock()),
538a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands             DE = df_end(&F.getEntryBlock()); DI != DE; ++DI)
548a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands          for (BasicBlock::iterator BI = DI->begin(), BE = DI->end(); BI != BE;) {
558a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands            Instruction *I = BI++;
56dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // The first time through the loop ToSimplify is empty and we try to
57dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // simplify all instructions.  On later iterations ToSimplify is not
58dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // empty and we only bother simplifying instructions that are in it.
59dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            if (!ToSimplify->empty() && !ToSimplify->count(I))
60dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands              continue;
61dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            // Don't waste time simplifying unused instructions.
628a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands            if (!I->use_empty())
638a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands              if (Value *V = SimplifyInstruction(I, TD, DT)) {
64dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                // Mark all uses for resimplification next time round the loop.
65dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
66dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                     UI != UE; ++UI)
67dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                  Next->insert(cast<Instruction>(*UI));
688a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands                I->replaceAllUsesWith(V);
698a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands                ++NumSimplified;
70dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands                Changed = true;
718a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands              }
72dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands            Changed |= RecursivelyDeleteTriviallyDeadInstructions(I);
738a3d29cf1064e8efbb8c8d5d4653ad147c7b037eDuncan Sands          }
74e95cc25a2267128436bb83af6cb57c07323c8693Duncan Sands
75dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        // Place the list of instructions to simplify on the next loop iteration
76dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        // into ToSimplify.
77dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        std::swap(ToSimplify, Next);
78dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands        Next->clear();
79dc615e41b56daa380e80982097a609bb25afaa82Duncan Sands      } while (!ToSimplify->empty());
801cd0f4637bfb8c93996b09baec8bf2bb220b74caDuncan Sands
8169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands      return Changed;
8269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands    }
8369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  };
8469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands}
8569fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
8669fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandschar InstSimplifier::ID = 0;
8769fdf876e1cceca935561272fd5c238a59c6e9d8Duncan SandsINITIALIZE_PASS(InstSimplifier, "instsimplify", "Remove redundant instructions",
8869fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands                false, false)
8969fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sandschar &llvm::InstructionSimplifierID = InstSimplifier::ID;
9069fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands
9169fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands// Public interface to the simplify instructions pass.
9269fdf876e1cceca935561272fd5c238a59c6e9d8Duncan SandsFunctionPass *llvm::createInstructionSimplifierPass() {
9369fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands  return new InstSimplifier();
9469fdf876e1cceca935561272fd5c238a59c6e9d8Duncan Sands}
95