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

    <tr>
        <th>Summary</th>
        <td>
            [VPlan] Assertion " VPlan cost model and legacy cost model disagreed"' failed.
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          patrick-rivos
      </td>
    </tr>
</table>

<pre>
    Tested using: 15106c26662a WITH commits from #107894 cherry-picked on top.
```
> git log --oneline
2bfba9bc7d37 (HEAD -> main) !fixup add TODO
28acd6af75ff Add initial loop-invariant code motion transform.
15106c26662a (origin/main, origin/HEAD) [flang][runtime] Fix odd "invalid descriptor" runtime crash
```
Testcase:
```c
char a;
extern int b[];
short c;
char d[1];
void checksum() {
  for (long e = 0; e < 3;)
 for (long f = 0; e < 3; e = 709692)
      for (; f < c; f += 4) {
 a = d[f];
        b[f] = d[f - 1];
      }
}
```
`clang -march=rv64gcv -O3 red.c`

Testcase:
```llvm ir
; ModuleID = 'reduced.bc'
target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"
target triple = "riscv64-unknown-linux-gnu"

define void @g(i64 %conv) #0 {
entry:
  br label %for.body8.us23

for.body8.us23: ; preds = %for.body8.us23, %entry
  %f.121.us24 = phi i64 [ %add.us30, %for.body8.us23 ], [ 0, %entry ]
  %arrayidx.us25 = getelementptr [1 x i8], ptr null, i64 0, i64 %f.121.us24
  %0 = load i8, ptr %arrayidx.us25, align 1
  %sub.us26 = add i64 %f.121.us24, 1
 %arrayidx9.us27 = getelementptr [1 x i8], ptr null, i64 0, i64 %sub.us26
 %1 = load i8, ptr %arrayidx9.us27, align 1
  %conv10.us28 = zext i8 %1 to i32
  %arrayidx11.us29 = getelementptr [0 x i32], ptr null, i64 0, i64 %f.121.us24
  store i32 %conv10.us28, ptr null, align 4
  %add.us30 = add nsw i64 %f.121.us24, 4
  %cmp6.us31 = icmp slt i64 %f.121.us24, %conv
  br i1 %cmp6.us31, label %for.body8.us23, label %for.cond.cleanup.split.us

for.cond.cleanup.split.us: ; preds = %for.body8.us23
  ret void
}

attributes #0 = { "target-features"="+64bit,+a,+c,+d,+f,+m,+relax,+v,+zicsr,+zifencei,+zmmul,+zve32f,+zve32x,+zve64d,+zve64f,+zve64x,+zvl128b,+zvl32b,+zvl64b,-b,-e,-experimental-smctr,-experimental-smmpm,-experimental-smnpm,-experimental-ssctr,-experimental-ssnpm,-experimental-sspm,-experimental-supm,-experimental-zacas,-experimental-zalasr,-experimental-zicfilp,-experimental-zicfiss,-experimental-zvbc32e,-experimental-zvkgs,-h,-shcounterenw,-shgatpa,-shtvala,-shvsatpa,-shvstvala,-shvstvecd,-smaia,-smcdeleg,-smcsrind,-smepmp,-smstateen,-ssaia,-ssccfg,-ssccptr,-sscofpmf,-sscounterenw,-sscsrind,-ssqosid,-ssstateen,-ssstrict,-sstc,-sstvala,-sstvecd,-ssu64xl,-svade,-svadu,-svbare,-svinval,-svnapot,-svpbmt,-xcvalu,-xcvbi,-xcvbitmanip,-xcvelw,-xcvmac,-xcvmem,-xcvsimd,-xsfcease,-xsfvcp,-xsfvfnrclipxfqf,-xsfvfwmaccqqq,-xsfvqmaccdod,-xsfvqmaccqoq,-xsifivecdiscarddlone,-xsifivecflushdlone,-xtheadba,-xtheadbb,-xtheadbs,-xtheadcmo,-xtheadcondmov,-xtheadfmemidx,-xtheadmac,-xtheadmemidx,-xtheadmempair,-xtheadsync,-xtheadvdot,-xventanacondops,-xwchc,-za128rs,-za64rs,-zaamo,-zabha,-zalrsc,-zama16b,-zawrs,-zba,-zbb,-zbc,-zbkb,-zbkc,-zbkx,-zbs,-zca,-zcb,-zcd,-zce,-zcf,-zcmop,-zcmp,-zcmt,-zdinx,-zfa,-zfbfmin,-zfh,-zfhmin,-zfinx,-zhinx,-zhinxmin,-zic64b,-zicbom,-zicbop,-zicboz,-ziccamoa,-ziccif,-zicclsm,-ziccrse,-zicntr,-zicond,-zihintntl,-zihintpause,-zihpm,-zimop,-zk,-zkn,-zknd,-zkne,-zknh,-zkr,-zks,-zksed,-zksh,-zkt,-ztso,-zvbb,-zvbc,-zvfbfmin,-zvfbfwma,-zvfh,-zvfhmin,-zvkb,-zvkg,-zvkn,-zvknc,-zvkned,-zvkng,-zvknha,-zvknhb,-zvks,-zvksc,-zvksed,-zvksg,-zvksh,-zvkt,-zvl1024b,-zvl16384b,-zvl2048b,-zvl256b,-zvl32768b,-zvl4096b,-zvl512b,-zvl65536b,-zvl8192b" }
```

