kewuzhang
2014-Jul-11 17:59 UTC
[LLVMdev] Lowering to return multiple values: codeGen, instruction write one value to the input register.
Hi All, In XCore backend, I saw “ …... EVT VT = Op.getValueType(); SDValue Data DAG.getNode(XCoreISD::CRC8, DL, DAG.getVTList(VT, VT), Op.getOperand(1), Op.getOperand(2) , Op.getOperand(3)); SDValue Crc(Data.getNode(), 1); SDValue Results[] = { Crc, Data }; return DAG.getMergeValues(Results, 2, DL); “ which is used to lower an instruction that returns two values. I am trying to something like this: ” ……. SDValue z = DAG.getNode(my_ISD::test_op, DL, VT, Op.getOperand(0); SDValue w = DAG.getConstant(1, MVT::i32); SDValue DataZ = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, z, z, z, z); SDValue DataW = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, w, w, w, w); SDValue result[] = {DataZ, DataW}; return DAg.getMergeValues(results, 2, DL); “ but my view-dag only shows one return value, wondering what is wrong? should the results dags must be somehow “dependent” on each other? Best kevin On Jul 7, 2014, at 2:54 PM, Tim Northover <t.p.northover at gmail.com> wrote:>> Now I am having the same problem as mentioned in this >> thread;"http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-January/057654.html” >> >> [...] >> >> Wondering if there is any update about it? > > This has been a known issue since almost the beginning of LLVM from > what I've picked up (certainly long before I'd even heard of the > project). There hasn't been any progress since those messages, I'm > afraid: for two or more generic outputs you need C++ for ISel > (usually). > > Cheers. > > Tim.-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140711/e072b4f9/attachment.html>
Tim Northover
2014-Jul-11 18:11 UTC
[LLVMdev] Lowering to return multiple values: codeGen, instruction write one value to the input register.
Hi Kevin, It's quite difficult to tell exactly what's going wrong here without more context. If you could post a screenshot (or similar) of the viewDAG output before and after, that would be very helpful. Or describe in more detail what you're expecting to see but don't. On 11 July 2014 18:59, kewuzhang <kewu.zhang at amd.com> wrote:> ……. > SDValue z = DAG.getNode(my_ISD::test_op, DL, VT, Op.getOperand(0); > SDValue w = DAG.getConstant(1, MVT::i32); > > SDValue DataZ = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, z, z, z, > z); > SDValue DataW = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, w, w, w, > w); > SDValue result[] = {DataZ, DataW}; > return DAg.getMergeValues(results, 2, DL); > > “ > but my view-dag only shows one return value, wondering what is wrong? > should the results dags must be somehow “dependent” on each other?However, as a very rough guess: did the input node have two outputs? If not, then the second result of the merge node will be unused and might appear not to be there. Cheers. Tim.
kewuzhang
2014-Jul-11 19:11 UTC
[LLVMdev] Lowering to return multiple values: codeGen, instruction write one value to the input register.
Hi Tim, Thank you for the quick answer. basically my first step is to solve the my_sincos(v4f32). which returns sin and cos results into two separate vector registers. I have sin, and cos target instructions. so my plan is to lower it like the following when I see the “sincos(v4f32)” node. “ SDValue sin = DAG.getNode(my_ISD::sin, DL, VT, Op.getOperand(0); SDValue cos = DAG.getNode(my_ISD::cos, DL, VT, Op.getOperand(0); SDValue sinVal = DAG.getNode(ISD::BUILD_VECTOR, DL, MVT::v4f32, sin, sin, sin, sin); SDValue cosVal = DAG.getNode(ISD::BUILD_VECTOR, DL, MVT::v4f32, cos, cos, cos, cos); SDValue results[] = {sinVal, cosVal}; return DAG.getMergeValues(results, 2, DL); " So in a test, I am expecting the my_sincos(v4f32) node should appears have two return values in view-dag-combine1-dags even I am using only sinVal. best Kevin On Jul 11, 2014, at 2:11 PM, Tim Northover <t.p.northover at gmail.com> wrote:> Hi Kevin, > > It's quite difficult to tell exactly what's going wrong here without > more context. If you could post a screenshot (or similar) of the > viewDAG output before and after, that would be very helpful. Or > describe in more detail what you're expecting to see but don't. > > On 11 July 2014 18:59, kewuzhang <kewu.zhang at amd.com> wrote: >> ……. >> SDValue z = DAG.getNode(my_ISD::test_op, DL, VT, Op.getOperand(0); >> SDValue w = DAG.getConstant(1, MVT::i32); >> >> SDValue DataZ = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, z, z, z, >> z); >> SDValue DataW = DAG.getNode(ISD::BUILDER_VECTOR, DL, MVT::v4i32, w, w, w, >> w); >> SDValue result[] = {DataZ, DataW}; >> return DAg.getMergeValues(results, 2, DL); >> >> “ >> but my view-dag only shows one return value, wondering what is wrong? >> should the results dags must be somehow “dependent” on each other? > > However, as a very rough guess: did the input node have two outputs? > If not, then the second result of the merge node will be unused and > might appear not to be there. > > Cheers. > > Tim.