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