[PATCH] R600: Use GetUnderlyingObject

Tom Stellard tom at stellard.net
Tue Jun 18 16:27:41 PDT 2013


On Tue, Jun 18, 2013 at 03:53:31PM -0700, Matt Arsenault wrote:
>   Make the rest of the is*Load functions non-static for consistency
>

Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

Thanks!  Go ahead and commit.

> http://llvm-reviews.chandlerc.com/D1005
> 
> CHANGE SINCE LAST DIFF
>   http://llvm-reviews.chandlerc.com/D1005?vs=2471&id=2472#toc
> 
> Files:
>   lib/Target/R600/AMDILISelDAGToDAG.cpp
> 
> Index: lib/Target/R600/AMDILISelDAGToDAG.cpp
> ===================================================================
> --- lib/Target/R600/AMDILISelDAGToDAG.cpp
> +++ lib/Target/R600/AMDILISelDAGToDAG.cpp
> @@ -17,6 +17,7 @@
>  #include "R600InstrInfo.h"
>  #include "SIISelLowering.h"
>  #include "llvm/ADT/ValueMap.h"
> +#include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/CodeGen/MachineRegisterInfo.h"
>  #include "llvm/CodeGen/PseudoSourceValue.h"
>  #include "llvm/CodeGen/SelectionDAG.h"
> @@ -59,20 +60,19 @@
>    bool SelectADDR64(SDValue N, SDValue &R1, SDValue &R2);
>  
>    static bool checkType(const Value *ptr, unsigned int addrspace);
> -  static const Value *getBasePointerValue(const Value *V);
>  
>    static bool isGlobalStore(const StoreSDNode *N);
>    static bool isPrivateStore(const StoreSDNode *N);
>    static bool isLocalStore(const StoreSDNode *N);
>    static bool isRegionStore(const StoreSDNode *N);
>  
> -  static bool isCPLoad(const LoadSDNode *N);
> -  static bool isConstantLoad(const LoadSDNode *N, int cbID);
> -  static bool isGlobalLoad(const LoadSDNode *N);
> -  static bool isParamLoad(const LoadSDNode *N);
> -  static bool isPrivateLoad(const LoadSDNode *N);
> -  static bool isLocalLoad(const LoadSDNode *N);
> -  static bool isRegionLoad(const LoadSDNode *N);
> +  bool isCPLoad(const LoadSDNode *N) const;
> +  bool isConstantLoad(const LoadSDNode *N, int cbID) const;
> +  bool isGlobalLoad(const LoadSDNode *N) const;
> +  bool isParamLoad(const LoadSDNode *N) const;
> +  bool isPrivateLoad(const LoadSDNode *N) const;
> +  bool isLocalLoad(const LoadSDNode *N) const;
> +  bool isRegionLoad(const LoadSDNode *N) const;
>  
>    bool SelectGlobalValueConstantOffset(SDValue Addr, SDValue& IntPtr);
>    bool SelectGlobalValueVariableOffset(SDValue Addr,
> @@ -332,7 +332,7 @@
>            Result = CurDAG->UpdateNodeOperands(Result, Ops.data(), Ops.size());
>          }
>        } while (IsModified);
> -      
> +
>      }
>      if (Result && Result->isMachineOpcode() &&
>          !(TII->get(Result->getMachineOpcode()).TSFlags & R600_InstFlag::VECTOR)
> @@ -542,46 +542,6 @@
>    return dyn_cast<PointerType>(ptrType)->getAddressSpace() == addrspace;
>  }
>  
> -const Value * AMDGPUDAGToDAGISel::getBasePointerValue(const Value *V) {
> -  if (!V) {
> -    return NULL;
> -  }
> -  const Value *ret = NULL;
> -  ValueMap<const Value *, bool> ValueBitMap;
> -  std::queue<const Value *, std::list<const Value *> > ValueQueue;
> -  ValueQueue.push(V);
> -  while (!ValueQueue.empty()) {
> -    V = ValueQueue.front();
> -    if (ValueBitMap.find(V) == ValueBitMap.end()) {
> -      ValueBitMap[V] = true;
> -      if (dyn_cast<Argument>(V) && dyn_cast<PointerType>(V->getType())) {
> -        ret = V;
> -        break;
> -      } else if (dyn_cast<GlobalVariable>(V)) {
> -        ret = V;
> -        break;
> -      } else if (dyn_cast<Constant>(V)) {
> -        const ConstantExpr *CE = dyn_cast<ConstantExpr>(V);
> -        if (CE) {
> -          ValueQueue.push(CE->getOperand(0));
> -        }
> -      } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
> -        ret = AI;
> -        break;
> -      } else if (const Instruction *I = dyn_cast<Instruction>(V)) {
> -        uint32_t numOps = I->getNumOperands();
> -        for (uint32_t x = 0; x < numOps; ++x) {
> -          ValueQueue.push(I->getOperand(x));
> -        }
> -      } else {
> -        assert(!"Found a Value that we didn't know how to handle!");
> -      }
> -    }
> -    ValueQueue.pop();
> -  }
> -  return ret;
> -}
> -
>  bool AMDGPUDAGToDAGISel::isGlobalStore(const StoreSDNode *N) {
>    return checkType(N->getSrcValue(), AMDGPUAS::GLOBAL_ADDRESS);
>  }
> @@ -600,41 +560,43 @@
>    return checkType(N->getSrcValue(), AMDGPUAS::REGION_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isConstantLoad(const LoadSDNode *N, int cbID) {
> +bool AMDGPUDAGToDAGISel::isConstantLoad(const LoadSDNode *N, int cbID) const {
>    if (checkType(N->getSrcValue(), AMDGPUAS::CONSTANT_ADDRESS)) {
>      return true;
>    }
> +
> +  const DataLayout *DL = TM.getDataLayout();
>    MachineMemOperand *MMO = N->getMemOperand();
>    const Value *V = MMO->getValue();
> -  const Value *BV = getBasePointerValue(V);
> +  const Value *BV = GetUnderlyingObject(V, DL, 0);
>    if (MMO
>        && MMO->getValue()
>        && ((V && dyn_cast<GlobalValue>(V))
>            || (BV && dyn_cast<GlobalValue>(
> -                        getBasePointerValue(MMO->getValue()))))) {
> +                GetUnderlyingObject(MMO->getValue(), DL, 0))))) {
>      return checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS);
>    } else {
>      return false;
>    }
>  }
>  
> -bool AMDGPUDAGToDAGISel::isGlobalLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isGlobalLoad(const LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::GLOBAL_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isParamLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isParamLoad(const LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::PARAM_I_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isLocalLoad(const  LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isLocalLoad(const  LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::LOCAL_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isRegionLoad(const  LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isRegionLoad(const  LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::REGION_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isCPLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isCPLoad(const LoadSDNode *N) const {
>    MachineMemOperand *MMO = N->getMemOperand();
>    if (checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS)) {
>      if (MMO) {
> @@ -648,7 +610,7 @@
>    return false;
>  }
>  
> -bool AMDGPUDAGToDAGISel::isPrivateLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isPrivateLoad(const LoadSDNode *N) const {
>    if (checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS)) {
>      // Check to make sure we are not a constant pool load or a constant load
>      // that is marked as a private load

> Index: lib/Target/R600/AMDILISelDAGToDAG.cpp
> ===================================================================
> --- lib/Target/R600/AMDILISelDAGToDAG.cpp
> +++ lib/Target/R600/AMDILISelDAGToDAG.cpp
> @@ -17,6 +17,7 @@
>  #include "R600InstrInfo.h"
>  #include "SIISelLowering.h"
>  #include "llvm/ADT/ValueMap.h"
> +#include "llvm/Analysis/ValueTracking.h"
>  #include "llvm/CodeGen/MachineRegisterInfo.h"
>  #include "llvm/CodeGen/PseudoSourceValue.h"
>  #include "llvm/CodeGen/SelectionDAG.h"
> @@ -59,20 +60,19 @@
>    bool SelectADDR64(SDValue N, SDValue &R1, SDValue &R2);
>  
>    static bool checkType(const Value *ptr, unsigned int addrspace);
> -  static const Value *getBasePointerValue(const Value *V);
>  
>    static bool isGlobalStore(const StoreSDNode *N);
>    static bool isPrivateStore(const StoreSDNode *N);
>    static bool isLocalStore(const StoreSDNode *N);
>    static bool isRegionStore(const StoreSDNode *N);
>  
> -  static bool isCPLoad(const LoadSDNode *N);
> -  static bool isConstantLoad(const LoadSDNode *N, int cbID);
> -  static bool isGlobalLoad(const LoadSDNode *N);
> -  static bool isParamLoad(const LoadSDNode *N);
> -  static bool isPrivateLoad(const LoadSDNode *N);
> -  static bool isLocalLoad(const LoadSDNode *N);
> -  static bool isRegionLoad(const LoadSDNode *N);
> +  bool isCPLoad(const LoadSDNode *N) const;
> +  bool isConstantLoad(const LoadSDNode *N, int cbID) const;
> +  bool isGlobalLoad(const LoadSDNode *N) const;
> +  bool isParamLoad(const LoadSDNode *N) const;
> +  bool isPrivateLoad(const LoadSDNode *N) const;
> +  bool isLocalLoad(const LoadSDNode *N) const;
> +  bool isRegionLoad(const LoadSDNode *N) const;
>  
>    bool SelectGlobalValueConstantOffset(SDValue Addr, SDValue& IntPtr);
>    bool SelectGlobalValueVariableOffset(SDValue Addr,
> @@ -332,7 +332,7 @@
>            Result = CurDAG->UpdateNodeOperands(Result, Ops.data(), Ops.size());
>          }
>        } while (IsModified);
> -      
> +
>      }
>      if (Result && Result->isMachineOpcode() &&
>          !(TII->get(Result->getMachineOpcode()).TSFlags & R600_InstFlag::VECTOR)
> @@ -542,46 +542,6 @@
>    return dyn_cast<PointerType>(ptrType)->getAddressSpace() == addrspace;
>  }
>  
> -const Value * AMDGPUDAGToDAGISel::getBasePointerValue(const Value *V) {
> -  if (!V) {
> -    return NULL;
> -  }
> -  const Value *ret = NULL;
> -  ValueMap<const Value *, bool> ValueBitMap;
> -  std::queue<const Value *, std::list<const Value *> > ValueQueue;
> -  ValueQueue.push(V);
> -  while (!ValueQueue.empty()) {
> -    V = ValueQueue.front();
> -    if (ValueBitMap.find(V) == ValueBitMap.end()) {
> -      ValueBitMap[V] = true;
> -      if (dyn_cast<Argument>(V) && dyn_cast<PointerType>(V->getType())) {
> -        ret = V;
> -        break;
> -      } else if (dyn_cast<GlobalVariable>(V)) {
> -        ret = V;
> -        break;
> -      } else if (dyn_cast<Constant>(V)) {
> -        const ConstantExpr *CE = dyn_cast<ConstantExpr>(V);
> -        if (CE) {
> -          ValueQueue.push(CE->getOperand(0));
> -        }
> -      } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(V)) {
> -        ret = AI;
> -        break;
> -      } else if (const Instruction *I = dyn_cast<Instruction>(V)) {
> -        uint32_t numOps = I->getNumOperands();
> -        for (uint32_t x = 0; x < numOps; ++x) {
> -          ValueQueue.push(I->getOperand(x));
> -        }
> -      } else {
> -        assert(!"Found a Value that we didn't know how to handle!");
> -      }
> -    }
> -    ValueQueue.pop();
> -  }
> -  return ret;
> -}
> -
>  bool AMDGPUDAGToDAGISel::isGlobalStore(const StoreSDNode *N) {
>    return checkType(N->getSrcValue(), AMDGPUAS::GLOBAL_ADDRESS);
>  }
> @@ -600,41 +560,43 @@
>    return checkType(N->getSrcValue(), AMDGPUAS::REGION_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isConstantLoad(const LoadSDNode *N, int cbID) {
> +bool AMDGPUDAGToDAGISel::isConstantLoad(const LoadSDNode *N, int cbID) const {
>    if (checkType(N->getSrcValue(), AMDGPUAS::CONSTANT_ADDRESS)) {
>      return true;
>    }
> +
> +  const DataLayout *DL = TM.getDataLayout();
>    MachineMemOperand *MMO = N->getMemOperand();
>    const Value *V = MMO->getValue();
> -  const Value *BV = getBasePointerValue(V);
> +  const Value *BV = GetUnderlyingObject(V, DL, 0);
>    if (MMO
>        && MMO->getValue()
>        && ((V && dyn_cast<GlobalValue>(V))
>            || (BV && dyn_cast<GlobalValue>(
> -                        getBasePointerValue(MMO->getValue()))))) {
> +                GetUnderlyingObject(MMO->getValue(), DL, 0))))) {
>      return checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS);
>    } else {
>      return false;
>    }
>  }
>  
> -bool AMDGPUDAGToDAGISel::isGlobalLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isGlobalLoad(const LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::GLOBAL_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isParamLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isParamLoad(const LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::PARAM_I_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isLocalLoad(const  LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isLocalLoad(const  LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::LOCAL_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isRegionLoad(const  LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isRegionLoad(const  LoadSDNode *N) const {
>    return checkType(N->getSrcValue(), AMDGPUAS::REGION_ADDRESS);
>  }
>  
> -bool AMDGPUDAGToDAGISel::isCPLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isCPLoad(const LoadSDNode *N) const {
>    MachineMemOperand *MMO = N->getMemOperand();
>    if (checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS)) {
>      if (MMO) {
> @@ -648,7 +610,7 @@
>    return false;
>  }
>  
> -bool AMDGPUDAGToDAGISel::isPrivateLoad(const LoadSDNode *N) {
> +bool AMDGPUDAGToDAGISel::isPrivateLoad(const LoadSDNode *N) const {
>    if (checkType(N->getSrcValue(), AMDGPUAS::PRIVATE_ADDRESS)) {
>      // Check to make sure we are not a constant pool load or a constant load
>      // that is marked as a private load

> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits




More information about the llvm-commits mailing list