[llvm-dev] 6 separate instances of static getPointerOperand(). Time to consolidate?

Justin Bogner via llvm-dev llvm-dev at lists.llvm.org
Tue Feb 6 10:58:10 PST 2018


"Saito, Hideki via llvm-dev" <llvm-dev at lists.llvm.org> writes:
> LLVM friends,
>
> I'm currently trying to make LoopVectorizationLegality class in
> Transform/Vectorize/LoopVectorize.cpp more modular and eventually move
> it to Analysis directory tree. It uses several file scope helper
> functions that do not really belong to LoopVectorize. Let me start
> from getPointerOperand(). Within LLVM, there are five other similar
> functions defined.
>
> I think it's time to define/declare this function in one place.
>
> Define in include/llvm/IR/Instructions.h as an inline function?
> Declare in include/llvm/IR/Instructions.h and define in lib/IR/Instructions.cpp?
> New files? (e.g., IR/InstructionUtils.h and .cpp?)
>                Other suggesctions?
>
> I suggest taking the implementation from Analysis/Delinearization.cpp,
> and create IR/InstructionUtils.h and .cpp. They can then be used to
> consolidate other Instruction helper functions to one place.

What other instruction helper functions do you have in mind? Names like
"Utils" worry me because they generally turn into a dumping ground for
things that people didn't bother to think about where belong, which in
turn makes organizing those things later difficult.

> Objections? Alternatives?
>
> Thanks,
> Hideki
> -----------
> Relevant background info
> http://lists.llvm.org/pipermail/llvm-dev/2018-January/120164.html
> if anyone is curious about my cleanup work.
>
> ------------- Analysis/Delinearization.cpp
>
> static Value *getPointerOperand(Instruction &Inst) {
>   if (LoadInst *Load = dyn_cast<LoadInst>(&Inst))
>     return Load->getPointerOperand();
>   else if (StoreInst *Store = dyn_cast<StoreInst>(&Inst))
>     return Store->getPointerOperand();
>   else if (GetElementPtrInst *Gep = dyn_cast<GetElementPtrInst>(&Inst))
>     return Gep->getPointerOperand();
>   return nullptr;
> }
>
> ------------- Analysis/DependenceAnalysis.cpp
>
> static
> Value *getPointerOperand(Instruction *I) {
>   if (LoadInst *LI = dyn_cast<LoadInst>(I))
>     return LI->getPointerOperand();
>   if (StoreInst *SI = dyn_cast<StoreInst>(I))
>     return SI->getPointerOperand();
>   llvm_unreachable("Value is not load or store instruction");
>   return nullptr;
> }
>
> ------------- Analysis/LoopAccessAnalysis.cpp
>
> /// Take the pointer operand from the Load/Store instruction.
> /// Returns NULL if this is not a valid Load/Store instruction.
> static Value *getPointerOperand(Value *I) {
>   if (auto *LI = dyn_cast<LoadInst>(I))
>     return LI->getPointerOperand();
>   if (auto *SI = dyn_cast<StoreInst>(I))
>     return SI->getPointerOperand();
>   return nullptr;
> }
>
> ------------ Transforms/Scalar/EarlyCSE.cpp    class ParseMemoryInst
>
>     Value *getPointerOperand() const {
>       if (IsTargetMemInst) return Info.PtrVal;
>       if (LoadInst *LI = dyn_cast<LoadInst>(Inst)) {
>         return LI->getPointerOperand();
>       } else if (StoreInst *SI = dyn_cast<StoreInst>(Inst)) {
>         return SI->getPointerOperand();
>       }
>       return nullptr;
>     }
>
> ------------ Transforms/Vectorize/LoadStoreVectorizer.cpp     class Vectorizer
>
> Value *Vectorizer::getPointerOperand(Value *I) const {
>   if (LoadInst *LI = dyn_cast<LoadInst>(I))
>     return LI->getPointerOperand();
>   if (StoreInst *SI = dyn_cast<StoreInst>(I))
>     return SI->getPointerOperand();
>   return nullptr;
> }
>
> ---------- Transforms/Vectorize/LoopVectorize.cpp
>
> // FIXME: The following helper functions have multiple implementations
> // in the project. They can be effectively organized in a common Load/Store
> // utilities unit.
> /// A helper function that returns the pointer operand of a load or store
> /// instruction.
> static Value *getPointerOperand(Value *I) {
>   if (auto *LI = dyn_cast<LoadInst>(I))
>     return LI->getPointerOperand();
>   if (auto *SI = dyn_cast<StoreInst>(I))
>     return SI->getPointerOperand();
>   return nullptr;
> }
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list