Command/backtrace:
```
> /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt --passes loop-vectorize reduced.ll -S
opt: /scratch/tc-testing/tc-compiler-fuzz-trunk/llvm/llvm/lib/Transforms/Vectorize/LoopVectorize.cpp:7394: llvm::VectorizationFactor llvm::LoopVectorizationPlanner::computeBestVF(): Assertion `(BestFactor.Width == LegacyVF.Width || planContainsAdditionalSimplifications(getPlanFor(BestFactor.Width), CostCtx, OrigLoop)) && " VPlan cost model and legacy cost model disagreed"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt --passes loop-vectorize reduced.ll -S
1.      Running pass "function(loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>)" on module "reduced.ll"
2.      Running pass "loop-vectorize<no-interleave-forced-only;no-vectorize-forced-only;>" on function "g"
 #0 0x00005fabff5a9d80 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x3072d80)
 #1 0x00005fabff5a718f llvm::sys::RunSignalHandlers() (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x307018f)
 #2 0x00005fabff5a72e5 SignalHandler(int) Signals.cpp:0:0
 #3 0x00007fe3d2042520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007fe3d20969fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007fe3d20969fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007fe3d20969fc pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007fe3d2042476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007fe3d20287f3 abort ./stdlib/abort.c:81:7
 #9 0x00007fe3d202871b _nl_load_domain ./intl/loadmsgcat.c:1177:9
