(original) (raw)
There isn't really enough information here to understand exactly what you need, but it almost certainly won't require you to use ReplaceNode. ISelDAGToDAG is a place where you do instruction selection and instruction selection needs machine SD nodes by definition - you can't have target independent nodes after selection. It really sounds like you are interested in writing a DAGCombine transformation. Of course, it is possible that you need a specific custom legalization which is a little different, but I will assume you need a DAG combine as your question sounds the most like a DAG combine.
The way you would accomplish this is to mark the input node as one for which you have a DAG combine. You accomplish this using setTargetDAGCombine(). Looks like RISCV has a handful of nodes for which they have combines. Then in RISCVTargetLowering::PerformDAGCombine(), you will add your node to the switch and dispatch to the function that performs your DAG combine. You can follow the example of ISD::AND in RISCVISelLowering.cpp which gets combined in performANDCombine().
I hope this helps, but I realize that I may be completely off in terms of what you are after.
On Sat, Aug 7, 2021 at 12:05 PM Ben Shi via llvm-dev <llvm-dev@lists.llvm.org> wrote:
\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_\_Hello,I would like to make some DAG transform in RISCV's ISelDAGToDAG, but I find the ReplaceNode() requeststhe new Node to be a MachineNode( usually created be curDAG->getMachineNode with the opcode set to RISCV::xxxx).Can I just pass it a SDNode (with opcode set to anoher ISD::xxx, not RISCV::xxx) ? It seems LLVM will crash.Because I want to change the opcode to ADD, can I avoid the complexity of selecting ADDW/ADDI/ADDIW for a machine node in different cases?Ben Shi
LLVM Developers mailing list
llvm-dev@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev