Alex Susu via llvm-dev
2016-Oct-24 10:11 UTC
[llvm-dev] Accessing the associated LLVM IR Instruction for an SDNode used in instruction selection (back end)
Hello. Quentin, retrieving the LLVM IR instruction from which an SDNode originates is useful during the instruction selection phase. For example, I need to recover the LLVM IR variable which is used to fill an entire vector with the ISD::BUILD_VECTOR target-independent SDNode . From the recovered LLVM IR variable I can walk on the use-def-chains in order to get the most complete definition of this variable (in terms of the input program variables), which is something I can't do at the level of SelectionDAGs (because, for example, actual function arguments don't appear in the DAG). Best regards, Alex On 10/22/2016 12:29 AM, Quentin Colombet wrote:> Hi Alex, > > Out of curiosity, what is your use case for that? > > Generally speaking I would recommend against doing that. When the SDBuilder is done, I > would expect the SDNodes to not query anything outside of the SD layer. We are not here > now, though. > > Cheers, -Quentin >> On Oct 21, 2016, at 4:57 AM, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> >> Hello. I would like to access the LLVM IR Instruction from which an SDNode (from >> SelectionDAG) originates. For this I have modified: - >> llvm/lib/CodeGen/SelectionDAGISel.cpp, SelectionDAGISel::SelectBasicBlock(), namely I >> put SDB->clear() at the beginning of the method in order to avoid clearing NodeMap >> after creating the initial SelectionDAG from LLVM IR, since I want to access it after >> that; - llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h - added an accessor for >> the private NodeMap object relating LLVM IR Instructions to generated SDNodes: >> public: // Alex: added a getter for NodeMap DenseMap<const Value*, SDValue> >> &getNodeMap() { return NodeMap; } >> >> A small problem is that it seems that when I access the NodeMap in >> [Target]DAGToDAGISel::Select(SDNode *Node) method (part of subclass of >> SelectionDAGISel), the NodeMap contains quite a few SDNodes tagged as <<Deleted >> Node!>> (for the nodes that were already selected). But the current SDNode, given as >> parameter to Select() is valid and we can search for it in NodeMap in order to find >> the LLVM IR Instruction (llvm::Value, more exactly) that generated it. As a side >> question, is there a better modality to find the key associated to a value in a >> DenseMap object than to iterate through all of DenseMap's elements (I could not find >> anything better at >> http://llvm.org/docs/doxygen/html/classllvm_1_1DenseMapBase.html)? >> >> Could you please tell me if there is a better modality to retrieve the LLVM IR >> Instruction from which an SDNode originates? >> >> Thank you, Alex _______________________________________________ LLVM Developers >> mailing list llvm-dev at lists.llvm.org >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev > >
Alex Susu via llvm-dev
2016-Nov-09 12:55 UTC
[llvm-dev] Accessing the associated LLVM IR Instruction for an SDNode used in instruction selection (back end)
Hello. I come back to this thread to add that moving SDB->clear() at the beginning of the method messes up later at instruction selection with an error message like: lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1466: llvm::SDValue {anonymous}::DAGCombiner::combine(llvm::SDNode*): Assertion `N->getOpcode() != ISD::DELETED_NODE && "Node was deleted but visit returned NULL!"' failed. So, I added in class SelectionDAGISel another DenseMap crtNodeMap, which I copy in SelectionDAGISel::SelectBasicBlock() before the original SDB->clear() is given. Doing this no longer gives me any errors. Best regards, Alex On 10/24/2016 1:11 PM, Alex Susu wrote:> Hello. > Quentin, retrieving the LLVM IR instruction from which an SDNode originates is useful > during the instruction selection phase. For example, I need to recover the LLVM IR > variable which is used to fill an entire vector with the ISD::BUILD_VECTOR > target-independent SDNode . > From the recovered LLVM IR variable I can walk on the use-def-chains in order to get > the most complete definition of this variable (in terms of the input program variables), > which is something I can't do at the level of SelectionDAGs (because, for example, actual > function arguments don't appear in the DAG). > > Best regards, > Alex > > > On 10/22/2016 12:29 AM, Quentin Colombet wrote: >> Hi Alex, >> >> Out of curiosity, what is your use case for that? >> >> Generally speaking I would recommend against doing that. When the SDBuilder is done, I >> would expect the SDNodes to not query anything outside of the SD layer. We are not here >> now, though. >> >> Cheers, -Quentin >>> On Oct 21, 2016, at 4:57 AM, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote: >>> >>> Hello. I would like to access the LLVM IR Instruction from which an SDNode (from >>> SelectionDAG) originates. For this I have modified: - >>> llvm/lib/CodeGen/SelectionDAGISel.cpp, SelectionDAGISel::SelectBasicBlock(), namely I >>> put SDB->clear() at the beginning of the method in order to avoid clearing NodeMap >>> after creating the initial SelectionDAG from LLVM IR, since I want to access it after >>> that; - llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h - added an accessor for >>> the private NodeMap object relating LLVM IR Instructions to generated SDNodes: >>> public: // Alex: added a getter for NodeMap DenseMap<const Value*, SDValue> >>> &getNodeMap() { return NodeMap; } >>> >>> A small problem is that it seems that when I access the NodeMap in >>> [Target]DAGToDAGISel::Select(SDNode *Node) method (part of subclass of >>> SelectionDAGISel), the NodeMap contains quite a few SDNodes tagged as <<Deleted >>> Node!>> (for the nodes that were already selected). But the current SDNode, given as >>> parameter to Select() is valid and we can search for it in NodeMap in order to find >>> the LLVM IR Instruction (llvm::Value, more exactly) that generated it. As a side >>> question, is there a better modality to find the key associated to a value in a >>> DenseMap object than to iterate through all of DenseMap's elements (I could not find >>> anything better at >>> http://llvm.org/docs/doxygen/html/classllvm_1_1DenseMapBase.html)? >>> >>> Could you please tell me if there is a better modality to retrieve the LLVM IR >>> Instruction from which an SDNode originates? >>> >>> Thank you, Alex _______________________________________________ LLVM Developers >>> mailing list llvm-dev at lists.llvm.org >>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >> >>
Alex Susu via llvm-dev
2016-Nov-11 13:59 UTC
[llvm-dev] Accessing the associated LLVM IR Instruction for an SDNode used in instruction selection (back end)
Hello. I would like to ask for your advice in the following problem I have: some of the SDNodes are created in the phases following the generation of the SelectionDAG, namely DAG combiner (DAGCombiner.cpp), type (LegalizeTypes.h) and DAG operation legalization. While the SelectionDAGBuilder class already has the map: DenseMap<const Value*, SDValue> NodeMap; from LLVM IR Value to SDValue/SDNode, the other classes do NOT have such maps, so I need to create them myself and merge them in a map containing all associations. Do you know a better way to retrieve the associated LLVM IR Instruction for an already created SDNode? Thank you, Alex On 11/9/2016 2:55 PM, Alex Susu wrote:> Hello. > I come back to this thread to add that moving SDB->clear() at the beginning of the > method messes up later at instruction selection with an error message like: > lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1466: llvm::SDValue > {anonymous}::DAGCombiner::combine(llvm::SDNode*): Assertion `N->getOpcode() !> ISD::DELETED_NODE && "Node was deleted but visit returned NULL!"' failed. > So, I added in class SelectionDAGISel another DenseMap crtNodeMap, which I copy in > SelectionDAGISel::SelectBasicBlock() before the original SDB->clear() is given. > > Doing this no longer gives me any errors. > > Best regards, > Alex > > On 10/24/2016 1:11 PM, Alex Susu wrote: >> Hello. >> Quentin, retrieving the LLVM IR instruction from which an SDNode originates is useful >> during the instruction selection phase. For example, I need to recover the LLVM IR >> variable which is used to fill an entire vector with the ISD::BUILD_VECTOR >> target-independent SDNode . >> From the recovered LLVM IR variable I can walk on the use-def-chains in order to get >> the most complete definition of this variable (in terms of the input program variables), >> which is something I can't do at the level of SelectionDAGs (because, for example, actual >> function arguments don't appear in the DAG). >> >> Best regards, >> Alex >> >> >> On 10/22/2016 12:29 AM, Quentin Colombet wrote: >>> Hi Alex, >>> >>> Out of curiosity, what is your use case for that? >>> >>> Generally speaking I would recommend against doing that. When the SDBuilder is done, I >>> would expect the SDNodes to not query anything outside of the SD layer. We are not here >>> now, though. >>> >>> Cheers, -Quentin >>>> On Oct 21, 2016, at 4:57 AM, Alex Susu via llvm-dev <llvm-dev at lists.llvm.org> wrote: >>>> >>>> Hello. I would like to access the LLVM IR Instruction from which an SDNode (from >>>> SelectionDAG) originates. For this I have modified: - >>>> llvm/lib/CodeGen/SelectionDAGISel.cpp, SelectionDAGISel::SelectBasicBlock(), namely I >>>> put SDB->clear() at the beginning of the method in order to avoid clearing NodeMap >>>> after creating the initial SelectionDAG from LLVM IR, since I want to access it after >>>> that; - llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h - added an accessor for >>>> the private NodeMap object relating LLVM IR Instructions to generated SDNodes: >>>> public: // Alex: added a getter for NodeMap DenseMap<const Value*, SDValue> >>>> &getNodeMap() { return NodeMap; } >>>> >>>> A small problem is that it seems that when I access the NodeMap in >>>> [Target]DAGToDAGISel::Select(SDNode *Node) method (part of subclass of >>>> SelectionDAGISel), the NodeMap contains quite a few SDNodes tagged as <<Deleted >>>> Node!>> (for the nodes that were already selected). But the current SDNode, given as >>>> parameter to Select() is valid and we can search for it in NodeMap in order to find >>>> the LLVM IR Instruction (llvm::Value, more exactly) that generated it. As a side >>>> question, is there a better modality to find the key associated to a value in a >>>> DenseMap object than to iterate through all of DenseMap's elements (I could not find >>>> anything better at >>>> http://llvm.org/docs/doxygen/html/classllvm_1_1DenseMapBase.html)? >>>> >>>> Could you please tell me if there is a better modality to retrieve the LLVM IR >>>> Instruction from which an SDNode originates? >>>> >>>> Thank you, Alex _______________________________________________ LLVM Developers >>>> mailing list llvm-dev at lists.llvm.org >>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >>> >>>