<div dir="ltr">Hi,<div><br></div><div>I am working on a custom backend, and I am trying to figure out how to deal with some branching inefficiencies in my output code, and the best way to fix it.</div><div><br></div><div>So, let's say I am compiling a small function that takes the sum of an array.</div><div>int loop(int* array, int n) {</div><div>  int ret = 0;</div><div>  for (int i = 0; i < n; i++) {</div><div>    ret += array[i];</div><div>  }</div><div>  return ret;</div><div>}</div><div><br></div><div>The problem I am having is that in the generated code, we got something along these lines.</div><div><br></div><div>loop: </div><div>    <loop-code></div><div>    branch cond exit-block</div><div>    branch loop</div><div>exit-block:</div><div>    <exit-block code></div><div><br></div><div>Now, due to the basic block placement, that could be simplified to the following, removing an extra branch instruction.</div><div><div>loop: </div><div>    <loop-code></div><div>    branch !cond loop</div><div>exit-block:<br></div><div>    <exit-block code></div></div><div><br></div><div>So, I decided to investigate to see if this problem occurs in other backends (basically to see if I am missing some implementation in my backend). I found that you can see this issue with the same code for the NVPTX backend, but not for the x86 or ARM backends. </div><div><br></div><div>When I looked at the debug output for the x86 backend though, I can't figure out how they realize to get rid of that branch. Up to the last point that MachineInstrs are printed (the rewrite virtual registers pass), the MachineInstrs still show the two jump paradigm. But in the final output, it somehow becomes one branch case.</div><div><br></div><div>I know one solution is for me to add a pass after basic block placement to change these instructions, but I am wondering if there is a recommended way to do this. Especially as this seems like a common problem, where an existing generic pass would have some interface a backend should support to allow branch re-writes to create the single branch case.</div><div><br></div><div>Thanks,</div><div>-Dilan</div><div><br></div></div>