<div dir="ltr"><div><div>Hi all,<br></div><div><br></div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Our target does not have native support for 64-bit integers, so we rely on library calls for certain</font></span><span style="font-family:arial,helvetica,sans-serif"> operations (like <span style="font-family:monospace,monospace">sdiv</span>). We recently ran into a problem where these operations that are expanded to library calls aren't maintaining the proper ordering in relation to other chains in the DAG.</span><span style="font-family:monospace,monospace"><br><br></span></div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">The following snippet of a DAG demonstrates the problem.</font><br></span><div><div><div><span style="font-family:monospace,monospace"><br>  t0: ch = EntryToken<br>  t2: i64,ch,glue = CopyFromReg t0, Register:i64 %reg0<br>  t4: i64,ch,glue = CopyFromReg t2:1, Register:i64 %reg1, t2:1<br>  t6: i64,ch,glue = CopyFromReg t4:1, Register:i64 %reg2, t4:1<br>  t8: i64,ch,glue = CopyFromReg t6:1, Register:i64 %reg3, t6:1<br>        t11: ch = CopyToReg t0, Register:i64 %vreg0, t2<br>        t13: ch = CopyToReg t0, Register:i64 %vreg1, t4<br>        t15: ch = CopyToReg t0, Register:i64 %vreg2, t8<br>      t26: ch = TokenFactor t11, t13, t15, t2:1, t4:1, t6:1, t8:1<br>      <span style="color:rgb(255,0,0)">t16: i64 = sdiv t2, t4</span><br><br></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Before legalization, there is a single </font>sdiv<font face="arial,helvetica,sans-serif"> node. After legalization, this has been expanded to a call sequence:</font><br></span></div><div><span style="font-family:monospace,monospace"><br>  t0: ch = EntryToken<br>  t2: i64,ch,glue = CopyFromReg t0, Register:i64 %reg0<br>  t4: i64,ch,glue = CopyFromReg t2:1, Register:i64 %reg1, t2:1<br>  t6: i64,ch,glue = CopyFromReg t4:1, Register:i64 %reg2, t4:1<br>  t8: i64,ch,glue = CopyFromReg t6:1, Register:i64 %reg3, t6:1<br>  <span style="color:rgb(255,0,0)">  t46: ch,glue = callseq_start t0, TargetConstant:i32<0><br>  t47: ch,glue = CopyToReg t46, Register:i64 %reg0, t2<br>  t48: ch,glue = CopyToReg t47, Register:i64 %reg1, t4, t47:1<br>  t50: ch,glue = SHAVEISD::CALL t48, TargetExternalSymbol:i32'__divdi3', Register:i64 %reg0, Register:i64 %reg1, RegisterMask:Untyped, t48:1<br>  t51: ch,glue = callseq_end t50, TargetConstant:i32<0>, TargetExternalSymbol:i32'__divdi3', t50:1<br>  t52: i64,ch,glue = CopyFromReg t51, Register:i64 %reg0, t51:1</span><br>        t11: ch = CopyToReg t0, Register:i64 %vreg0, t2<br>        t13: ch = CopyToReg t0, Register:i64 %vreg1, t4<br>        t15: ch = CopyToReg t0, Register:i64 %vreg2, t8<br>      t26: ch = TokenFactor t11, t13, t15, t2:1, t4:1, t6:1, t8:1<br></span><br><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Since the </font>sdiv<font face="arial,helvetica,sans-serif"> node is not part of a chain, the </font>EntryToken<font face="arial,helvetica,sans-serif"> is used as the starting point of the chain for the library call. This means that the ordering between the sequence of </font>CopyFromReg<font face="arial,helvetica,sans-serif"> nodes and the call sequence can be changed. Specifically, we are seeing the two copies from </font>%reg2<font face="arial,helvetica,sans-serif"> and </font>%reg3<font face="arial,helvetica,sans-serif"> being moved to after the call sequence. This is a problem since the library call clobbers both of these registers (since they are caller-saved registers).<br><br></font></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">If I manually call </font>__divdi3<font face="arial,helvetica,sans-serif"> instead of using </font>/<font face="arial,helvetica,sans-serif"> in the source code that generates this DAG, then we get the following snippet:<br><br></font>  t0: ch = EntryToken<br>  t2: i64,ch,glue = CopyFromReg t0, Register:i64 %reg0<br>  t4: i64,ch,glue = CopyFromReg t2:1, Register:i64 %reg1, t2:1<br>  t6: i64,ch,glue = CopyFromReg t4:1, Register:i64 %reg2, t4:1<br>  t8: i64,ch,glue = CopyFromReg t6:1, Register:i64 %reg3, t6:1<br>      <span style="color:rgb(255,0,0)">t9: ch = TokenFactor t2:1, t4:1, t6:1, t8:1</span><br>    t19: ch,glue = callseq_start <span style="color:rgb(255,0,0)">t9</span>, TargetConstant:i32<0><br>  t20: ch,glue = CopyToReg t19, Register:i64 %reg0, t2<br>  t21: ch,glue = CopyToReg t20, Register:i64 %reg1, t4, t20:1<br>  t23: ch,glue = SHAVEISD::CALL t21, TargetGlobalAddress:i32<i64 (i64, i64)* @__divdi3> 0, Register:i64 %reg0, Register:i64 %reg1, RegisterMask:Untyped, t21:1<br>  t24: ch,glue = callseq_end t23, TargetConstant:i32<0>, TargetGlobalAddress:i32<i64 (i64, i64)* @__divdi3> 0, t23:1<br>  t25: i64,ch,glue = CopyFromReg t24, Register:i64 %reg0, t24:1<br>        t11: ch = CopyToReg t0, Register:i64 %vreg0, t2<br>        t13: ch = CopyToReg t0, Register:i64 %vreg1, t4<br>        t15: ch = CopyToReg t0, Register:i64 %vreg2, t8<br>      t31: ch = TokenFactor t11, t13, t15, t25:1<font face="arial,helvetica,sans-serif"><br><br></font></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">LLVM correctly uses a </font>TokenFactor<font face="arial,helvetica,sans-serif"> to pull the </font>CopyFromReg<font face="arial,helvetica,sans-serif"> nodes together and uses it as the input chain to the call sequence.<br><br></font></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Is there a way that I can tell LLVM that </font>i64</span><span style="font-family:arial,helvetica,sans-serif"> </span><span style="font-family:monospace,monospace">sdiv<font face="arial,helvetica,sans-serif"> operations have side-effects for our target and require an input chain?<br><br></font></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Thanks,<br></font></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">Stephen<br></font></span></div></div></div></div>