#10 0x00007fe3d2039e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
#11 0x00005fabfe550a26 llvm::LoopVectorizationPlanner::computeBestVF() (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2019a26)
#12 0x00005fabfe5678fb llvm::LoopVectorizePass::processLoop(llvm::Loop*) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x20308fb)
#13 0x00005fabfe56a911 llvm::LoopVectorizePass::runImpl(llvm::Function&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2033911)
#14 0x00005fabfe56af87 llvm::LoopVectorizePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2033f87)
#15 0x00005fabfd3adf96 llvm::detail::PassModel<llvm::Function, llvm::LoopVectorizePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0xe76f96)
#16 0x00005fabff3b51ef llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2e7e1ef)
#17 0x00005fabfd3b11c6 llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0xe7a1c6)
#18 0x00005fabff3b357b llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2e7c57b)
#19 0x00005fabfd3ad376 llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0xe76376)
#20 0x00005fabff3b40dd llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x2e7d0dd)
#21 0x00005fabfcbd49db llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::PassPlugin>, llvm::ArrayRef<std::function<void (llvm::PassBuilder&)>>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool, bool) (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x69d9db)
#22 0x00005fabfcbc6701 optMain (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x68f701)
#23 0x00007fe3d2029d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#24 0x00007fe3d2029e40 call_init ./csu/../csu/libc-start.c:128:20
#25 0x00007fe3d2029e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#26 0x00005fabfcbbcc65 _start (/scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt+0x685c65)
zsh: IOT instruction (core dumped) /scratch/tc-testing/tc-compiler-fuzz-trunk/build-gcv/build-llvm-linux/bin/opt
```
https://godbolt.org/z/TTchhsf9h

Found via fuzzer

Related/prior issue: https://github.com/llvm/llvm-project/issues/107473

cc @fhahn
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzkWl2P2yj3_zSeG5TIxvHbxVxkMo22-m_VajvqcznCgBP-g8EFnMnk0z_ixY6dSXf78uxIq62m5nA458d5AQw4SGu2E5TeRtldlN3foN7spbrtkFEMPy0UO0h9U0vycvtAtaEE9JqJXZSuQZIlcY5hnucQgf-8f_gNYNm2zGjQKNmCCKZJXJTVCuA9Vepl0TH8RAmQAhjZLaP4PorXUR6HP19N34EdM4DLHVgspKCcCeqbYN3UqKpxQdICRLD87d36HiysQouYiGAFIpg07Nh3ABECHj7efwyKJcIkR02RNQ1YEwKYYIYhDriU3YKJA1IMCQOwJBS00jBroEJCN1K1wcyZqxEspWI72-nW970BI8Oa5YzJ7hqOxC7K7qPsTvXCsJZG2T3YsiOQhIAIQts3ZwQQqrFinZEqghAEWYAV0vurUbKJwEjTKF1ftGNfx3ukAIrSO1-lR0OVAEwYUPssj016L5UBeKw7TRJld8lU6iAZsVnET7pvI1g6B4vQCEAjlQ0Kl2IHKIjSexBH6Z0jNyC1KLAKslPR5ppoACjiKq_gWc_9C8pWqnEKOJDwzuqs5mYhB2R9aaa-gPCvDg1nKbAAyWvJqLgPQR6JizGbx9hmGixapPA-Su_VIV_t8AEsPqZAUbLEZ9m_yB_nhxYwNUyGO_BBkp7T997KCBaKkh5TsqxxBAsvZpDaUQMIMoijF9mbIAvpoo3SNV10UbrOV-6xYCOR2ECuE1guRAo977PlQTiDNYp1nA6Qiml8yFeLXjwJ-SwWnIn-uNiJflTzT0IbJihw4yZaxbsIlixfgQhmWIqDn6xpfE4WFUa9jOEAoFaAo5pyq9FItbTrT7nsNUynvVy0pGtgQ9YpSnQw-FIZbizT9xa6skLLBCZWYOXUuj0DztrszrYiQpa9TuOgPEcEdsDYhuwOxFN413DuAimFXhg5WqXM9bKjhnLaUmE6o6x-Ao6AlQHP8kTPuaWtLfFAzMyddBA7UC4RsSAB4bJjy0ec7QRIJqq6r21r7hDs2vm6H7gZNSaYlW0sftGbofczfPIXrvhur_tih1cSW4HSoZzo0QBWelgjAUvhlawkzs3quiex9SSFP5UYbaSiVvvCtksk78g0n8OoG5Mi9PP1xEy1cNvlVs2HkOG2A5qb63rDZDxPOZbMMKzQt2bhZROWgiwxp0j03VJ3nJllry_n6nWh75i2wURFjVtSLtdj90TGKFb3huqwtlikws5g6JeyRUOR6RXVdq1K7-0T3uWrmpkIbiJ4h3yBfUF80fii9YWiHB09efDFiWGtBrKhAlMWam3b80AeaAqbCX0c6XxFJnQzoUcZnsCyHispPNP5ytIL96DuceyoYnboIr7QLTbqCrft2itccY2rryLo67LXmP0V5glhpK9wOdKvOzsx3DDeXefrKzCHGqfwdTBOh6edk97bh95j2QtDFRXPvr5DpkOeNAfEA3nQZ_ZBzxrMgWLiKi1inttiQjndBVorJoIA7drOU9ogQ6lwFT3oaYyb3UB1PuJaY9l0bTPQM2v1BFx_lZoFcoau7fbdeNrgUI4eTOzXfb46ckceEKED0XuiRiqw3GbVkwJ10kMfurp11BEfEO8DVbORMC0SrAtVyp8D1SI8ULQNlGats-ioG0zt7sjTB9wNVCMU5qw7Nl-bkfXcIoy_fv06ML7aOpFkVv8qQztrmHWcaYwUIVwKOuU3vNf7M9fsKSI1mtD1hNZnGrdyUpGCtPJwZjQtbRk5nhmD875y2UjbDjF1ZugXMRE_EB_548EObIFsb7LztjzjvZM8oQSWSnsyXw0U8laeUL1HnuBKB4UWJXntyecg7x0_eZ9PtResn0L1aagffel1sNfBXsgPsBOmvmh80couEEPpHDoRJjxW40Gaumnd2WpxavahGBmD7H5KDK0Mh5XxxHAt25HqRuoUKIxaiQaaNQPF9aCElR-HJ4aFn5knZkPuqT0TRhh-rnSoH-T3XcAY_H3yTxEKEkoaSu_ik-_jSYeCBjEdmn2ojPaZPITkHEJ2DpOYWfq5RYHeD-XYHBJ5eNqFcuALPBCh88OTGGXCyLHUoK-HctDTo54e9IL5h2D_gScxDCk68CRPy7EC41U50lk-kCks8pG_iquxIUvgQOZZlo78MqlsAwTfPLW550a2LbK52NYIPxmF8JVD2flqIoJbjRUyeB_BrcELQ7VhNjq2gmXbMU7VoulPp4VRvXiyuD3jZLHDh5G2Zzx_cLIsd2kgOwMWiw5pTbW_ljhQbKRiJwqGEx_nYPHZmyI743ZNP26N7XtSsDqC24fhrkNHcPtl6DeC29-l7Mb6Enf2HFmklT1AAoeQrqN0PUggw6TYIluZtE4xnMQnjoSgyrdaI3tD76g2X7b-XsGCr7Wmyt3D2OjD0rZ75OV_GDF7u7ez27vf6Q7hly_bgVtsomIDOo7ERgqDmNBrQpgFQvwzazvOGoadFTqC5Y4aa8xWqitdWEvgBmykNhtjlxjwUbGd9ca12PNrHtkjE4Tgi4UBWGoDWkkoB0gQwJ1tUy5hGu0UtbMDRrAADWKcknDB9On3d-vP74Du65YZgEDd74CinVTGnlr2xnR2oxzBbQS3O2b2fb3Esp1ndNEp-f_UvvS3TOvebnS3zhYmMO8JBWYfbpXAONpD958Nwk-A9G03Dv946e8_Pim5U6gFSO16u5vSPzn0_o6JkAQb_-iFYGIHrKJNSdMLbNPsbpqmIFG6EXLB7G6KU3Sgi0YqTMlCCv4SpXdCnkUvmqL0ncs8BFLYhPacuguR0ajxBgR-w6j_qSXOjMFNi74b-_fHn_gYx3GcNahumgxVpIwns1K_aE98UkwYl_wHt_bB8iyk0POj1EZR1LrBvgFMGD_0y78x_xG8i49pXEBSxuf7vwimyYVPRVI213z6oxef2U4g_hsShFO7nSnfzuw4KZuZ2fDSbEgzMDMwgmWIrGfrsNbG7v8IlAagoqEpgfEKZjAOTvmF_Fjmj_lqeidnG_BSy2XuzHMqM-NWc8wqrxoMHh87s1cUkccnxvmjXTjdfYhbOcEyglvR2V3Pdiq2xFG6Xtl3Q3G-ykmz78G3c0Ag_qfIhbusnEQjv4Y8VftTuLK6gCsug7sqcrDTLh8OyZMR3C5d7UUTarfd205qZgeCQkxThw2LKF1PYlDOoWFZNClAtV3aHZQhPn2O5a1LrMdnhOoVQlKDR8EfuUTkkcgWMZ8X5najW8tu9Q4jD5ckhTUppN19lpkDphWt8h8bSk5lHEoWczY9aZbFCOa_shF4i_kK46RCcO4HnPuRF2VTf8MP-gnpsOh0SmKqtd8glHPxCK7fzJ80Lpt65k964Q-qkuSv_VG9eN92fObLdnyr5m_nT1olycyf1aU_TVl8lz_f9mUz0V8LxF800x-QQDs7PDdXlOwb-C1j0JTFLAbZNAYkRaSppnONUIMYD294pPUHu_-87snM99ex-6nQ2L9_dsxpkTcXy1s-e42ndZbQ6e7DhfnPzP-XRhLSgia0mYWymI_eOknw_2L0_m0p-JemjhYowfNJUF5MgjQrpu9G_7H6QQ7m2oysCXI_bLgaDK_wQ6EIKm88hnFWzN-q1eUKnBY_NoYH1zffGb-fCNC3huA_I-q0yNNiNvxgfDH8VjEh37EAXAv1vyGCkBYkJmQWwtkuHddkVZHpDFa9G3SfWOd_eTV1-rNRTOz-sIv560H7KhYP7pvrB4T3Dmd9rfV3ViukXt6LRvrN5qWUlPxjb7rebBm_AvJLzd9wZ60UerHcafJcTHi_Y-L1--Asrw3xvPH6Kd34X8BMw2ix7mzq7MHfje8rbxnZmUcjZVhBvBf_57_5fVPqC1WsYVQNcrVt-eHyTUZmXpGKzBZUCOcDE-dFnADZmQ_2bPsWJpVNEc9OGvDiwgVWpIrB46M9CD9qg5R5xIjzx_H0jXX_-n4g3EBcU1ruo3SduYuN_Nzr6rJXuoqB02GCmcuOPGnRFw7dH_jdT7tgfAbNroHOXLnmxVXwtKis2WfsfJ65GuM8Ax71bRKX4TwbE3fSNqrg_ccHwIQ2qh9uSEssFXVX3JT4Yf732XXt-9HFHb4kteRmKZXt8RTB7cMD3u91U-2n36e2shcEHBgC1hCqpm1_UI6M9WXbKSYVcHf-1vef_1qQxMWqmP3EDmMQreJmj_bihtympEordENvkwLmcbyq0uRmf5vVmDZJUxYJLTNEYd0kFc2rOC5wTQlZ3bBbGMNVXCUxTFZlliwzlNR1SuumXq2aulxFq5i2iPGlNczG5MaZdJvEZVyVN-6XRtr9QBlCQZ-DqxBG2f2NunXe1P1OR6uYM230GcYww90vm903mii7n35b-uVPNze94re_Em3n3eEW_jcAAP__c04cmQ">