This worked perfectly.  Thankyou.<div>-Joe</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sun, Dec 2, 2012 at 12:34 PM, Joseph Pusdesris <span dir="ltr"><<a href="mailto:joe@pusdesris.com" target="_blank">joe@pusdesris.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I'll give that a shot, thanks!<div>-Joe</div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br>
<div class="gmail_quote">
On Sun, Dec 2, 2012 at 12:06 PM, Triple Yang <span dir="ltr"><<a href="mailto:triple.yang@gmail.com" target="_blank">triple.yang@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">OK, I get it.<br>
<br>
The essence of this problem is that a node can be covered exactly and<br>
just once but its result can be referred multiple times for a tree<br>
pattern matching isel. So to duplicate a load node (only if we can!)<br>
is convenient to conquer that case.<br>
<br>
The truth is, in pattern (add (load) (load)), source operands are<br>
memory addresses, and thus it can be treated         as (addmm<br>
address, address). Here is an alternative you can take into<br>
consideration: defining new node (like addmm, similiar with movmm) to<br>
specify matching patterns for isel.<br>
<br>
Regards.<br>
<br>
2012/12/2 Joseph Pusdesris <<a href="mailto:joe@pusdesris.com" target="_blank">joe@pusdesris.com</a>>:<br>
<div><div>> I am writing a target for an odd cisc-like architecture which has no support<br>
> for keeping most values in registers.  As such, memory-memory operations are<br>
> needed, but for isel to generate a memory-memory the pattern must be of the<br>
> form (store (op (load) (load))).<br>
><br>
> Let's use a simple example to show how this can be problematic:<br>
>   %0 = load i32* %a.addr, align 4<br>
>   store i32 %0, i32* %other, align 4<br>
>   %1 = load i32* %b.addr, align 4<br>
>   %add = add i32 %0, %1<br>
> ----<br>
> In this example, the (store (load)) pair -- the first two lines -- will be<br>
> matched by isel as a MOVmm.  This will be problematic for the add though,<br>
> since the load SDNode will be gone, making that part of the DAG no longer of<br>
> the form (add (load) (load)).  To counteract this, I would create 2 load<br>
> SDNodes so that both of these patterns can be satisfied.  Does this make<br>
> sense?<br>
> -Joe<br>
><br>
><br>
><br>
><br>
> On Sat, Dec 1, 2012 at 11:44 PM, Triple Yang <<a href="mailto:triple.yang@gmail.com" target="_blank">triple.yang@gmail.com</a>> wrote:<br>
>><br>
>> Hi, Joe.<br>
>><br>
>> I am sorry I did not catch your point. Can you provide more details?<br>
>><br>
>> Since SDValue/SDNode can be used multiple times, why would you want to<br>
>> create two identical objects<br>
>> instead of reference to the same one?<br>
>><br>
>> 2012/12/2 Joseph Pusdesris <<a href="mailto:joe@pusdesris.com" target="_blank">joe@pusdesris.com</a>>:<br>
>> > Yes, changing parameters will create a new Node, but is there some way I<br>
>> > can<br>
>> > force a new node with the same parameters?<br>
>> > -Joe<br>
>> ><br>
>> ><br>
>> > On Sat, Dec 1, 2012 at 10:57 PM, Triple Yang <<a href="mailto:triple.yang@gmail.com" target="_blank">triple.yang@gmail.com</a>><br>
>> > wrote:<br>
>> >><br>
>> >> Hi, Joseph, I guess getLoad() will either search an existed SDValue<br>
>> >> *OR* create a new one for a non-existed one depending on real<br>
>> >> parameters.<br>
>> >><br>
>> >> Since you use exactly the same attributes dupVal/dupNode have, no<br>
>> >> doubt getLoad() return the old one.<br>
>> >><br>
>> >> I am not sure it's *volatile* that let you get a new result, you might<br>
>> >> want to try change some other parameters and check what it turns out.<br>
>> >><br>
>> >> Regards.<br>
>> >><br>
>> >> 2012/12/2 Joseph Pusdesris <<a href="mailto:joe@pusdesris.com" target="_blank">joe@pusdesris.com</a>><br>
>> >> ><br>
>> >> > So I think I have made some progress.<br>
>> >> > SDValue dupVal  = consumer->getOperand(OpNo);<br>
>> >> > LoadSDNode *dupNode = (LoadSDNode*) dupVal.getNode();<br>
>> >> ><br>
>> >> > SDValue newLoad = CurDAG->getLoad(dupVal.getValueType(),<br>
>> >> > dupVal.getDebugLoc(),<br>
>> >> >                                dupVal.getOperand(0),<br>
>> >> > dupVal.getOperand(1),<br>
>> >> >                                dupNode->getPointerInfo(),<br>
>> >> >                                dupNode->isVolatile(),<br>
>> >> > dupNode->isNonTemporal(),<br>
>> >> >                                dupNode->isInvariant(),<br>
>> >> > dupNode->getAlignment(),<br>
>> >> >                                dupNode->getTBAAInfo(),<br>
>> >> > dupNode->getRanges());<br>
>> >> > However, my problem now is that it will re-use the same load still.<br>
>> >> > If<br>
>> >> > I change something, like setting volatile to true for example, it<br>
>> >> > will<br>
>> >> > create a new node, but otherwise it will not.  Any ideas?<br>
>> >> > -Joe<br>
>> >> ><br>
>> >> ><br>
>> >> > On Fri, Nov 30, 2012 at 9:55 PM, Joseph Pusdesris <<a href="mailto:joe@pusdesris.com" target="_blank">joe@pusdesris.com</a>><br>
>> >> > wrote:<br>
>> >> >><br>
>> >> >> Hi, I am writing an llvm target and I need both loads for isel<br>
>> >> >> reasons,<br>
>> >> >> but I am struggling to find the right way.  I have been trying to<br>
>> >> >> use<br>
>> >> >> DAG.getLoad() to make a copy, then just change the operand in the<br>
>> >> >> consumers,<br>
>> >> >> but I cannot seem to get all of the arguments needed for that<br>
>> >> >> function in<br>
>> >> >> order to make the copy.  Any help would be great, thanks!<br>
>> >> >> -Joe<br>
>> >> ><br>
>> >> ><br>
>> >> ><br>
>> >> > _______________________________________________<br>
>> >> > LLVM Developers mailing list<br>
>> >> > <a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
>> >> > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
>> >> ><br>
>> >><br>
>> >><br>
>> >><br>
>> >> --<br>
>> >>  (Yang Yongyong)<br>
>> ><br>
>> ><br>
>><br>
>><br>
>><br>
>> --<br>
>>  (Yang Yongyong)<br>
><br>
><br>
<br>
<br>
<br>
</div></div><span><font color="#888888">--<br>
 (Yang Yongyong)<br>
</font></span></blockquote></div><br></div>
</div></div></blockquote></div><br></div>