xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Transforms/Utils/SimplifyIndVar.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===-- llvm/Transforms/Utils/SimplifyIndVar.h - Indvar Utils ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file defines in interface for induction variable simplification. It does
10 // not define any actual pass or policy, but provides a single function to
11 // simplify a loop's induction variables based on ScalarEvolution.
12 //
13 //===----------------------------------------------------------------------===//
14 
15 #ifndef LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
16 #define LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
17 
18 #include <utility>
19 
20 namespace llvm {
21 
22 class Type;
23 class WeakTrackingVH;
24 template <typename T> class SmallVectorImpl;
25 class CastInst;
26 class DominatorTree;
27 class Loop;
28 class LoopInfo;
29 class PHINode;
30 class ScalarEvolution;
31 class SCEVExpander;
32 class TargetTransformInfo;
33 
34 /// Interface for visiting interesting IV users that are recognized but not
35 /// simplified by this utility.
36 class IVVisitor {
37 protected:
38   const DominatorTree *DT = nullptr;
39 
40   virtual void anchor();
41 
42 public:
43   IVVisitor() = default;
44   virtual ~IVVisitor() = default;
45 
getDomTree()46   const DominatorTree *getDomTree() const { return DT; }
47   virtual void visitCast(CastInst *Cast) = 0;
48 };
49 
50 /// simplifyUsersOfIV - Simplify instructions that use this induction variable
51 /// by using ScalarEvolution to analyze the IV's recurrence. Returns a pair
52 /// where the first entry indicates that the function makes changes and the
53 /// second entry indicates that it introduced new opportunities for loop
54 /// unswitching.
55 std::pair<bool, bool> simplifyUsersOfIV(PHINode *CurrIV, ScalarEvolution *SE,
56                                         DominatorTree *DT, LoopInfo *LI,
57                                         const TargetTransformInfo *TTI,
58                                         SmallVectorImpl<WeakTrackingVH> &Dead,
59                                         SCEVExpander &Rewriter,
60                                         IVVisitor *V = nullptr);
61 
62 /// SimplifyLoopIVs - Simplify users of induction variables within this
63 /// loop. This does not actually change or add IVs.
64 bool simplifyLoopIVs(Loop *L, ScalarEvolution *SE, DominatorTree *DT,
65                      LoopInfo *LI, const TargetTransformInfo *TTI,
66                      SmallVectorImpl<WeakTrackingVH> &Dead);
67 
68 /// Collect information about induction variables that are used by sign/zero
69 /// extend operations. This information is recorded by CollectExtend and provides
70 /// the input to WidenIV.
71 struct WideIVInfo {
72   PHINode *NarrowIV = nullptr;
73 
74   // Widest integer type created [sz]ext
75   Type *WidestNativeType = nullptr;
76 
77   // Was a sext user seen before a zext?
78   bool IsSigned = false;
79 };
80 
81 /// Widen Induction Variables - Extend the width of an IV to cover its
82 /// widest uses.
83 PHINode *createWideIV(const WideIVInfo &WI,
84     LoopInfo *LI, ScalarEvolution *SE, SCEVExpander &Rewriter,
85     DominatorTree *DT, SmallVectorImpl<WeakTrackingVH> &DeadInsts,
86     unsigned &NumElimExt, unsigned &NumWidened,
87     bool HasGuards, bool UsePostIncrementRanges);
88 
89 } // end namespace llvm
90 
91 #endif // LLVM_TRANSFORMS_UTILS_SIMPLIFYINDVAR_H
92