1 //===- SSAUpdaterBulk.h - Unstructured SSA Update Tool ----------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // This file declares the SSAUpdaterBulk class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_TRANSFORMS_UTILS_SSAUPDATERBULK_H
14 #define LLVM_TRANSFORMS_UTILS_SSAUPDATERBULK_H
16 #include "llvm/ADT/DenseMap.h"
17 #include "llvm/ADT/SmallPtrSet.h"
18 #include "llvm/ADT/StringRef.h"
19 #include "llvm/IR/PredIteratorCache.h"
25 template <typename T
> class SmallVectorImpl
;
31 /// Helper class for SSA formation on a set of values defined in multiple
34 /// This is used when code duplication or another unstructured transformation
35 /// wants to rewrite a set of uses of one value with uses of a set of values.
36 /// The update is done only when RewriteAllUses is called, all other methods are
37 /// used for book-keeping. That helps to share some common computations between
38 /// updates of different uses (which is not the case when traditional SSAUpdater
40 class SSAUpdaterBulk
{
42 DenseMap
<BasicBlock
*, Value
*> Defines
;
43 SmallVector
<Use
*, 4> Uses
;
47 RewriteInfo(StringRef
&N
, Type
*T
) : Name(N
), Ty(T
){};
49 SmallVector
<RewriteInfo
, 4> Rewrites
;
51 PredIteratorCache PredCache
;
53 Value
*computeValueAt(BasicBlock
*BB
, RewriteInfo
&R
, DominatorTree
*DT
);
56 explicit SSAUpdaterBulk(){};
57 SSAUpdaterBulk(const SSAUpdaterBulk
&) = delete;
58 SSAUpdaterBulk
&operator=(const SSAUpdaterBulk
&) = delete;
61 /// Add a new variable to the SSA rewriter. This needs to be called before
62 /// AddAvailableValue or AddUse calls. The return value is the variable ID,
63 /// which needs to be passed to AddAvailableValue and AddUse.
64 unsigned AddVariable(StringRef Name
, Type
*Ty
);
66 /// Indicate that a rewritten value is available in the specified block with
67 /// the specified value.
68 void AddAvailableValue(unsigned Var
, BasicBlock
*BB
, Value
*V
);
70 /// Record a use of the symbolic value. This use will be updated with a
71 /// rewritten value when RewriteAllUses is called.
72 void AddUse(unsigned Var
, Use
*U
);
74 /// Return true if the SSAUpdater already has a value for the specified
75 /// variable in the specified block.
76 bool HasValueForBlock(unsigned Var
, BasicBlock
*BB
);
78 /// Perform all the necessary updates, including new PHI-nodes insertion and
79 /// the requested uses update.
81 /// The function requires dominator tree DT, which is used for computing
82 /// locations for new phi-nodes insertions. If a nonnull pointer to a vector
83 /// InsertedPHIs is passed, all the new phi-nodes will be added to this
85 void RewriteAllUses(DominatorTree
*DT
,
86 SmallVectorImpl
<PHINode
*> *InsertedPHIs
= nullptr);
89 } // end namespace llvm
91 #endif // LLVM_TRANSFORMS_UTILS_SSAUPDATERBULK_H