<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJytWMmO2zgQ_Rr5QljQ6uXgQy8ToIGcMnMPKImyOKFEDUm1u_P1U0VZ1mrHnY5h2CJZG18tLDGR2fvhxQm2JVFNVfHqSHhlJKEVkbXhJf9JDZcVSZojORWsIi-EVTQRjJiCESFlvVZMSSGQs6Zau0CRcM1SwzLCDQFZhTG1dsIHJ_gC3yM3RZO4qSxhIMRr97eulfwX2GAIayXHBz-hWb5Nw5CCAQYkZ7ICWw1pqowpbWiVkUKewBZqSMsFf43ISEobzUC_S5zI-8oSlrHXby_E8Z4d76H9_UcSxUBp1qQMrWuXNl77Tagu2ilDFXl7zRECF57d4892HvAhUvGjKwRZ_03Wa4tGUyEaMNK8rAXP39P8CCNeaQMGJrxixAn_Ii0Zy4C5lzaYHEhs8f2lRIDqIiwVFNzRzpB1StbSDuRwtaS8ctPzqh3IKXM3jxTUlY1pCVzwzGC4Jpodc9oIM4FwBHbBNTGKVjqXqoRHHCN6vKKCvHwjTrA7g-kE-7k7bKDYqYzluOVXyTP0bS4lsPJN5AQQYA8gJ_ac4InADD77IA3CNKXiO4Q3LVn2nWaZIs72sRVHkCoEBJ8JT8ua6KMZ8D4RryNLFOG-JcZpQRMmcBSPRtFwzxFsg3zw44SPpFYs09aiTj78B50dihm7-aGm-E9oCs6a4gEwG7tYF7zFJH60uPgdJcw822dY8DpD7WQvYmtFHJlhgpWsMrUBIKtEQgpr0vntiVz14GYga2dlCUmza5xbnKGCHyuyGzDuJ4wdlxW6zOJ7lgeihVT61FmzR2K_I9NGKnYJF-8-uX4vtzkNZW9GspE06OOS_XfR08Hvz0LTDybROI7UNmK2zzfy1BZ_m5yQVeeS8ql8rCD3atMATIpRKN_i_e4UDULvz-WpC7FegAVMjaexxLI3boYgDGjvzquFdOrtjpZCyZq9Hvr7DQokN0y11FU2ogwHhHGPA5TdjiwakV1wiJc37MJpsxap1vQKTm7FTsuo2JW7kJmhMoB2WmUQnhE00ayKSDXKleFeLxvwRzV4abu_snxmtB-dM27RepQ8K5PejGNYKzE8Ogo_mhRMAW51S5m5lTRL-d9FyXLUD7mvRPpoltVcTLd1hm6ydI_D5_5eDrdrmgdVfnrohMt8E1hRTUc4Vz1B2kq6JNxE4WXR1U1yl-6hY-7Sv__k0bhwXN06G_c3D6Tlw7E91BaYgsWS5t84HoM7JYfXzsfd9HwcuWjJngvBrNT2rJgvVzJtFgLzdJvJ-Y2cs-Hi44lq6XHgLdawD3R580RcUnojPW_2m_5vtLb3VNX-yLFO4lX2SheTs10B8jczLqOTZnQsepJ-frwkelqYPyRx88mMbvc1lLj9ZVr7myuJNO2WR9l3pVH294t5vbuR1_v7JAfetbz2bYcSzRxv3TttDc4ITSsBhHAqoWNayOKew74fzDL4zPqhLunSZNxspl8IkHP22l6WcK0b_G1vK3CGKkXfIT4y9obt9qngaYEEtK6pguiBXlkzeKSGkVzJ0jIZxWu85KgM9s1AjbcuLOsJulsEksjsndh2nhHMfnlsGO4Cr1Jw7qQkvOi_UgFmwSt9Oxbv61SWdYPXN93S7pwWA3Uo52Jv9AZqJKCjjpYchV_e7Vtz8Hoop6nBDg4ZQJg7hKq7JWB4F8Ar0E9yLsBGCnjRH6zq99feT8jGIJHM7VwOKuQJlTxZvvkLy1M7tq8p7TuKgN2eswgcYd2LeGj-k-FWB28eBDjwfcSyEG6DzMN6ho9PLQeOnODRfifM-DkrI3BUlG1Ig8r4kWP9CCe0FvAHpMRXr1bmkKYPuivRd-KmIFqWbHyHRw3EDjifaSjqpXwFD2vZRuPFSaCrv8872au0AsKRVWNvxY-D2zAskrsPX_KhmzT877wo8jyoHl8GImHfA3Wr7BBm-3BPV7QxhVSHH9DgrholDh_WapMQ1cbhNtysioOXpPmebf3tNor2W0Y3Oy-mYbjd5jFLd3G4sjmvD7BlJwiw5FsR8Az7Xn3eAn4IvAC-Pvz6see7cbKLwpAG6W4Tsjii8E7NSgpnt20QpDqu1MGKBLg0LAquje4XITuh8jJmDQYLDTeCHb5iX9E7FlhX1o6DNeJ_44wSDA>53736</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Loop rerolling bug
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    I'm running into an optimization bug when I enable the loop-rerolling pass. I bisected it to https://github.com/llvm/llvm-project/commit/1badf7c33a but I don't understand how that commit could cause it. @LebedevRI 

