[PATCH] Loop Vectorizer: Refactor code to compute vectorized memory instruction cost

Arnold Schwaighofer aschwaighofer at apple.com
Mon Feb 4 11:24:26 PST 2013


This patch implements the functionality with:

MemoryCostComputation class:
  It provides one static method computeCost that calls the right helper class: StoreCost, LoadCost
  depending on the type of the instruction.

LoadCost, StoreCost:
  Only define constructor that fils fields (Opcode, Alignment, AddressSpace, and so on) in their super class MemoryOpCost.

MemoryOpCost:
  Super class that implements cost estimation functions.

No v-table needed.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Loop-Vectorizer-Refactor-code-to-compute-vectorized-.patch
Type: application/octet-stream
Size: 13703 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130204/8262e90f/attachment.obj>
-------------- next part --------------


Thanks,
Arnold

On Feb 4, 2013, at 11:30 AM, Arnold Schwaighofer <aschwaighofer at apple.com> wrote:

> This is sort of what I am implementing. I still use inheritance for readability, but no virtual functions so that we don't need vtables.
> 
> 
> class MemOpCost {
>  unsigned Alignment;
>  ...
> 
>  unsigned cost() {
>  }
> 
> public:
> 
>  static unsigned computeCost(Value *MemInst) {
>     if (StoreInst *SI = dyn_cast<StoreInst>(MemInst))
>         return StoreCost(SI, …).cost();
>     LoadInst *LI = cast<LoadInst>(MemInst);
>    return LoadCost(LI, …).cost();
>  }
> 
> private:
> 
>   class StoreCost : public MemOpCost {
>      StoreCost(StoreInst *Inst) : MemOpCost(…) {
>         Alignment =  Inst->getAlignment();
>         ...
>      } 
>   };
> 
>   class LoadCost : public MemOpCost {
>      StoreCost(LoadInst *Inst) : MemOpCost(…) {
>         Alignment =  Inst->getAlignment();
>         ...
>      } 
>   };
> };
> 
> On Feb 4, 2013, at 11:16 AM, Nadav Rotem <nrotem at apple.com> wrote:
> 
>> +    if ((Store = dyn_cast<StoreInst>(MemInst)) != 0) {
>> 
>> if (Store = dyn_cast<StoreInst>(MemInst)) {
>> 
>> 
>> +  unsigned getOpcode() {
>> +    if (Store)
>> +      return Store->getOpcode();
>> +
>> +    return Load->getOpcode();
>> +  }
>> +
>> +  unsigned getAlignment() {
>> +    if (Store)
>> +      return Store->getAlignment();
>> +
>> +    return Load->getAlignment();
>> +  }
>> +
>> +  unsigned getPointerAddressSpace() {
>> +    if (Store)
>> +      return Store->getPointerAddressSpace();
>> +
>> +    return Load->getPointerAddressSpace();
>> +  }
>> 
>> We can initialize all of these values in the constructor using a single IF statement. I think that it would be better than inheritance. 
>> 
>> 
>> Thanks,
>> Nadav
>> 
>> 
>> 
>> On Feb 4, 2013, at 7:47 AM, Arnold Schwaighofer <aschwaighofer at apple.com> wrote:
>> 
>>> Hi Renato,
>>> 
>>> thanks for the feedback - really appreciate it!
>>> 
>>> 
>>> On Feb 4, 2013, at 9:22 AM, Renato Golin <renato.golin at linaro.org> wrote:
>>>> 1. You seem to be cramming load & stores with a lot of non-shared code. Maybe it'd be more efficient to have a MemoryCostComp that both LoadCostComp and StoreCostComp derive and implement the specific parts.
>>> 
>>> I was only going half the way ;). Good idea - will do.
>>> 
>>> 
>>>> 2. Assert Liberally!
>>>> 
>>>> +    // It better be a load now.
>>>> +    Load = cast<LoadInst>(MemInst);
>>>> 
>>>> to 
>>>> 
>>>> +    Load = dyn_cast<LoadInst>(MemInst);
>>>> +    assert(Load && "Invalid memory instruction type");
>>>> 
>>>> or use llvm_unreachable().
>>> 
>>> I think cast internally asserts that the type is right and I think I have seen messages on the mailing list saying that an assert is unnecessary (my memory might deceive here, though) in such a case. Anyway, this code should go away after refactoring the patch.
>>> 
>>> 
>>>> 
>>>> 3. All this can be omitted if you use Instr* instead of specific LoadInst/StoreInst and if you common up code in a base class:
>>>> 
>>>> +  unsigned getOpcode() {
>>>> +    if (Store)
>>>> +      return Store->getOpcode();
>>>> +
>>>> +    return Load->getOpcode();
>>>> +  }
>>>> +
>>>> +  unsigned getAlignment() {
>>>> +    if (Store)
>>>> +      return Store->getAlignment();
>>>> +
>>>> +    return Load->getAlignment();
>>>> +  }
>>>> +
>>>> +  unsigned getPointerAddressSpace() {
>>>> +    if (Store)
>>>> +      return Store->getPointerAddressSpace();
>>>> +
>>>> +    return Load->getPointerAddressSpace();
>>>> +  }
>>> 
>>> Yes, this uglyness will go away if i factor code into sub classes. Note, however that you need LoadInst, StoreInst pointers to call getPointerAddressSpace/getAlignment (unfortunately, they do not share a common MemInst superclass). This is not a problem if we factor code into subclasses.
>>> 
>>> -Arnold
>>> 
>> 
> 
> 
> _______________________________________________
> 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