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

Nadav Rotem nrotem at apple.com
Mon Feb 4 09:16:23 PST 2013


+    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
> 




More information about the llvm-commits mailing list