[LLVMdev] Advices Required: Best practice to share logic between DAG combine and target lowering?

Quentin Colombet qcolombet at apple.com
Mon Jul 1 17:48:29 PDT 2013


On Jul 1, 2013, at 1:45 PM, Eli Friedman <eli.friedman at gmail.com> wrote:

> On Mon, Jul 1, 2013 at 1:33 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> On Jul 1, 2013, at 11:52 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> 
>> On Mon, Jul 1, 2013 at 11:30 AM, Quentin Colombet <qcolombet at apple.com> wrote:
>> Hi,
>> 
>> ** Problematic **
>> I am looking for advices to share some logic between DAG combine and target lowering.
>> 
>> Basically, I need to know if a bitcast that is about to be inserted during target specific isel lowering will be eliminated during DAG combine.
>> 
>> Let me know if there is another, better supported, approach for this kind of problems.
>> 
>> ** Motivating Example **
>> The motivating example comes form the lowering of vector code on armv7.
>> More specifically, the build_vector node is lowered to a target specific ARMISD::build_vector where all the parameters are bitcasted to floating point types.
>> 
>> This works well, unless the inserted bitcasts survive until instruction selection. In that case, they incur moves between integer unit and floating point unit that may result in inefficient code.
>> 
>> Attached motivating_example.ll shows such a case:
>> llc -O3 -mtriple thumbv7-apple-ios3 motivating_example.ll -o -
>> 	ldr	r0, [r1]
>> 	ldr	r1, [r2]
>> 	vmov	s1, r1
>> 	vmov	s0, r0
>> Here each ldr, vmov sequences could have been replaced by a simple vld1.32.
>> 
>> ** Proposed Solution **
>> Lower to more vector friendly code (using a sequence of insert_vector_elt), when bit casts will not be free.
>> The attached patch demonstrates that, but is missing the proper check to know what DAG combine will do (see TODO).
>> 
>> I think you're approaching this backwards: the obvious thing to do is to generate the insert_vector_elt sequence unconditionally, and DAGCombine that sequence to a build_vector when appropriate.
> 
> Hi Eli,
> 
> I have started to look into the direction you gave me.
> 
> I may have miss something but I do not see how the proposed direction solves the issue. Indeed to be able to DAGCombine a insert_vector_elt sequences into a ARMISD::build_vector, I still need to know if it would be profitable, i.e., if DAGCombine will remove the bitcasts that combining/lowering is about to insert.
> 
> Since target specific DAGCombine are also done in TargetLowering I do not have access to more DAGCombine logic (at least DAGCombineInfo is not providing the require information).
> 
> What did I miss?
> 
> 
> Err, wait, sorry, my fault; I missed that you only insert the bitcasts on the other side of the branch.
> 
> You should be able to do it the other way, though: generate the build_vector unconditionally, and pull insert_vector_elts out of it in a DAGCombine.  (At this point, you know whether DAGCombine will remove the bit casts because if it could, it would have already done it.)
> 
Thanks again Eli for the direction.

That works great!

I have sent a proposal with that solution.

-Quentin
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130701/c035c391/attachment.html>


More information about the llvm-dev mailing list