LazyValueInfo.h revision cfa7fb6df5aaaf9e54fe97633167b44782224e45
1//===- LazyValueInfo.h - Value constraint analysis --------------*- 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//
10// This file defines the interface for lazy computation of value constraint
11// information.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_ANALYSIS_LIVEVALUES_H
16#define LLVM_ANALYSIS_LIVEVALUES_H
17
18#include "llvm/Pass.h"
19
20namespace llvm {
21  class Constant;
22  class TargetData;
23  class Value;
24
25/// LazyValueInfo - This pass computes, caches, and vends lazy value constraint
26/// information.
27class LazyValueInfo : public FunctionPass {
28  class TargetData *TD;
29  void *PImpl;
30  LazyValueInfo(const LazyValueInfo&); // DO NOT IMPLEMENT.
31  void operator=(const LazyValueInfo&); // DO NOT IMPLEMENT.
32public:
33  static char ID;
34  LazyValueInfo() : FunctionPass(&ID), PImpl(0) {}
35  ~LazyValueInfo() { assert(PImpl == 0 && "releaseMemory not called"); }
36
37  /// Tristate - This is used to return true/false/dunno results.
38  enum Tristate {
39    Unknown = -1, False = 0, True = 1
40  };
41
42
43  // Public query interface.
44
45  /// getPredicateOnEdge - Determine whether the specified value comparison
46  /// with a constant is known to be true or false on the specified CFG edge.
47  /// Pred is a CmpInst predicate.
48  Tristate getPredicateOnEdge(unsigned Pred, Value *V, Constant *C,
49                              BasicBlock *FromBB, BasicBlock *ToBB);
50
51
52  /// getConstant - Determine whether the specified value is known to be a
53  /// constant at the end of the specified block.  Return null if not.
54  Constant *getConstant(Value *V, BasicBlock *BB);
55
56  /// getConstantOnEdge - Determine whether the specified value is known to be a
57  /// constant on the specified edge.  Return null if not.
58  Constant *getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB);
59
60  /// threadEdge - Inform the analysis cache that we have threaded an edge from
61  /// PredBB to OldSucc to be from PredBB to NewSucc instead.
62  void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc);
63
64
65  // Implementation boilerplate.
66
67  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
68    AU.setPreservesAll();
69  }
70  virtual void releaseMemory();
71  virtual bool runOnFunction(Function &F);
72};
73
74}  // end namespace llvm
75
76#endif
77
78