Line data Source code
1 : //===- InstCombine.h - InstCombine pass -------------------------*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : /// \file
10 : ///
11 : /// This file provides the primary interface to the instcombine pass. This pass
12 : /// is suitable for use in the new pass manager. For a pass that works with the
13 : /// legacy pass manager, use \c createInstructionCombiningPass().
14 : ///
15 : //===----------------------------------------------------------------------===//
16 :
17 : #ifndef LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINE_H
18 : #define LLVM_TRANSFORMS_INSTCOMBINE_INSTCOMBINE_H
19 :
20 : #include "llvm/IR/Function.h"
21 : #include "llvm/IR/PassManager.h"
22 : #include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
23 :
24 : namespace llvm {
25 :
26 1324 : class InstCombinePass : public PassInfoMixin<InstCombinePass> {
27 : InstCombineWorklist Worklist;
28 : bool ExpensiveCombines;
29 :
30 : public:
31 : static StringRef name() { return "InstCombinePass"; }
32 :
33 : explicit InstCombinePass(bool ExpensiveCombines = true)
34 662 : : ExpensiveCombines(ExpensiveCombines) {}
35 :
36 : PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
37 : };
38 :
39 : /// The legacy pass manager's instcombine pass.
40 : ///
41 : /// This is a basic whole-function wrapper around the instcombine utility. It
42 : /// will try to combine all instructions in the function.
43 : class InstructionCombiningPass : public FunctionPass {
44 : InstCombineWorklist Worklist;
45 : const bool ExpensiveCombines;
46 :
47 : public:
48 : static char ID; // Pass identification, replacement for typeid
49 :
50 13317 : InstructionCombiningPass(bool ExpensiveCombines = true)
51 26634 : : FunctionPass(ID), ExpensiveCombines(ExpensiveCombines) {
52 13317 : initializeInstructionCombiningPassPass(*PassRegistry::getPassRegistry());
53 13317 : }
54 :
55 : void getAnalysisUsage(AnalysisUsage &AU) const override;
56 : bool runOnFunction(Function &F) override;
57 : };
58 :
59 : //===----------------------------------------------------------------------===//
60 : //
61 : // InstructionCombining - Combine instructions to form fewer, simple
62 : // instructions. This pass does not modify the CFG, and has a tendency to make
63 : // instructions dead, so a subsequent DCE pass is useful.
64 : //
65 : // This pass combines things like:
66 : // %Y = add int 1, %X
67 : // %Z = add int 1, %Y
68 : // into:
69 : // %Z = add int 2, %X
70 : //
71 : FunctionPass *createInstructionCombiningPass(bool ExpensiveCombines = true);
72 : }
73 :
74 : #endif
|