To reproduce:
```bash
tar xvf bug.tar.gz
opt orig.ll -S --loop-unroll --simplifycfg --instcombine > unrolled.ll
opt unrolled.ll -S --loop-reroll --simplifycfg --instcombine > bad.ll
clang bad.ll -c -o bad.o
clang main.c -c -o main.o
clang bad.o main.o -o a.out
./a.out
- segfault
```

This transforms this original IR (orig.ll):
```llvm
define void @foo(i64** %0, i64 %1) local_unnamed_addr {
  %3 = icmp sgt i64 %1, 0
  br i1 %3, label %5, label %4

4:                                                ; preds = %5, %2
  ret void

5:                                                ; preds = %2, %5
  %6 = phi i64 [ %11, %5 ], [ 0, %2 ]
  %7 = getelementptr inbounds i64*, i64** %0, i64 %6
  %8 = load i64*, i64** %7, align 8
  %9 = load i64, i64* %8, align 8
  %10 = add nsw i64 %9, 1
  store i64 %10, i64* %8, align 8
  %11 = add nuw nsw i64 %6, 1
  %12 = icmp eq i64 %11, %1
  br i1 %12, label %4, label %5
}
```

into this (bad.ll):
```llvm
define void @foo(i64** nocapture readonly %0, i64 %1) local_unnamed_addr #0 {
  %3 = icmp sgt i64 %1, 0
  br i1 %3, label %.preheader, label %.loopexit

.preheader:                                       ; preds = %2
  %4 = add nsw i64 %1, -1
  %xtraiter = and i64 %1, 3
  %5 = icmp ult i64 %4, 3
  br i1 %5, label %.loopexit.unr-lcssa, label %.preheader.new

.preheader.new:                                   ; preds = %.preheader
  %6 = add i64 %1, -4
  %7 = or i64 %6, 3
  br label %14

.loopexit.unr-lcssa:                              ; preds = %14, %.preheader
  %.unr = phi i64 [ 0, %.preheader ], [ %20, %14 ]
  %lcmp.mod.not = icmp eq i64 %xtraiter, 0
  br i1 %lcmp.mod.not, label %.loopexit, label %.epil.preheader

.epil.preheader:                                  ; preds = %.loopexit.unr-lcssa, %.epil.preheader
  %8 = phi i64 [ %13, %.epil.preheader ], [ %.unr, %.loopexit.unr-lcssa ]
  %epil.iter = phi i64 [ %epil.iter.sub, %.epil.preheader ], [ %xtraiter, %.loopexit.unr-lcssa ]
  %9 = getelementptr inbounds i64*, i64** %0, i64 %8
  %10 = load i64*, i64** %9, align 8
  %11 = load i64, i64* %10, align 8
  %12 = add nsw i64 %11, 1
  store i64 %12, i64* %10, align 8
  %13 = add nuw nsw i64 %8, 1
  %epil.iter.sub = add nsw i64 %epil.iter, -1
  %epil.iter.cmp.not = icmp eq i64 %epil.iter.sub, 0
  br i1 %epil.iter.cmp.not, label %.loopexit, label %.epil.preheader, !llvm.loop !0

.loopexit:                                        ; preds = %.epil.preheader, %.loopexit.unr-lcssa, %2
  ret void

14:                                               ; preds = %14, %.preheader.new
  %indvar = phi i64 [ %indvar.next, %14 ], [ 0, %.preheader.new ]
  %15 = phi i64 [ %20, %14 ], [ 0, %.preheader.new ]
  %16 = getelementptr inbounds i64*, i64** %0, i64 %indvar
  %17 = load i64*, i64** %16, align 8
  %18 = load i64, i64* %17, align 8
  %19 = add nsw i64 %18, 1
  store i64 %19, i64* %17, align 8
  %20 = add nuw nsw i64 %15, 4
  %indvar.next = add i64 %indvar, 1
  %exitcond = icmp eq i64 %indvar, %7
  br i1 %exitcond, label %.loopexit.unr-lcssa, label %14
}
```

I believe the issue is that the array index (which is apparently separate from the trip count) is passed from the unrolled body to the epilogue, but the wrong value / wrongly-computed value (%20) is passed, which is 4x too large (the original unrolling factor is 4x).


The IR input file was taken from the clang output of the following C file:
```C
void foo(long** arr, long size) {
    for (long i = 0; i < size; i++) {
        long* item = arr[i];
        (*item)++;
    }
}
```
with some optimization attributes removed so that unrolling+rerolling would happen.

