169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- 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 implements the PseudoSourceValue class.
1169de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//
1269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman//===----------------------------------------------------------------------===//
1369de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
1469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman#include "llvm/CodeGen/PseudoSourceValue.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFrameInfo.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
19c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h"
21edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattnerusing namespace llvm;
2269de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
23edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattnerstatic const char *const PSVNames[] = {
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    "Stack", "GOT", "JumpTable", "ConstantPool", "FixedStack",
25f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    "GlobalValueCallEntry", "ExternalSymbolCallEntry"};
2669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
27f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarPseudoSourceValue::PseudoSourceValue(PSVKind Kind) : Kind(Kind) {}
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesPseudoSourceValue::~PseudoSourceValue() {}
3069de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman
31cd26ec5f3c089b3b24f80ff200e94e681eb9e1eeDan Gohmanvoid PseudoSourceValue::printCustom(raw_ostream &O) const {
32f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  O << PSVNames[Kind];
33edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattner}
346d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman
35edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattnerbool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {
36f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (isStack())
376d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman    return false;
38f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (isGOT() || isConstantPool() || isJumpTable())
39edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattner    return true;
40c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  llvm_unreachable("Unknown PseudoSourceValue!");
41edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattner}
426d69ba8a6901c69d78488cbc41f8dbf080618fdeDan Gohman
43f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool PseudoSourceValue::isAliased(const MachineFrameInfo *) const {
44f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (isStack() || isGOT() || isConstantPool() || isJumpTable())
45ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng    return false;
46ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng  llvm_unreachable("Unknown PseudoSourceValue!");
47ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng}
48ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng
49f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool PseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
50f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return !(isGOT() || isConstantPool() || isJumpTable());
51f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng}
52f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng
53f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool FixedStackPseudoSourceValue::isConstant(
54f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const MachineFrameInfo *MFI) const {
55edfb72c6288118ab9c900a560ded89dfaa107296Chris Lattner  return MFI && MFI->isImmutableObjectIndex(FI);
5669de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman}
57ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng
5838bdfc69cbe370ce5f623df4449afa32cda97422Evan Chengbool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
5938bdfc69cbe370ce5f623df4449afa32cda97422Evan Cheng  if (!MFI)
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    return true;
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return MFI->isAliasedObjectIndex(FI);
62ff89dcb06fbd103373436e2d0ae85f252fae2254Evan Cheng}
63f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng
64f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Chengbool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
65f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng  if (!MFI)
66f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng    return true;
67f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng  // Spill slots will not alias any LLVM IR value.
68f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng  return !MFI->isSpillSlotObjectIndex(FI);
69f57b1baa441e3bbce7f264d8bb5054e50fe8ee1cEvan Cheng}
70b3bc115a2414a922caa40d5536d8a35ca54e40e3David Greene
71b3bc115a2414a922caa40d5536d8a35ca54e40e3David Greenevoid FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const {
72b3bc115a2414a922caa40d5536d8a35ca54e40e3David Greene  OS << "FixedStack" << FI;
73b3bc115a2414a922caa40d5536d8a35ca54e40e3David Greene}
74f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
75f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarCallEntryPseudoSourceValue::CallEntryPseudoSourceValue(PSVKind Kind)
76f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : PseudoSourceValue(Kind) {}
77f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
78f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool CallEntryPseudoSourceValue::isConstant(const MachineFrameInfo *) const {
79f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
80f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
81f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
82f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool CallEntryPseudoSourceValue::isAliased(const MachineFrameInfo *) const {
83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
84f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
85f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
86f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarbool CallEntryPseudoSourceValue::mayAlias(const MachineFrameInfo *) const {
87f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return false;
88f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
89f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
90f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarGlobalValuePseudoSourceValue::GlobalValuePseudoSourceValue(
91f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    const GlobalValue *GV)
92f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : CallEntryPseudoSourceValue(GlobalValueCallEntry), GV(GV) {}
93f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
94f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarExternalSymbolPseudoSourceValue::ExternalSymbolPseudoSourceValue(const char *ES)
95f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : CallEntryPseudoSourceValue(ExternalSymbolCallEntry), ES(ES) {}
96f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
97f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarPseudoSourceValueManager::PseudoSourceValueManager()
98f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    : StackPSV(PseudoSourceValue::Stack), GOTPSV(PseudoSourceValue::GOT),
99f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      JumpTablePSV(PseudoSourceValue::JumpTable),
100f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      ConstantPoolPSV(PseudoSourceValue::ConstantPool) {}
101f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *PseudoSourceValueManager::getStack() {
103f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return &StackPSV;
104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
105f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
106f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *PseudoSourceValueManager::getGOT() { return &GOTPSV; }
107f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
108f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *PseudoSourceValueManager::getConstantPool() {
109f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return &ConstantPoolPSV;
110f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
111f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
112f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *PseudoSourceValueManager::getJumpTable() {
113f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return &JumpTablePSV;
114f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
115f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
116f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *PseudoSourceValueManager::getFixedStack(int FI) {
117f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<FixedStackPseudoSourceValue> &V = FSValues[FI];
118f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!V)
119f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    V = llvm::make_unique<FixedStackPseudoSourceValue>(FI);
120f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return V.get();
121f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
122f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
123f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *
124f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarPseudoSourceValueManager::getGlobalValueCallEntry(const GlobalValue *GV) {
125f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<const GlobalValuePseudoSourceValue> &E =
126f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      GlobalCallEntries[GV];
127f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!E)
128f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    E = llvm::make_unique<GlobalValuePseudoSourceValue>(GV);
129f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return E.get();
130f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
131f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
132f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainarconst PseudoSourceValue *
133f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarPseudoSourceValueManager::getExternalSymbolCallEntry(const char *ES) {
134f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  std::unique_ptr<const ExternalSymbolPseudoSourceValue> &E =
135f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      ExternalCallEntries[ES];
136f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (!E)
137f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    E = llvm::make_unique<ExternalSymbolPseudoSourceValue>(ES);
138f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return E.get();
139f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
140