169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//===-- llvm/CodeGen/PseudoSourceValue.h ------------------------*- C++ -*-===//
269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
369de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//                     The LLVM Compiler Infrastructure
469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
569de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman// This file is distributed under the University of Illinois Open Source
669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman// License. See LICENSE.TXT for details.
769de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//===----------------------------------------------------------------------===//
969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
1069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman// This file contains the declaration of the PseudoSourceValue class.
1169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
1269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//===----------------------------------------------------------------------===//
1369de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
1469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman#ifndef LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
1569de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman#define LLVM_CODEGEN_PSEUDOSOURCEVALUE_H
1669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Value.h"
1869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
1969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohmannamespace llvm {
206d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman  class MachineFrameInfo;
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  class MachineMemOperand;
2240ab164d3ae6fddb279ae49ab2f9756b466c640aEvan Cheng  class raw_ostream;
236d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  raw_ostream &operator<<(raw_ostream &OS, const MachineMemOperand &MMO);
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
2669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  /// PseudoSourceValue - Special value supplied for machine level alias
2711772e093f159a37d92fe5855faa89ad70b1639dChad Rosier  /// analysis. It indicates that a memory access references the functions
2869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  /// stack frame (e.g., a spill slot), below the stack frame (e.g., argument
2969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  /// space), or constant pool.
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  class PseudoSourceValue {
31cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohman  private:
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    friend raw_ostream &llvm::operator<<(raw_ostream &OS,
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                         const MachineMemOperand &MMO);
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
35cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohman    /// printCustom - Implement printing for PseudoSourceValue. This is called
36cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohman    /// from Value::print or Value's operator<<.
37cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohman    ///
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    virtual void printCustom(raw_ostream &O) const;
39cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohman
4069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  public:
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    /// isFixed - Whether this is a FixedStackPseudoSourceValue.
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    bool isFixed;
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    explicit PseudoSourceValue(bool isFixed = false);
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    virtual ~PseudoSourceValue();
4769de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
483479d18b98694d9db6c2897ea909e6e381abfe92Dan Gohman    /// isConstant - Test whether the memory pointed to by this
493479d18b98694d9db6c2897ea909e6e381abfe92Dan Gohman    /// PseudoSourceValue has a constant value.
506d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman    ///
516d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman    virtual bool isConstant(const MachineFrameInfo *) const;
526d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman
53ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng    /// isAliased - Test whether the memory pointed to by this
54ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng    /// PseudoSourceValue may also be pointed to by an LLVM IR Value.
5538bdfc69cbe370ce5f623df4449afa32cda97422Evan Cheng    virtual bool isAliased(const MachineFrameInfo *) const;
56ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng
57f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng    /// mayAlias - Return true if the memory pointed to by this
5813230064236e0cb916cefddcd75bd55d9ce15c41Daniel Dunbar    /// PseudoSourceValue can ever alias an LLVM IR Value.
59f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng    virtual bool mayAlias(const MachineFrameInfo *) const;
60f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng
616553155172a2e74feff1253837daa608123de54aEvan Cheng    /// A pseudo source value referencing a fixed stack frame entry,
626553155172a2e74feff1253837daa608123de54aEvan Cheng    /// e.g., a spill slot.
636553155172a2e74feff1253837daa608123de54aEvan Cheng    static const PseudoSourceValue *getFixedStack(int FI);
6469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
65d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// A pseudo source value referencing the area below the stack frame of
66d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// a function, e.g., the argument space.
673069b8743769527ce7af6cfb6591a2f0fc2faee4Dan Gohman    static const PseudoSourceValue *getStack();
6869de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
69d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// A pseudo source value referencing the global offset table
70d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// (or something the like).
713069b8743769527ce7af6cfb6591a2f0fc2faee4Dan Gohman    static const PseudoSourceValue *getGOT();
7269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
73d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// A pseudo source value referencing the constant pool. Since constant
74d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// pools are constant, this doesn't need to identify a specific constant
75d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// pool entry.
763069b8743769527ce7af6cfb6591a2f0fc2faee4Dan Gohman    static const PseudoSourceValue *getConstantPool();
7769de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
78d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// A pseudo source value referencing a jump table. Since jump tables are
79d1f3cee976a991bcc4d0460dd9e60d5d215c8bfcDan Gohman    /// constant, this doesn't need to identify a specific jump table.
803069b8743769527ce7af6cfb6591a2f0fc2faee4Dan Gohman    static const PseudoSourceValue *getJumpTable();
8169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman  };
82cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
83cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  /// FixedStackPseudoSourceValue - A specialized PseudoSourceValue
84cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  /// for holding FixedStack values, which must include a frame
85cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  /// index.
86cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  class FixedStackPseudoSourceValue : public PseudoSourceValue {
87cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    const int FI;
88cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  public:
89cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    explicit FixedStackPseudoSourceValue(int fi) :
90dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines        PseudoSourceValue(true), FI(fi) {}
91cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
92cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    /// classof - Methods for support type inquiry through isa, cast, and
93cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    /// dyn_cast:
94cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    ///
95dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    static inline bool classof(const PseudoSourceValue *V) {
96dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines      return V->isFixed == true;
97cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene    }
98cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool isConstant(const MachineFrameInfo *MFI) const override;
100cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool isAliased(const MachineFrameInfo *MFI) const override;
102cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    bool mayAlias(const MachineFrameInfo *) const override;
104cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    void printCustom(raw_ostream &OS) const override;
106cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene
107b3bc115a2414a922caa40d5536d8a35ca54e40e3David Greene    int getFrameIndex() const { return FI; }
108cf62632d835313b720b68669bd1e5682d4d52d0dDavid Greene  };
10969de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman} // End llvm namespace
11069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
11169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman#endif
112