<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJzNGdmO47jxa9wvhA2dtvzgh7Z7BmhkkhnsJhsgL4YOyuY2RToiZXvy9akidVvuY3cwiSFYZLEuFovFKiqR2ffNM6HXE001zYg-xpp8-fLbX8lFVjwjJS3kmZJEViJTJD3S9IVIAWgMejKjM_9x5jzNnMfZ0rFPejrVEM9nIuVVRsnM36VKZxnNZ_6netT8nyXLSCb3hrGaeVEqhdKECT3zHklCD0zMvB2xUMX-Q_eacAqw9Wy1tSwI_OoRll1B1BNxZn5v0BLHlZaEiswgGMZk5m0Nsz5yLksyVoPpjgiQoT_zXIAAN-wCG3gQuGva2XWsIf5YjqytkrupaTS_mfcZHvIkiZIFBVuLA6kUzSs-xJ2tnoYAyhUdo0zw18dSXkg4mPgNv7bTNZoltt1tpdE0maQKZrLSt67A-bnor_YscPb_-vszM-akV01LEXOSKbnnMoWWsXosgG0Edu9TgucwQXuoxnEMv3XrPt_-wgo0sO_hqpU0zoQEopkXOrg2bBlg2wWrE8NkXwkRFzTbx1mGq-478OdmyQFfbti3HWB3MnFaC0BbnGNeUZAIaxRnsY5JLbqR2MKBn7caQ56eP11PJVWKSbBfhM6Az66nhB98VIF2jiPp0c-Sfjvx9c8Qbdg-locvTOnOByaWfqyMf6PwSL2nf-6_fttjSNzH5QGRDcUt2O3AxpEr7AcdsIDt23ZOvFJdD7w-fdnXk_oRC3HfD3Hk48sR_h94AszGN5GDpcWJ0H8PnN0ZUS0bqqQkzDW0iMHjhHLsBYNeOKKO-rEngMBGPvjDcwEmBkcmKtxJCL1Gr5JqY8eR5HVfcvgjJHs9-y0NUB05EeoysJ83bQFDtTJUECQbiiUiz4NXSCJDwtWxhDgfp7qhXL0la92tcMVbsqi2nnuP8mP7AnIZyET-ZxtjUvyf3Bytm69fcXN3tEsCp-9tMPphd5vw824tXddAdcy4NY851s2pvU-v8R5AcAxruqfXlJ60nSYaKMAjGs7jkaMEfVd2PZuUMZ3GSjesjVBI9OxC3yNXWpYUcYjZll20dI3EmLODIO7yhtz2dRKb9QnauXYzbNMSM0GTZ-GcOuWMPNNtNG_GG9OYBAmnYIHrjkJUnNeW8e9NrRKQ96THOOF0GqXL5urEKuVx2c-s3rlI01nU66xfsU47y17jvQLe3HX9nTVsG2O6faax1iVLKk1VnRGiX6-2pKiUPpXygBuSVBeNFgYMLy9Bt_lJQq1AS-gDPvxj4gkvRCiYmHN6iPn8DCWWLOcXlulji-nUaELOdRmfTpDrz4u4h6DLqmFl0oQ5aKEtp6TKc1rOsfpp0aMaV0NWQvU8PVXt0DVaznHh-uM5jXUFc2qRoHxJrxhvoZFfVWlbRXG1DaVo2_Bs6xqtGp6VoAOJBypoyVIz3Pjd0MBua2Ah85JSeKnvIoVXJS5MZF0ar6BCrXhsDX9hnMMJWpXiHmOvx7hmdQfT72GOeY5Knvo_3B5klkg4nzgTL7MQphodtT4pLIFM7VaPLySmhgDwD2bINXE8ut85QgfL6k8ZgwUG-zIzGuUMykVwNNNbATIepLkU-lfYIAh1gxrwD0W_XS2aY9F-x2F481igrBRzgm39t1OUgy_hrjZyoKTdSV4V2MXlhf4XKLz-VhUJeDfwwYB5koohyQCzAd6ityJ-BZ_TLZF7MzQkxeFbgik8DJFKVmVamwfn1lw9mII87K4foP0J0-JH82cTsO3NBQTW8Kb2h0ZzCYEbox6z1w3QqGt4yGu2NdNt-7RI5jbAaAF-snWwcYvdsMZrCnjh1UJHU6vQLJoVO8UlR5_ZTs0CryfG_AyHrb3NwCe0Vxo1vHMTc7UxhNgLjsl59x-WW3U6E-zesNr957N5tk9onvZaBNr1xcjrjELY0K9hmIuTt1i8X9v6aNuG08v0Ht06qGmtrJtz6-Gh3dlisM-l7e36-3tb7wsL8OvAoft0dVb5AjDfXSwhEw38KAr9dRD5y05kYEkL3HKOc0-47WAcdCbk7KbDXXGC6NYLdi0EBjFoQY2O3CAGwhFrY2yUDKQnTMTl90FwBCYFFfqr4N8HqBktgCWnQyArMQ6dqRqA6RWOHD0MunjO8wEWZ0kJ0nf1bWiLCWdM0QegAXIeH9RvjF6-nqj4o8HcuxfMQRPVMy8KlCZlq6c1_-rXC3Q_6rtTUX8q6PeBt5H7p8Z811ib0rG137FbmpxoazwN3q6_cBaODVuDrYSRqzmW292EwF3rwBbsGeGv7rNw4QRh4HmryAV9o-Bn7DPW22HUzOM5q233Qd97LWdYT7hP4P8o_7HLft-BjKT3e9A7fQQv-WBxn3-BP9y7ZqnvOk70o5zEX_iD342P_AHP6M3Ye5PJFPEZIrBdeawAB1mx-X_WJIaiJNUKM3c-v8iSZ-ZLEeTKL9R8OHrlm9HdDzn1dxmbHi2Bd07wtuI8_oRyXsS6STjWLfW9fB6YMkF-gdJuNFy2oFoww7oRpSFBXJYLKqqCllAY16G2rwSnGm9FzpBVVuKlvhpZAhVUDosFw4LhvmYP2cbP1v46foDJHmW5eRQHylkq1bejVCeASPVQlXwzqjiYPlbJAo496JgPL_aF5eLvsB7QZUpVWOl9Dr0odB-OmzRxwyCIqBenXpCu4zxYBZnn574XUD_xvAdzc6Q2oDZWqPRCDAss78Knhz-vAdt4jue6HuwS1488f5FlbhzSMHRCN1inWQ5FPRzXjC9MaQ_F1EO5MSyT6qCw4mdKq24wVoodBKVGYdBQM83pxnzNzIGLwmuVOx80uZQnRWCkJHUtrx6Mthuj6n8Bobn68A>52851</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            LLVM fails to remove bounds check on loops over pointers
        </td>
    </tr>

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

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

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

