<div dir="ltr">Hi,<div><br></div><div>I'm still completely stuck on this one. To recap, during instruction selection, I'm trying to use something of type (i16, i16, ch) as the selection for an instruction which has type (i16, ch) by not using the second i16 returned. Using getMergeValues I created something that almost looks right, but fails scheduling; my suspicion is that it doesn't tunnel the ch result through properly.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 6, 2017 at 11:46 PM, Dr. ERDI Gergo <span dir="ltr"><<a href="mailto:gergo@erdi.hu" target="_blank">gergo@erdi.hu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sun, 4 Jun 2017, Dr. ERDI Gergo wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
OK I managed to make some progress on this, by using a MergeValues node:<br>
<br>
     SDNode* LDW = CurDAG->getMachineNode(<br>
       AVR::LDWRdPtr, SDLoc(N), VT, PtrVT, MVT::Other,<br>
       LD->getBasePtr(), LD->getChain());<br>
     SDValue Unpack[] = { SDValue(LDW, 0), SDValue(LDW, 2) };<br>
     SDNode* NN = CurDAG->getMergeValues(Unpack, SDLoc(N)).getNode();<br>
<br>
     ReplaceNode(N, NN);<br>
<br>
<br>
which gets me from<br>
<br>
 t17: i16,ch = load<LD2[%v25](align=1)(derefe<wbr>renceable)> t16:1, t2, undef:i16<br>
<br>
to<br>
<br>
 t24: i16,i16,ch = LDWRdPtr t2, t16:1<br>
<br>
looking tood; but then it fails during scheduling with<br>
<br>
llc: CodeGen/SelectionDAG/InstrEmit<wbr>ter.cpp:303: unsigned int llvm::InstrEmitter::getVR(<br>
   llvm::SDValue,<br>
   llvm::DenseMap<llvm::SDValue, unsigned int>&):<br>
Assertion `I != VRBaseMap.end() && "Node emitted out of order - late"' failed.<br>
</blockquote>
<br>
Looking at the result of selection again, I now noticed that here:<br>
<br>
t26: i16,i16,ch = LDWRdPtr t2, t0<br>
t27: i16,ch = merge_values t26, t26:2<br>
<br>
I'm not sure what that t26:2 means, and why it's not<br>
<br>
t27: i16,ch = merge_values t26, ch<br>
<br>
Could that be a hint to what's going wrong?<br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
For reference, the full DAG before and after ISEL:<br>
<br>
<br>
SelectionDAG has 22 nodes:<br>
 t0: ch = EntryToken<br>
 t2: i16,ch = CopyFromReg t0, Register:i16 %vreg0<br>
 t5: i16,ch = load<LD2[%v25](align=1)(derefe<wbr>renceable)> t0, t2, undef:i16<br>
   t9: ch,glue = callseq_start t5:1, TargetConstant:i16<0><br>
 t11: ch,glue = CopyToReg t9, Register:i16 %R25R24, t5<br>
 t13: ch,glue = CALL t11, TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, Register:i16 %R25R24, RegisterMask:Untyped, t11:1<br>
 t14: ch,glue = callseq_end t13, TargetConstant:i16<0>, TargetConstant:i16<0>, t13:1<br>
   t16: i8,ch,glue = CopyFromReg t14, Register:i8 %R24, t14:1<br>
 t17: i16,ch = load<LD2[%v25](align=1)(derefe<wbr>renceable)> t16:1, t2, undef:i16<br>
   t18: ch,glue = callseq_start t17:1, TargetConstant:i16<0><br>
 t19: ch,glue = CopyToReg t18, Register:i16 %R25R24, t17<br>
 t20: ch,glue = CALL t19, TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, Register:i16 %R25R24, RegisterMask:Untyped, t19:1<br>
 t21: ch,glue = callseq_end t20, TargetConstant:i16<0>, TargetConstant:i16<0>, t20:1<br>
   t22: i8,ch,glue = CopyFromReg t21, Register:i8 %R24, t21:1<br>
 t23: ch = RET_FLAG t22:1<br>
<br>
<br>
<br>
SelectionDAG has 23 nodes:<br>
 t0: ch = EntryToken<br>
 t2: i16,ch = CopyFromReg t0, Register:i16 %vreg0<br>
   t9: i16,ch,glue = ADJCALLSTACKDOWN TargetConstant:i16<0>, t27:1<br>
 t11: ch,glue = CopyToReg t9:1, Register:i16 %R25R24, t27<br>
 t13: ch,glue = CALLk TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, Register:i16 %R25R24, RegisterMask:Untyped, t11, t11:1<br>
 t14: i16,ch,glue = ADJCALLSTACKUP TargetConstant:i16<0>, TargetConstant:i16<0>, t13, t13:1<br>
   t18: i16,ch,glue = ADJCALLSTACKDOWN TargetConstant:i16<0>, t25:1<br>
 t19: ch,glue = CopyToReg t18:1, Register:i16 %R25R24, t25<br>
 t20: ch,glue = CALLk TargetGlobalAddress:i16<i8 (i16)* @read_ram> 0, Register:i16 %R25R24, RegisterMask:Untyped, t19, t19:1<br>
 t21: i16,ch,glue = ADJCALLSTACKUP TargetConstant:i16<0>, TargetConstant:i16<0>, t20, t20:1<br>
   t16: i8,ch,glue = CopyFromReg t14:1, Register:i8 %R24, t14:2<br>
 t24: i16,i16,ch = LDWRdPtr t2, t16:1<br>
 t25: i16,ch = merge_values t24, t24:2<br>
 t26: i16,i16,ch = LDWRdPtr t2, t0<br>
 t27: i16,ch = merge_values t26, t26:2<br>
   t22: i8,ch,glue = CopyFromReg t21:1, Register:i8 %R24, t21:2<br>
 t23: ch = RET t22:1<br>
<br>
<br><span class="HOEnZb"><font color="#888888">
</font></span></blockquote><span class="HOEnZb"><font color="#888888">
<br>
-- <br>
<br>
  .--= ULLA! =-----------------.<br>
   \     <a href="http://gergo.erdi.hu" rel="noreferrer" target="_blank">http://gergo.erdi.hu</a>   \<br>
    `---= <a href="mailto:gergo@erdi.hu" target="_blank">gergo@erdi.hu</a> =-------'<br>
Why is it called tourist season if we can't shoot at them?<br>
</font></span></blockquote></div><br></div></div>