[llvm-dev] Duplicating node in SelectionDAG?

Matt Arsenault via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 29 13:00:38 PDT 2015


On 09/29/2015 12:25 PM, Ryan Taylor via llvm-dev wrote:
> It appears that it's impossible to duplicate a node in the dag. For 
> example, there is some code:
Correct, nodes are uniqued and CSEd

>
> b = a * a; // a is a  global int
>
> A LD node is generated for A and it goes into both Operand 0 and 1 of 
> the MUL node. The issue is I'm trying to match a pattern of:
>
> set dstReg:$dstD  (OpNode (srcAType (load addr32:$srcA)), (srcBType 
> (load addr32:$srcB)))
>
> so basically a mem, mem, reg operation.
>
> The issue is this pattern won't match in the above example because 
> there is only one LD generated for 'a'. I tried to duplicate the LD in 
> the dag but it doesn't show up, it always reduces it to only one LD no 
> matter what, even if I have multiple loads in the IR also.
>
> #1. Is it possible to duplicate an exact copy of a node in the dag?
No

> #2. How would I go about matching this pattern in table gen?
I would be surprised that patterns that happen to match the same node 
multiple times as operands wouldn't work as is. Maybe there is some 
complexity because these nodes have chains added? Have you looked at the 
generated matching code for why it isn't selecting? If all else fails 
you should be able to use a ComplexPattern
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150929/6d099b49/attachment.html>


More information about the llvm-dev mailing list