mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 04:28:30 +00:00
227df4bca0
We used to assume that any fixed-offset stack object was not aliased. This meant that no IR value could point to the memory contained in such an object. This is a reasonable default, but is not a universally-correct target-independent fact. For example, on PowerPC (both Darwin and non-Darwin), some byval arguments are allocated at fixed offsets by the ABI. These, however, certainly can be pointed to by IR values. This change moves the 'isAliased' logic out of FixedStackPseudoSourceValue and into MFI, and allows the isAliased property to be overridden for fixed-offset objects. This will be used by an upcoming commit to the PowerPC backend to fix PR20280. No functionality change intended (the behavior of FixedStackPseudoSourceValue::isAliased has been made more conservative for callers that don't pass an MFI object, but I don't see any in-tree callers that do that). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215794 91177308-0d34-0410-b5e6-96231b3b80d8
125 lines
3.5 KiB
C++
125 lines
3.5 KiB
C++
//===-- llvm/CodeGen/PseudoSourceValue.cpp ----------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the PseudoSourceValue class.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/CodeGen/PseudoSourceValue.h"
|
|
#include "llvm/CodeGen/MachineFrameInfo.h"
|
|
#include "llvm/IR/DerivedTypes.h"
|
|
#include "llvm/IR/LLVMContext.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/ManagedStatic.h"
|
|
#include "llvm/Support/Mutex.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include <map>
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
struct PSVGlobalsTy {
|
|
// PseudoSourceValues are immutable so don't need locking.
|
|
const PseudoSourceValue PSVs[4];
|
|
sys::Mutex Lock; // Guards FSValues, but not the values inside it.
|
|
std::map<int, const PseudoSourceValue *> FSValues;
|
|
|
|
PSVGlobalsTy() : PSVs() {}
|
|
~PSVGlobalsTy() {
|
|
for (std::map<int, const PseudoSourceValue *>::iterator
|
|
I = FSValues.begin(), E = FSValues.end(); I != E; ++I) {
|
|
delete I->second;
|
|
}
|
|
}
|
|
};
|
|
|
|
static ManagedStatic<PSVGlobalsTy> PSVGlobals;
|
|
|
|
} // anonymous namespace
|
|
|
|
const PseudoSourceValue *PseudoSourceValue::getStack()
|
|
{ return &PSVGlobals->PSVs[0]; }
|
|
const PseudoSourceValue *PseudoSourceValue::getGOT()
|
|
{ return &PSVGlobals->PSVs[1]; }
|
|
const PseudoSourceValue *PseudoSourceValue::getJumpTable()
|
|
{ return &PSVGlobals->PSVs[2]; }
|
|
const PseudoSourceValue *PseudoSourceValue::getConstantPool()
|
|
{ return &PSVGlobals->PSVs[3]; }
|
|
|
|
static const char *const PSVNames[] = {
|
|
"Stack",
|
|
"GOT",
|
|
"JumpTable",
|
|
"ConstantPool"
|
|
};
|
|
|
|
PseudoSourceValue::PseudoSourceValue(bool isFixed) : isFixed(isFixed) {}
|
|
|
|
PseudoSourceValue::~PseudoSourceValue() {}
|
|
|
|
void PseudoSourceValue::printCustom(raw_ostream &O) const {
|
|
O << PSVNames[this - PSVGlobals->PSVs];
|
|
}
|
|
|
|
const PseudoSourceValue *PseudoSourceValue::getFixedStack(int FI) {
|
|
PSVGlobalsTy &PG = *PSVGlobals;
|
|
sys::ScopedLock locked(PG.Lock);
|
|
const PseudoSourceValue *&V = PG.FSValues[FI];
|
|
if (!V)
|
|
V = new FixedStackPseudoSourceValue(FI);
|
|
return V;
|
|
}
|
|
|
|
bool PseudoSourceValue::isConstant(const MachineFrameInfo *) const {
|
|
if (this == getStack())
|
|
return false;
|
|
if (this == getGOT() ||
|
|
this == getConstantPool() ||
|
|
this == getJumpTable())
|
|
return true;
|
|
llvm_unreachable("Unknown PseudoSourceValue!");
|
|
}
|
|
|
|
bool PseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
|
|
if (this == getStack() ||
|
|
this == getGOT() ||
|
|
this == getConstantPool() ||
|
|
this == getJumpTable())
|
|
return false;
|
|
llvm_unreachable("Unknown PseudoSourceValue!");
|
|
}
|
|
|
|
bool PseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
|
|
if (this == getGOT() ||
|
|
this == getConstantPool() ||
|
|
this == getJumpTable())
|
|
return false;
|
|
return true;
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::isConstant(const MachineFrameInfo *MFI) const{
|
|
return MFI && MFI->isImmutableObjectIndex(FI);
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::isAliased(const MachineFrameInfo *MFI) const {
|
|
if (!MFI)
|
|
return true;
|
|
return MFI->isAliasedObjectIndex(FI);
|
|
}
|
|
|
|
bool FixedStackPseudoSourceValue::mayAlias(const MachineFrameInfo *MFI) const {
|
|
if (!MFI)
|
|
return true;
|
|
// Spill slots will not alias any LLVM IR value.
|
|
return !MFI->isSpillSlotObjectIndex(FI);
|
|
}
|
|
|
|
void FixedStackPseudoSourceValue::printCustom(raw_ostream &OS) const {
|
|
OS << "FixedStack" << FI;
|
|
}
|