aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/Transforms/Utils/SSAUpdater.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-10-10 09:04:27 +0000
committerChris Lattner <sabre@nondot.org>2009-10-10 09:04:27 +0000
commit93f3bcf7f323069e40d9abb950da73d437b6f7da (patch)
treea0d7e1e4460aba702115c80b9473f789635c664d /include/llvm/Transforms/Utils/SSAUpdater.h
parentf6811274e18a73e7ba84a820a28cc2549a4fab44 (diff)
Implement an efficient and fully general SSA update mechanism that
works on unstructured CFGs. This implements PR217, our oldest open PR. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83705 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Transforms/Utils/SSAUpdater.h')
-rw-r--r--include/llvm/Transforms/Utils/SSAUpdater.h71
1 files changed, 71 insertions, 0 deletions
diff --git a/include/llvm/Transforms/Utils/SSAUpdater.h b/include/llvm/Transforms/Utils/SSAUpdater.h
new file mode 100644
index 0000000000..5e11984bf3
--- /dev/null
+++ b/include/llvm/Transforms/Utils/SSAUpdater.h
@@ -0,0 +1,71 @@
+//===-- SSAUpdater.h - Unstructured SSA Update Tool -------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file declares the SSAUpdater class.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_SSAUPDATER_H
+#define LLVM_TRANSFORMS_UTILS_SSAUPDATER_H
+
+namespace llvm {
+ class Value;
+ class BasicBlock;
+ class Use;
+
+/// SSAUpdater - This class updates SSA form for a set of values defined in
+/// multiple blocks. This is used when code duplication or another unstructured
+/// transformation wants to rewrite a set of uses of one value with uses of a
+/// set of values.
+class SSAUpdater {
+ /// AvailableVals - This keeps track of which value to use on a per-block
+ /// basis. When we insert PHI nodes, we keep track of them here. We use
+ /// WeakVH's for the value of the map because we RAUW PHI nodes when we
+ /// eliminate them, and want the WeakVH to track this.
+ //typedef DenseMap<BasicBlock*, TrackingVH<Value> > AvailableValsTy;
+ void *AV;
+
+ /// PrototypeValue is an arbitrary representative value, which we derive names
+ /// and a type for PHI nodes.
+ Value *PrototypeValue;
+
+ /// IncomingPredInfo - We use this as scratch space when doing our recursive
+ /// walk. This should only be used in GetValueInBlockInternal, normally it
+ /// should be empty.
+ //std::vector<std::pair<BasicBlock*, TrackingVH<Value> > > IncomingPredInfo;
+ void *IPI;
+public:
+ SSAUpdater();
+ ~SSAUpdater();
+
+ /// Initialize - Reset this object to get ready for a new set of SSA
+ /// updates. ProtoValue is the value used to name PHI nodes.
+ void Initialize(Value *ProtoValue);
+
+ /// AddAvailableValue - Indicate that a rewritten value is available in the
+ /// specified block with the specified value.
+ void AddAvailableValue(BasicBlock *BB, Value *V);
+
+ /// GetValueInBlock - Construct SSA form, materializing a value in the
+ /// specified block.
+ Value *GetValueInBlock(BasicBlock *BB);
+
+ /// RewriteUse - Rewrite a use of the symbolic value. This handles PHI nodes,
+ /// which use their value in the corresponding predecessor.
+ void RewriteUse(Use &U);
+
+private:
+ Value *GetValueInBlockInternal(BasicBlock *BB);
+ void operator=(const SSAUpdater&); // DO NOT IMPLEMENT
+ SSAUpdater(const SSAUpdater&); // DO NOT IMPLEMENT
+};
+
+} // End llvm namespace
+
+#endif