Joseph Pusdesris
2012-Dec-01 02:55 UTC
[LLVMdev] Splitting a load with 2 consumers into 2 loads.
Hi, I am writing an llvm target and I need both loads for isel reasons, but I am struggling to find the right way. I have been trying to use DAG.getLoad() to make a copy, then just change the operand in the consumers, but I cannot seem to get all of the arguments needed for that function in order to make the copy. Any help would be great, thanks! -Joe -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121130/a812506f/attachment.html>
Joseph Pusdesris
2012-Dec-02 03:24 UTC
[LLVMdev] Splitting a load with 2 consumers into 2 loads.
So I think I have made some progress.
SDValue dupVal = consumer->getOperand(OpNo);
LoadSDNode *dupNode = (LoadSDNode*) dupVal.getNode();
SDValue newLoad = CurDAG->getLoad(dupVal.getValueType(),
dupVal.getDebugLoc(),
dupVal.getOperand(0), dupVal.getOperand(1),
dupNode->getPointerInfo(),
dupNode->isVolatile(),
dupNode->isNonTemporal(),
dupNode->isInvariant(),
dupNode->getAlignment(),
dupNode->getTBAAInfo(),
dupNode->getRanges());
However, my problem now is that it will re-use the same load still. If I
change something, like setting volatile to true for example, it will create
a new node, but otherwise it will not. Any ideas?
-Joe
On Fri, Nov 30, 2012 at 9:55 PM, Joseph Pusdesris <joe at pusdesris.com>
wrote:
> Hi, I am writing an llvm target and I need both loads for isel
> reasons, but I am struggling to find the right way. I have been trying to
> use DAG.getLoad() to make a copy, then just change the operand in the
> consumers, but I cannot seem to get all of the arguments needed for that
> function in order to make the copy. Any help would be great, thanks!
> -Joe
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20121201/5a089549/attachment.html>
Triple Yang
2012-Dec-02 03:57 UTC
[LLVMdev] Splitting a load with 2 consumers into 2 loads.
Hi, Joseph, I guess getLoad() will either search an existed SDValue *OR* create a new one for a non-existed one depending on real parameters. Since you use exactly the same attributes dupVal/dupNode have, no doubt getLoad() return the old one. I am not sure it's *volatile* that let you get a new result, you might want to try change some other parameters and check what it turns out. Regards. 2012/12/2 Joseph Pusdesris <joe at pusdesris.com>> > So I think I have made some progress. > SDValue dupVal = consumer->getOperand(OpNo); > LoadSDNode *dupNode = (LoadSDNode*) dupVal.getNode(); > > SDValue newLoad = CurDAG->getLoad(dupVal.getValueType(), dupVal.getDebugLoc(), > dupVal.getOperand(0), dupVal.getOperand(1), > dupNode->getPointerInfo(), > dupNode->isVolatile(), dupNode->isNonTemporal(), > dupNode->isInvariant(), dupNode->getAlignment(), > dupNode->getTBAAInfo(), dupNode->getRanges()); > However, my problem now is that it will re-use the same load still. If I change something, like setting volatile to true for example, it will create a new node, but otherwise it will not. Any ideas? > -Joe > > > On Fri, Nov 30, 2012 at 9:55 PM, Joseph Pusdesris <joe at pusdesris.com> wrote: >> >> Hi, I am writing an llvm target and I need both loads for isel reasons, but I am struggling to find the right way. I have been trying to use DAG.getLoad() to make a copy, then just change the operand in the consumers, but I cannot seem to get all of the arguments needed for that function in order to make the copy. Any help would be great, thanks! >> -Joe > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >-- æšćć (Yang Yongyong)
Maybe Matching Threads
- [LLVMdev] Splitting a load with 2 consumers into 2 loads.
- [LLVMdev] Splitting a load with 2 consumers into 2 loads.
- [LLVMdev] Splitting a load with 2 consumers into 2 loads.
- [LLVMdev] Splitting a load with 2 consumers into 2 loads.
- [LLVMdev] Splitting a load with 2 consumers into 2 loads.