forked from OSchip/llvm-project
add getPointerAddressSpace() to GEP instruction, use the method
in a few scalar xforms to simplify things. llvm-svn: 80506
This commit is contained in:
parent
c856539edf
commit
a3e620caba
|
@ -570,6 +570,10 @@ public:
|
|||
static unsigned getPointerOperandIndex() {
|
||||
return 0U; // get index for modifying correct operand
|
||||
}
|
||||
|
||||
unsigned getPointerAddressSpace() const {
|
||||
return cast<PointerType>(getType())->getAddressSpace();
|
||||
}
|
||||
|
||||
/// getPointerOperandType - Method to return the pointer operand as a
|
||||
/// PointerType.
|
||||
|
|
|
@ -11289,8 +11289,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
|||
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {
|
||||
const Value *GEPI0 = GEPI->getOperand(0);
|
||||
// TODO: Consider a target hook for valid address spaces for this xform.
|
||||
if (isa<ConstantPointerNull>(GEPI0) &&
|
||||
cast<PointerType>(GEPI0->getType())->getAddressSpace() == 0) {
|
||||
if (isa<ConstantPointerNull>(GEPI0) && GEPI->getPointerAddressSpace() == 0){
|
||||
// Insert a new store to null instruction before the load to indicate
|
||||
// that this code is not reachable. We do this instead of inserting
|
||||
// an unreachable instruction directly because we cannot modify the
|
||||
|
@ -11304,8 +11303,8 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
|
|||
if (Constant *C = dyn_cast<Constant>(Op)) {
|
||||
// load null/undef -> undef
|
||||
// TODO: Consider a target hook for valid address spaces for this xform.
|
||||
if (isa<UndefValue>(C) || (C->isNullValue() &&
|
||||
cast<PointerType>(Op->getType())->getAddressSpace() == 0)) {
|
||||
if (isa<UndefValue>(C) ||
|
||||
(C->isNullValue() && LI.getPointerAddressSpace() == 0)) {
|
||||
// Insert a new store to null instruction before the load to indicate that
|
||||
// this code is not reachable. We do this instead of inserting an
|
||||
// unreachable instruction directly because we cannot modify the CFG.
|
||||
|
@ -11640,8 +11639,7 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) {
|
|||
if (SI.isVolatile()) return 0; // Don't hack volatile stores.
|
||||
|
||||
// store X, null -> turns into 'unreachable' in SimplifyCFG
|
||||
if (isa<ConstantPointerNull>(Ptr) &&
|
||||
cast<PointerType>(Ptr->getType())->getAddressSpace() == 0) {
|
||||
if (isa<ConstantPointerNull>(Ptr) && SI.getPointerAddressSpace() == 0) {
|
||||
if (!isa<UndefValue>(Val)) {
|
||||
SI.setOperand(0, UndefValue::get(Val->getType()));
|
||||
if (Instruction *U = dyn_cast<Instruction>(Val))
|
||||
|
|
|
@ -1131,8 +1131,7 @@ void SCCPSolver::visitLoadInst(LoadInst &I) {
|
|||
if (PtrVal.isConstant() && !I.isVolatile()) {
|
||||
Value *Ptr = PtrVal.getConstant();
|
||||
// TODO: Consider a target hook for valid address spaces for this xform.
|
||||
if (isa<ConstantPointerNull>(Ptr) &&
|
||||
cast<PointerType>(Ptr->getType())->getAddressSpace() == 0) {
|
||||
if (isa<ConstantPointerNull>(Ptr) && I.getPointerAddressSpace() == 0) {
|
||||
// load null -> null
|
||||
markConstant(IV, &I, Constant::getNullValue(I.getType()));
|
||||
return;
|
||||
|
|
|
@ -132,7 +132,7 @@ static bool MarkAliveBlocks(BasicBlock *BB,
|
|||
|
||||
if (isa<UndefValue>(Ptr) ||
|
||||
(isa<ConstantPointerNull>(Ptr) &&
|
||||
cast<PointerType>(Ptr->getType())->getAddressSpace() == 0)) {
|
||||
SI->getPointerAddressSpace() == 0)) {
|
||||
ChangeToUnreachable(SI, Context);
|
||||
Changed = true;
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue