<div dir="ltr"><div><div>I've got this PseudoOp defined:<br><br>def SDT_RELADDR       : SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisInt<1>]>;<br>def XSTGRELADDR       : SDNode<"XSTGISD::RELADDR", SDT_RELADDR>;<br><br><br>let Constraints = "$dst = $addr" in { //, Uses= [GRP] in {<br>  def RelAddr           : XSTGPseudo< (outs GPRC:$dst),<br>                                      (ins i64imm:$spoff, i64imm:$addr),<br>                                      "! RELADDR $spoff, $dst",<br>                                      [(set GPRC:$dst, (XSTGRELADDR i64:$spoff, <br>                                                                    (i64 (XSTGMVINI i64:$addr))<br>                                                       )<br>                                      )]>;<br>}<br><br></div>GlobalAddresses get lowered to RelAddr nodes in our ISelLowering code. Now I just need to be able to expand this in our overridden expandPostRAPseudo function, however, I'm a bit worried that expansion happens too late (after things should already be MI's, it seems). So things like patterns that try to  match on that XSTGMVINI would have already been matched.  <br><br></div>[as an aside, we've got patterns like:<br><br>def : Pat<(XSTGMVINI tglobaladdr:$off),<br>          (MOVIMMZ_I64 tglobaladdr:$off)>;<br><br><div><div>]<br><br></div><div>So, first off, if I wanted to expand that DAG for the RelAddr Node, and I want something like (the first BuildMI below is pseudo code as I'm not sure how to accomplish it):<br><br></div><div>case  XSTG::RelAddr:<br></div><div>    BuildMI(MBB, MI, DL, MI->getOperand(1).DAG...) ???<br></div><div>    BuildMI(MBB, MI, DL, get(XSTG::LOADI32_RI), MI->getOperand(0).getReg())<br>          .addReg(MI->getOperand(0).getReg())<br>          .addReg(XSTG::GRP);<br><br></div><div>Basically, I want to grab the XSTGMVINI that is the second operand to the XSTGRELADDR node from the psuedo op pattern above and then build an MI based on that DAG.<br><br></div><div>The resulting assembly for that DAG would be:<br></div><div>    movimm       rX, %rel(SYMBOL) #offset to SYMBOL<br></div><div>    load             rX, rX, GRP # rX <- mem[rx+GRP]<br><br></div><div>Where the 'movimm' corresponds to the first BuildMI above (and is the XSTGMVINI part of the DAG) and the 'load' corresponds to the second BuildMI above (I have that one working).<br><br></div><div>And secondly,<br><br></div><div>Would this RelAddr DAG:<br><br></div><div>[(set GPRC:$dst, (XSTGRELADDR i64:$spoff,<br></div><div>                                                         (i64 (XSTGMVINI i64:$addr)<br>)]<br><br></div><div>Have been pattern matched (as per the PAT above) such that the XSTGMVINI would have been transformed into:<br><br>MOVIMMZ_I64 tglobaladdr:$addr)<br><br>?<br><br></div><div>Phil<br></div><div><br></div></div></div>