[bug.tar.gz](https://github.com/llvm/llvm-project/files/8044004/bug.tar.gz)


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytWEmTmzgU_jX4ojLF6uXgQ3dnUtVVOWXmnhIgjCZCYpCwu_Pr5z1hzGrHncRFGSS9Td9btCQqez-8OsG2JHUjJZdHwqVRhEqiKsNL_oMariRJmiM5F0ySV8IkTQQjpmBEKFWta1YrIZCzolq7QJFwzVLDMsINAVmFMZV2wicn-AzPkZuiSdxUldAQ4tS91lWt_gU2aMJYyfHDT2iWb9MwpGCAAcmZkmCrIY3MWK0NlRkp1BlsoYa0XPBqREZS2mgG-l3iRN4XlrCMnb6-Esf75HhP7f8_itQMlGZNytC6dmjjtU9CddF2GVqTt1OOELjw7R5_tP2AD1E1P7pCkPXfZL22aDQS0YCW5mUleP6e5kdocakNGJhwyYgT_kVaMpYBcy9t0DmQ2OL7U4kA1VVYKii4o-0h65SslW2o4WhJuXTTy6htqClz148U1FWNaQlc8MyguSaaHXPaCDOBcAR2wTUxNZU6V3UJn9hG9Likgrx-JU6wu4DpBPu5O2yg2K6M5Tjlk-IZ-jZXClj5JnICCLAnkBN7TvBCoAe_fZAGYZpS8Q3Cm5Ys-0azrCbO9rkVR5AqBAQ_EZ6WFdFHM-B9IV5HltSE-5YYuwVNmMBWPGpFwzlHMA3ywZ8TPpOqZpm2FnXy4R10dtTM2MkPNcV_QlNw0RQPgNnYwargLSbxs8XF7yih55P9hgGvM9R29iK2VsSRGSZYyaSpDAApEwUprEnntxdy04ObgaydlSUUzW5xbrGHCn6UZDdg3E8YOy4rdJnF9ywPRAuR-txZs0divyPTRtXsGi7eY3L9Xm5zHsrejGQjadDHJfvvqqeD35-Fph9MonEcqW3EbD_dyVNb_G1yQlZdSspv5aOE3KtMAzDVjEL5Fu8Pp2gQen8uT12I9QIsYPW4G0sse-NmCMKA9uG8Wkin3u5oKZSs2euhv9-gQHLD6pZaZiPKcEAY9zhA2e3IohHZFYd4ecIurDZrkWpNb-DkSnZeRsWOPITMDJUBtNMqg_CMoIlmVUTVo1wZzvU6AX9Ug5em-zPLZ0b70SXjFq1HybMy6c04hrUSw6Oj8KNJwRTgVrdUmSuVWcr_LkqWo37IfSPSR72s4mI6rQt0k6FHHD7393K43dI8qPLTRSdc5pvAimo6wrnqCdJW0jXhJgqvg65ukod0Dx3zkP79by6NC8vVvbVxf3dBWl4c20VtgSlYLGn-neUxeFByeGt93E3Xx5GLluy5EsxKbc-K-XIj02YhME-3mZxfyDkbLj6uqJYeG95iDfvALm-eiEtK76Tn3f2m_wtb20eqar_kWCdxmZ3oYnK2I0D-ZsZldLIZHYuepJ8fL4meFuYPSdz8Zka38xpK3P40rf3NjUSa7pZH2Xdjo-zvF_N6dyev949JDrxbee3bHUo0c7x173RrcEFoWgkghFMFO6aFLO457PlglsEX1g_tkq6bjLub6VcC5Jyd2ssSrnWD_-1tBfbQuqbvEB8Ze8Pt9rngaYEEtKpoDdEDe2XN4JMaRvJalZbJ1LzCSw5pcN8M1HjrwrKeoLtFIInK3ondzjOC2a-ODcNZ4FUK9p1rBQf9ExVgFhzp27Z4X6eqrBq8vumGdpe0GKhDOVd7ozdQowCd-mjJUfj1bN-ag9dDOU0N7uCQAYS5Q6i6WwKGdwFcgn6ScwE2UsCLfmeyn197P6Eag0Qqt305qFBnVPJi-eYHlpe2bY8p7RlFwGwvWQSOsO5FPDT_wXCqg5MHAQ48j1gWwm2QeVjP8POl5cCWEzzbZ8KMv4syAktF2YY0qIyfOdaPcEJrAX9CSjx6tTKHNH3Q3Yi-MzcF0apk4zs8aiB2wPlMQ1Ev1Qk8rFUbjVcnga7-Pu9sr9IKCEcmx96Knwe3YVgkdx--5EM3aXjvvCjyPKgenwciYd4DdavsEGb7cE9XhhvBDl9wlezNBL5VU4vDh02wGYk2xOE23KyKQ8r2yT6P8zAM9iG8kjjaxNt8l4aev4-idGULgD7A_J0gwPpvRcA3gLDih8AL4PHh3489342TXRSGNEh3m5DFEYXjMSspLMN2rVf1cVUfrEkwAw2Dgmuj-0FINCiijFl1IJ82plD14Tvs7ldW78Ha_T-DGfyD">