[PATCH] [CodeGenPrepare] Move extractelement close to store if they can be combined.

hfinkel at anl.gov hfinkel at anl.gov
Thu Oct 23 22:38:55 PDT 2014


================
Comment at: include/llvm/Target/TargetLowering.h:268
@@ +267,3 @@
+  /// in one instruction.
+  bool canCombineStoreAndExtract() const { return CanCombineStoreAndExtract; }
+
----------------
qcolombet wrote:
> hfinkel wrote:
> > I would really like this to be a callback that passes the type and the extraction index. For PowerPC, for example, I can make this free for some types, but only for index 0. For other indices, I can do it with a shuffle (which obviously has some extra cost, although not much as the load/store-based domain crossing).
> > 
> > IMHO, a great interface for this could be:
> > int getStoreExtractCombineCost(Type *VectorTy, Value *Idx);
> > 
> Although I like the direction of this, how do we get the cost of the original sequence?
> In other words, what value do you propose we use to decide whether or not it is worth kicking this optimization given those two parameters?
> 
> Indeed, I expect that we will replace the condition that guards the optimization with something like:
> TLI->getStoreExtractCombineCost(ExtractInst->getType(), ExtractInst->getOperand(1)) < CostOfIndividualStoreAndExtract
> 
> I assume you were thinking "== 0” since you talked about free. Is it what you had in mind?
Thinking about this, the interface I proposed will be difficult to use (because it seems like you'd need to cost-model the entire transformation in order to figure anything out). How about:

  bool canCombineStoreAndExtract(Type *VectorTy, Value *Idx, unsigned &Cost)

where, if true is returned and we move forward with modeling the transformation, we add Cost to VectorCost in isProfitableToPromote. This seems better.

http://reviews.llvm.org/D5921






More information about the llvm-commits mailing list