<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56434>56434</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Poor code layout of loop w/early continue
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            backend:RISC-V,
            performance
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          preames
      </td>
    </tr>
</table>

<pre>
    Compiling the code below with the command `clang -O3 -g0 -march=rv64gc_zba ` yields assembly with the increment block of the loop below placed above the header of the loop.  This requires additional branches to be executed in the loop over the straight forward code layout.

```
  struct A {
    long a[9];
  };
  typedef struct A A_t;

long f(A_t*);

long bar(long N, A_t *base, A_t* sorted_array) {
  for (long i = 0; i < N; i++) {
    A_t *elem = base + i;
    if(elem->a[0] == 5)
      continue;
    long new_position = f(elem);
    sorted_array[new_position] = *elem;
  }
  return 0;
}
```
Here's the assembly we currently emit:

```
# %bb.1:
        mv      s2, a2
        mv      s1, a1
        mv      s0, a0
        li      s3, 5
        j       .LBB0_3  <-- note unconditional branch forward
.LBB0_2:                                #   in Loop: Header=BB0_3 Depth=1
        addi    s0, s0, -1
        addi    s1, s1, 72
        beqz    s0, .LBB0_5
.LBB0_3:                                # =>This Inner Loop Header: Depth=1
        ld      a0, 0(s1)
        beq     a0, s3, .LBB0_2
# %bb.4:                                #   in Loop: Header=BB0_3 Depth=1
        mv      a0, s1
        call    f@plt
        sh3add  a0, a0, a0
        sh3add  a0, a0, s2
        li      a2, 72
        mv      a1, s1
        call    memcpy@plt
        j       .LBB0_2 < -- note unconditional back branch
      # Block LBB0_2 should be here.
```



My guess is that something is going wrong in MachineBlockPlacement.  
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1VkuT2jgQ_jXmooKyZTzAwQeYyVRSleymdrf2Ssl2YyuRLUeShyW_frtlGwyB7F5CufT6Wv1WN5kuTumzrlupZFMyVwHLdQEsA6WP7ChdNZzVtWgKFjyFuRJIOP89ZvMyZPNamLwK4hfz9rQs8_33TBARO0lQhWXCWqgzdbpwkk1uoIbGsUzp_CvTB3-stG4Hoa0SORRMZPoNPFaBKMBMKReM_VVJywx866QBlFMU0kndCMUyI5q8wjOnkSGDfyDvHPKTzUUQcjZ-Z50RsqwcO2hzFKbojVfipDu3CMKXINwO41M4fH7L6GaXO7ZlwWo3njHkjr4RQbLbBMlLEJ-RYDXduVMLBRwuPLZ7d4b70TM6BHxNEN8GfHOPIBMGSfzyt4A_Ex-G1JmwMGxxx6w26IC9MEackNFUYzSbjRwkwzCyEOX45TOypGXAd_7bXFs6iAIFtb9HMvGALsQTMkk2ENE8iN-RY0J0DF2gOwmZdSZl6PzGyaaDKw5etwaO-1ZbH2MvbmQ7dQxRX9ma7Kb3BsGj1jfRGZYGXGca74XB2yN2kwHvwaCPV9an0SXN8al0xmB64wZqiWHd_iSNAh6jOkmWLaIzIRt-9Vs_W06hFPwBGnk0eoCGHg2vUSUHNCY0uQa_DPPi424X7mNGmTCfs0Y7YF2DEbp5aOPL6bn0tzgaw_7jR6YzepQf8UES_Xv_yjFAvdwXaB3VlRvL6KFfLOvH-SMa75t-XN34L4Nv3y98erWTqQ3x_7TBp_I7X40-NA2WFbLnbMz2kR2qGHT18nFYk56bH5ScEPXhGj18kz_LX-fyMZkGLW7QXChF8yFYhq1y16CtYgzGeFXczcZ7NJbfz1jB78XyrGD0MwVrqPP2dE_L65TnvvY9SHmBHavP-ykLcuzOd7OBg610hxHOqHcZWNx_-z-Mn06s7MBaJqmqCIfFrAZXUV_Gk1LT4mh8qW7YJ5EjAl7sZ-qY1FOxL86KNC428UbMnHQK0s8aS_ykq1Eb9T3wGPBXEAbr1Fh2Z51RaeVca6kY8Vf8SmzbXbbA9o8bpd7Gad4a_QVybC-v0lpUGhfJ0zJezqqUZ6vikCyTYlmseBzGqywT6wiSKE5EEq6LmRLY6G2K5TngnFwKTYES__jw5_P8bzyiKOLUgsHagn87cqDD5GUmUx5yHq7CFcdfEi2iKFmLaJOsi1UCh4hyEGoh1YJ0XGhTzkzq1c260iKopHX2AmLZlmUD4FVB_qJzlTZpa0DUYGfestSb9S_9SIAA">