<pre>
    I expected that LLVM would remove bounds check on this code:
```cpp
#include <cstddef>

void do_checks(const int* begin, const size_t len){
    size_t idx = 0;
    const auto end = begin + len;
    for (const int* it = begin; it!=end; ++it, ++idx){
        if (idx < len){
            // Do something useful
        }
        else
        {
            throw 5;
        }
    }
}
```
But it doesn't:
```llvm

@_ZTIi = external dso_local constant i8*

define dso_local void @_Z9do_checksPKim(i32* readnone %0, i64 %1) local_unnamed_addr #0 !dbg !15 {
  call void @llvm.dbg.value(metadata i32* %0, metadata !27, metadata !DIExpression()), !dbg !34
  call void @llvm.dbg.value(metadata i64 %1, metadata !28, metadata !DIExpression()), !dbg !34
  call void @llvm.dbg.value(metadata i64 0, metadata !29, metadata !DIExpression()), !dbg !34
  call void @llvm.dbg.value(metadata !DIArgList(i32* %0, i64 %1), metadata !30, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_constu, 4, DW_OP_mul, DW_OP_plus, DW_OP_stack_value)), !dbg !34
  call void @llvm.dbg.value(metadata i32* %0, metadata !32, metadata !DIExpression()), !dbg !35
  call void @llvm.dbg.value(metadata i64 0, metadata !29, metadata !DIExpression()), !dbg !34
  %3 = icmp eq i64 %1, 0, !dbg !36
  br i1 %3, label %4, label %5, !dbg !38

4:                                                ; preds = %5, %2
  ret void, !dbg !39

5:                                                ; preds = %2
  %6 = shl nsw i64 %1, 2, !dbg !38
  %7 = add i64 %6, -4, !dbg !38
  %8 = lshr exact i64 %7, 2, !dbg !38
  %9 = icmp ult i64 %8, %1, !dbg !38
  call void @llvm.dbg.value(metadata i32* undef, metadata !32, metadata !DIExpression()), !dbg !35
  call void @llvm.dbg.value(metadata i64 undef, metadata !29, metadata !DIExpression()), !dbg !34
  br i1 %9, label %4, label %10, !dbg !40

10:                                               ; preds = %5
  %11 = tail call i8* @__cxa_allocate_exception(i64 4) #2, !dbg !42
  %12 = bitcast i8* %11 to i32*, !dbg !42
  store i32 5, i32* %12, align 16, !dbg !42, !tbaa !45
  tail call void @__cxa_throw(i8* %11, i8* bitcast (i8** @_ZTIi to i8*), i8* null) #3, !dbg !42
  unreachable, !dbg !42
}

declare dso_local i8* @__cxa_allocate_exception(i64) local_unnamed_addr

declare dso_local void @__cxa_throw(i8*, i8*, i8*) local_unnamed_addr

declare void @llvm.dbg.value(metadata, metadata, metadata) #1

attributes #0 = { mustprogress uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nofree nosync nounwind readnone speculatable willreturn }
attributes #2 = { nounwind }
attributes #3 = { noreturn }
```

