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