[godbolt link](https://godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(filename:'1',fontScale:14,fontUsePx:'0',j:1,lang:c%2B%2B,selection:(endColumn:2,endLineNumber:15,positionColumn:2,positionLineNumber:15,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:'%23include+%3Ccstddef%3E%0A%0Avoid+do_checks(const+int*+begin,+const+size_t+len)%7B%0A++++size_t+idx+%3D+0%3B%0A++++const+auto+end+%3D+begin+%2B+len%3B%0A++++for+(const+int*+it+%3D+begin%3B+it!!%3Dend%3B+%2B%2Bit,+%2B%2Bidx)%7B%0A++++++++if+(idx+%3C+len)%7B%0A++++++++++++//+Do+something+useful%0A++++++++%7D%0A++++++++else%0A++++++++%7B%0A++++++++++++throw+5%3B%0A++++++++%7D%0A++++%7D%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:31.621243885394836,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang1300,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'1',trim:'1'),flagsViewOpen:'1',fontScale:14,fontUsePx:'0',j:2,lang:c%2B%2B,libs:!(),options:'-O3',selection:(endColumn:1,endLineNumber:1,positionColumn:1,positionLineNumber:1,selectionStartColumn:1,selectionStartLineNumber:1,startColumn:1,startLineNumber:1),source:1,tree:'1'),l:'5',n:'0',o:'x86-64+clang+13.0.0+(C%2B%2B,+Editor+%231,+Compiler+%232)',t:'0')),k:35.045422781271846,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:ir,i:(editorId:1,fontScale:14,fontUsePx:'0',j:2,selection:(endColumn:29,endLineNumber:43,positionColumn:1,positionLineNumber:1,selectionStartColumn:29,selectionStartLineNumber:43,startColumn:1,startLineNumber:1)),l:'5',n:'0',o:'LLVM+IR+Viewer+x86-64+clang+13.0.0(Editor+%231,+Compiler+%232)',t:'0')),k:33.33333333333333,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4)


It affects real-world code like this:
```cpp
size_t idx = 0;
for (auto& ref : v){
    v.at(idx);
}
```
or in Rust
```rust
for (i, v) in arr.enumerate(){
    let prev_chunk = &arr[..i];
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNGdmO47jxa9wvhA2dtvzgh7Z7BmhkkhnsJhsgLwYl0Ta3KdIRKduTr98qUrftPjaDSQzBIot1sIrFYhWVqvz76pmwy5FlhuXEHKghX7789ldyVpXISckKdWIkVZXMNckOLHshSgIah57K2SR8nHhPE-9xMvfckx2PNSQIucxElTMyCTeZNnnOdpPwUz1q_0-K5yRXW8tYT4IkU1IbwqWZBI8kZXsuJ8GGOKjm_2FbQwQD2HKyWDsWBH71CM8vIOqJeJOwN-iIaWUUYTK3CJYxmQRry6yPvFMlGU-Dm44IkKE_CXyAADfsAht4ELhp2vllPEP88R2ydpPc3FKj-U2Cz_CQJ0W0KhjYWu5JpdmuEkPcyeJpCGBCszHKDf7mUKoziQeKX_FrO12jWWLXXVcGTZMrpkGThbl2BSFORX-1J5G3_dffn7k1J7sYVkoqSK7VVqgMWtbqVALbBOzepwTP4ZL1UK3jWH7L1n2-_YUXaOAwwFUrGc2lAqJJEHu4NnweYdsHqxPLZFtJSQuWb2me46qHHvz5ebrHlx_3bQfYnUxUawZosxMVFQOJsEY0p4aSWnQjsYUDv2Axhjw9f7ocS6Y1V2C_BJ0Bn01vEmH00Qm0Oo6kJz9L-rXiy58h2rJ9LPdfuDadD9xY-vFkwqsJj6b39M_t129bDIlbWu4R2VJcg_0ObB25wn7UAQvYvm3nKCrd9cDrs5dtrdSPWIj7fogjH1-O-P_AE0Cb0EYOnhVHwv49cHZvRDVvqNKScN_SIoagKRPYiwa9eESd9GNPBIGNfPCH5wIoBkcmTriTEAfNvEpmrB1Hkpd9yfGPkBz07De3QH0QROrzwH7BbQtYqoWlgiDZUMwReRq9QpJYEqEPJcR5mpmGcvGWrGW3wpVoyZLaev49yo_tC8hlIBP5n22Mm-L_y83RuvnyFTf3R7sk8vreBqMfdrcbft6tpe9bqKFcOPPYY92e2tvsQrcAgmPYsC27ZOxonJpooAiPaDiPR44S9V3ZD1xSxk1GtWlYW6GQ6LmFvkeujSoZ4hC7Lbto6VuJVPC9JP78itz1TUrt-kStrp2GbVpiFbR5FurUTc7Ks91m5s14YxqbIKEKDrjsKGQlRG2Z8J5qlYS8JzvQVLDbKF02VydWmaBlP7N65yLdzqJeZ_2KdVote433Cnhz1_V31rBtjen3mVJjSp5Whuk6I0S_XqxJUWlzLNUeNySpzgYtDBjBroS5TY8KagVWQh_w4R8TT3ghQsHlVLA9FdMTlFiqnJ55bg4tplejSTU1JT0eIdefFrSHYMqqYWXThCnMwjhOabXbsXKK1U-LntS4BrISZqbZsWqHLsl8igvXH98xairQqUWC8iW7YLyFxu6iS9cqiotraM3aRuBal2TR8KwkG0jcM8lKntnhxu-GBvZbA0u1KxmDl_4uM3hV8sxl3qXxGirUSlBn-DMXAk7QqpT3GAc9xjWrO5hhD3PMc1Ty1P_xeq_yVMH5JLh8mcSganIw5qixBLK1Wz0-U5gaAiDc2yHfxvHkfucAHSyrP-UcFhjsy-1osuNQLoKj2d4CkPEg3SlpfoUNglA_qgH_0OzbxaF5Du13HIa3oBJlZZgTrOu_jWYCfAl3tZUDJe1GiarALi4v9L9A4fW3qkjBu4EPBsyj0hxJBpgN8Bq9FfEr-JxpifyroSEpDl8T3MLDEKlVVWa1eVC35urBFuRxd_0A7U-YFj_aP5eAra8uILCGt7U_NJpLCNwY9Zi7boBGXcNDXrOuma7bp0WytwF2FuAnaw8b19gNa7ymgBdeLXQ09RSaRXNib3HZoc-sb2mB1xNjfpbD2t1m4BO7K40a3rmJvdoYQtwFx029-w_fuel0Jti8YbX7z2f7rJ_QPO21CLTri5HXGcWwoV_DsBcnb7F4_2zro20d316m98ytg9rWwrm5cB4eu50tB_tcud6mv7_X9b5wgLAOHKZPV2eVLwAL_dkcMtEoTJI4XEZJOO9ERo60wC3nefeEuw7GQe-GnM3tcFccIbr1gl0LgUEMWlCjIzeIgXDEuhibpAPpKZe0_D4IjsCkYNJ8leL7ADVnBbAUbAjkJcahE9MDMLvAkWOGQRfPeTHAEjwtQfqmvg1tMeGMKfoANMBO0L3-jbPz1yOTfzaYB_eCOcxE98yLApVN2Wq1pl_DeoHuR33_VtS_FfT7wOvI_VNjvm-tzdjY2u_YLU1OtLaeBm8_nHkzz4WtwVbCyNUcy-1uQuCmdWAHDqzwV_dZPPOiOAqCReLDfJPoZ-wz3tthzOrxnNe2-6DvvZYzLG-4TxT-KP9xy37fgayk93vQO30EL_lgcZ9_gT_cu3ap7zpO8qOcJJyFg9-Vj_wJz-hpHLzJ5BbxCSKwW3msAAdZsf1_NoRCUZIZjZm7mJ5VKXL7pQhy5RdmPxy98s3o7oec-ruMS4_mwHtH8LbiNP6EcppR0yQcy5b6Xj4PTLkkv0BpNxouW1AtmGPdiNKQgJbljMmqYCUUxnWo7U9CMIO3IifIKiv5Ul-NzIEKKofZjGPBcH9mD_kqzJfhkj4YbgRb2Y9xO8qFxluBO9_jhFJHTWCkJHUpqh-qUqxGVQk3hyqdwdEIHftxxr2wpPwd1gy6XOsKq8HPcZDE_sNhtYxZSL0lTVjk5_MoCaBknWchjeI0DedB_GBvl_QKVMMqlp2JZYElYPz0wFeBF_h-APvAD5MgnOW5T2MWx17sR8ss30HZDgcyFzNbvEO59FCu7JTSaq-xpufa6G6Qas33kjErDviDPxxUuXqUeyZ4pvS3g9JHgCj9YKexsmr8Ad-35PE">