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

    <tr>
        <th>Summary</th>
        <td>
            [LoopVectorize][OptRemarks] Crash when combining loop vectorization with optimization remark output
        </td>
    </tr>

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

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

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

<pre>
    **Description:**
Clang/opt crashes when applying the loop vectorization pass together with optimization remark output (`-opt-record-file` or `-pass-remarks-output`). The issue reproduces at all optimization levels (`-O1`, `-O2`, `-O3`, `-Os`, `-Oz`).

Reproducer:
The following reduced C code (generated via creduce) triggers the crash:
```c
typedef struct {
  int a;
} b;
void c() {
  void *d[] = {&&e, &&f};
  b var;
  b *g = &var;
  goto * 0;
e:
  while (1) {
 g--;
    if (g->a)
      break;
  }
f:;
}
```

**Steps to reproduce:**
Using clang:
```sh
clang -cc1 -O1 -vectorize-loops -opt-record-file tmp.yaml -emit-llvm test.c
```

Using opt directly:
```sh
clang -cc1 -disable-llvm-passes -O1 -emit-llvm test.c -o test.ll
opt -passes='default<O1>,loop-vectorize' -pass-remarks-output=rem.yaml -S test.ll
```

**Expected Behavior:**
Clang/opt should not crash; it should either safely skip vectorization or emit a valid diagnostic.

**Crash log:**
```
clang: /nobackup/rabozic/llvm-upstream/llvm/include/llvm/IR/Instructions.h:2817: llvm::Value* llvm::PHINode::getIncomingValueForBlock(const llvm::BasicBlock*) const: Assertion `Idx >= 0 && "Invalid basic block argument!"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0.      Program arguments: clang -cc1 -O1 -vectorize-loops -opt-record-file tmp.yaml -emit-llvm test.c
1.      <eof> parser at end of file
2.      Optimizer
3. Running pass "function<eager-inv>(drop-unnecessary-assumes,float2int,lower-constant-intrinsics,loop(loop-rotate<header-duplication;no-prepare-for-lto>,loop-deletion),loop-distribute,inject-tli-mappings,loop-vectorize<interleave-forced-only;no-vectorize-forced-only;>,infer-alignment,loop-load-elim,instcombine<max-iterations=1;no-verify-fixpoint>,simplifycfg<bonus-inst-threshold=1;forward-switch-cond;switch-range-to-icmp;switch-to-arithmetic;switch-to-lookup;no-keep-loops;hoist-common-insts;no-hoist-loads-stores-with-cond-faulting;sink-common-insts;speculate-blocks;simplify-cond-branch;no-speculate-unpredictables>,vector-combine,instcombine<max-iterations=1;no-verify-fixpoint>,loop-unroll<O1>,transform-warning,sroa<preserve-cfg>,infer-alignment,instcombine<max-iterations=1;no-verify-fixpoint>,loop-mssa(licm<allowspeculation>),alignment-from-assumptions,loop-sink,instsimplify,div-rem-pairs,tailcallelim,simplifycfg<bonus-inst-threshold=1;no-forward-switch-cond;switch-range-to-icmp;switch-to-arithmetic;no-switch-to-lookup;keep-loops;no-hoist-common-insts;hoist-loads-stores-with-cond-faulting;no-sink-common-insts;speculate-blocks;simplify-cond-branch;speculate-unpredictables>)" on module "test.c"
4.      Running pass "loop-vectorize<interleave-forced-only;no-vectorize-forced-only;>" on function "c"
 #0 0x0000000002105958 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x2105958)
 #1 0x00000000021027ac SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x00007fc356a6ed20 __restore_rt (/lib64/libpthread.so.0+0x12d20)
 #3 0x00007fc3554dd52f raise (/lib64/libc.so.6+0x4e52f)
 #4 0x00007fc3554b0e65 abort (/lib64/libc.so.6+0x21e65)
 #5 0x00007fc3554b0d39 _nl_load_domain.cold.0 (/lib64/libc.so.6+0x21d39)
 #6 0x00007fc3554d5e86 (/lib64/libc.so.6+0x46e86)
 #7 0x0000000001220374 llvm::PHINode::getIncomingValueForBlock(llvm::BasicBlock const*) const (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x1220374)
 #8 0x000000000133d2b0 llvm::RecurrenceDescriptor::AddReductionVar(llvm::PHINode*, llvm::RecurKind, llvm::Loop*, llvm::FastMathFlags, llvm::RecurrenceDescriptor&, llvm::DemandedBits*, llvm::AssumptionCache*, llvm::DominatorTree*, llvm::ScalarEvolution*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x133d2b0)
 #9 0x000000000133f628 llvm::RecurrenceDescriptor::isReductionPHI(llvm::PHINode*, llvm::Loop*, llvm::RecurrenceDescriptor&, llvm::DemandedBits*, llvm::AssumptionCache*, llvm::DominatorTree*, llvm::ScalarEvolution*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x133f628)
#10 0x0000000003bb2af0 llvm::LoopVectorizationLegality::canVectorizeInstr(llvm::Instruction&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x3bb2af0)
#11 0x0000000003bb4156 llvm::LoopVectorizationLegality::canVectorizeInstrs() (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x3bb4156)
#12 0x0000000003bb6036 llvm::LoopVectorizationLegality::canVectorize(bool) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x3bb6036)
#13 0x00000000039d1503 llvm::LoopVectorizePass::processLoop(llvm::Loop*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x39d1503)
#14 0x00000000039d6236 llvm::LoopVectorizePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x39d6236)
#15 0x0000000002fd9efd llvm::detail::PassModel<llvm::Function, llvm::LoopVectorizePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x2fd9efd)
#16 0x0000000001bd6e99 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x1bd6e99)
#17 0x0000000000d192fd llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xd192fd)
#18 0x0000000001bd7803 llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x1bd7803)
#19 0x0000000000d19d7d llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xd19d7d)
#20 0x0000000001bd8fe9 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x1bd8fe9)
#21 0x0000000002378fa7 (anonymous namespace)::EmitAssemblyHelper::RunOptimizationPipeline(clang::BackendAction, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>&, std::unique_ptr<llvm::ToolOutputFile, std::default_delete<llvm::ToolOutputFile>>&, clang::BackendConsumer*) BackendUtil.cpp:0:0
#22 0x000000000237bee2 clang::emitBackendOutput(clang::CompilerInstance&, clang::CodeGenOptions&, llvm::StringRef, llvm::Module*, clang::BackendAction, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>, std::unique_ptr<llvm::raw_pwrite_stream, std::default_delete<llvm::raw_pwrite_stream>>, clang::BackendConsumer*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x237bee2)
#23 0x000000000296e84f clang::BackendConsumer::HandleTranslationUnit(clang::ASTContext&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x296e84f)
#24 0x000000000424bdfc clang::ParseAST(clang::Sema&, bool, bool) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x424bdfc)
#25 0x000000000296f0b8 clang::CodeGenAction::ExecuteAction() (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x296f0b8)
#26 0x0000000002c2c7f3 clang::FrontendAction::Execute() (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x2c2c7f3)
#27 0x0000000002bbb949 clang::CompilerInstance::ExecuteAction(clang::FrontendAction&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x2bbb949)
#28 0x0000000002d19e9d clang::ExecuteCompilerInvocation(clang::CompilerInstance*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0x2d19e9d)
#29 0x0000000000c97af6 cc1_main(llvm::ArrayRef<char const*>, char const*, void*) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xc97af6)
#30 0x0000000000c8e0e1 ExecuteCC1Tool(llvm::SmallVectorImpl<char const*>&, llvm::ToolContext const&, llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem>) driver.cpp:0:0
#31 0x0000000000c91902 clang_main(int, char**, llvm::ToolContext const&) (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xc91902)
#32 0x0000000000bcaa03 main (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xbcaa03)
#33 0x00007fc3554c97e5 __libc_start_main (/lib64/libc.so.6+0x3a7e5)
#34 0x0000000000c8d7ee _start (/nobackup/rabozic/llvm-upstream/install/bin/clang-22+0xc8d7ee)
Aborted (core dumped)
```

**Environment:**

- LLVM/Clang version: 22.0.0git (earliest version tested is 14, it also crashes)
- Commit hash: 9016c60c685e8f651fa9f9250703afe5f2c02565
- Build config: Assertions enabled
- Thread model: posix
- OS: Linux x86_64



</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcWlFz46iT_zTkhZJLRpZsP-TBceKbqZu5TCXZfXUhaNlcEOgAOcl--itAjiQnM5P_rPfq_rOVnUQIun_966ZpBNRasVMAlyi_Qvn1BW3dXpvLUv8lmPn0cFFq_nKJyAqR1TVYZkTjhFYoW8U2lK7WkqodIhvdOMwMtXuw-GkPCtOmkS9C7bDbA5ZaN_gAzGkj_qJeBm6otdjpHbg9GPwk3B7rxon6-N5ATc0j1q1rWocRWaAiTXTjEgNMG55UQgIqUqwN9m-8uCSOsUkchIoUkeUEP-wBC2tbwAYao3nLwGLqMJVyrFLCAaQ96rqdBgHrIP6WDB-y4YMdPvzVKUWpJ-fuqM94ytKVR1JpKfWTJ8aAf8XxGjPNwavdgQJDHXB8EBSz2AGRJXZG7HZgbCAz0BwFem3hh6F05V4a4FBh60zLHEbzK5SuMBbKYYoy_4Dm17iMfx604Jh5U8nytWtoRGTFYzhglF2Hd6RApIBgZPizQvPrKAbjEh-o6R8QWe3iOFIMXuy00_4dTmMLRPwYP-2FDLZPB0B2SXIciLGoAjUJym4oIsuuFePSAH08dvOA0lXlpR4tHdIT3RGD9t5B4yOvj4ZhPP9hvWtYiOoxxXaP0lV4gRPGpji5neLkGNOQ-BC3-DRCsaubyQutJU6gFi6R8lBjB9ZN2Ft8UbefSVwYYE6-_AwCF5aWEoLYMAXARlynynCi419SonTlVXTdUXaNyJxDRVvpULa-naLsBpG1N6e3DpE5fneKZdcG6s7A-4GGd5m_eW6A-ei-gj09CG2-l0jsXreSY6XdMdivsHhtBhFShqUVyBdsH8VpatEGe_sxxQcqBcdc0J3S1gk2GcJZe9FY6t0QxhD4MQowIhulS8oe2waRjaEhPyKyCbS3jXUGaN09I7IRismWQ9_w-c7_o-LEFFrZiZ-_ZDGde-mhkw_c1Z9UtuBnSd_07dPn_9Ic4sMO3GfFdC3ULnTdaHMlNXtEZMG0sm4w7opawbqXKz-1QgevbmUtmMATKtLP_Bl7h2fXOO0mN0aEfFaRudJLwaUXg6nZtTUoh8gUEeIjoqJCAvecfvtys7q_wbYtI-9l69Nbo43zE23vXGMDyRtENjvh9m05YXrAWIxfo_8bmPME-mxtEdlgqjju6OxzH_aucIaykJKaMI8ZWAscW92a2OxHUms1EyGhmlbhuIB5vPeOskfM27qJMyydxJzyzeidofWrrR41Pu-cn3aqULYGXaHsBjfUWDB-RQLFsa5wWNrSFel63sY1CgxKV9kE37VK-TwRFlBESNUqFlflNdAdmESoQ5jDC250k7RKgSeHmpeEWtvWnth1JTV1RHhvrqV-ApOE-KDKJUI5I5QVzHZpAJFFyAZGO-oAZes9UA4m4W0jBaNR95XSifcENZBU2iTS6UEi4SAh9CPL1yZhnRFl67y3hPKeT5wUSU2bRqidfZuDsrVQDowEegg6GPBEK58kvfLeK-NXEYVQFZiESrFTMYajcKkpT0CKOnSxjum6FMqrqulzIpxfjf18Rdn19KjGiOolqcRzoz19QboVdSNF9cKqHcrWpVatTby4xO0N2L2WvBNQafNEDU_sk3Bs7znnKLvqngxVO0icTgTzcXlsdjqhRrh9DU6wUbPU2mekgOsRoInxiLKrvRbWJUzXtVYBiI2dYrs32ibWaQM28YVXwJGEFUD4hHdlhXo8HW4bYK2kDpKQDkJTZ3YcXxqq2D4q6ju3qjHABXN-nbKRruiq5Ej236I-uLFVRks5WL2cocpW2tTJEzV-tngnGU1Rtm4MWDAHSIKz3o-Nv4untpb6WSNYjbI19QXfkZEwWW7iPHhVmVRG13F2NlFJJ8g7osNzJBuRNRcHvw4nDRXGd3VUSEal7AL5w9GodHKOgPT-fhuTo4B8jb2ToPpoQHoVfysmfxiQS0QI1grXmrehGCVdtiYEpatZl4ZP8-75slNQfkzjXnSnGSOSpTh9To__kWmaL_PFYJm3L7arE4xQLixrD3FhXPSdDH3a6mORUvjFMST-ZdjpfLC08ZRTKRHZlEIhsgmLYuLrgKv0ucPVVeeIZNMT1GROGb4XO0XlJ6q4BIPIIq4-2IqdUJXeulCorMMmpKtZ4gg7YY1fp9Pwf1RAOgXzimV5QQvgJMXbrYEQRVvjOtukKItZ_N348Kd8YvUkDainhJO0x5wNReYzznNSYUOFhbeymJdSBCkzyEnVS5mNpZQpFDmmpX4P0UAKmUKR91LyUyk8W-Ktkls_VbZc11SoCdOST9KfiOXZshdbnJiYw6L4sXEFLIp-_Hzo1ikhaTaf_UKt-l6V2tWng1r1bNHZAe3NWIzMyDJOynRgxh2w1hhQDI7fPOJOJVutOL_ze3I_T_-kZmTK0fgYxCfS_lMoPm7-Egqrk74bat1X6vYbSUMB9DNQcTL3na6hpooDvxLOvhG-el1e1pTt3wK99r6iTpsHA2_f3jMqqbk5aNnGQm51zgTSOaF30fLERVVBFh9ykbCvHvr26fOHPPSuK357vj2jkW-fr0fLTFaWhFbpCUV_DvfYX2BHpXAv8TWj6vgWwjZ3xPtg4xsYPJ8ZHdDejOmJGbNpXvwNM-zx-9j58HpEPV5ygrdIs1_Ei8ii1FqeGa3H06PNRmiXfJqn2XfQwjdqu8qk25x_6XaSb6fdGRFHTD3i2QnignyX3wFi06oR0s1xh306_1eKyhcr7Feq_M4bZet3BvkK77xRH-3orcxH1VbFl1DxAUoOfoPQ5UBq7VfNQb6P9U1eHLPzS8b7n38DVjveelaL0RJU8gKWy2Gx45n8EcLfmayOjp6sUWWY8umSnCUE_zGSf2fnRPZ73yxOAnm-GKXtr2HX-6CPgDznK077kurU3DjgXzK2G_JPxKG3prd1eRqHfP6vxeHRuPUHGfoFCr4XRv-PeI3EvdJK0pMQWlTwkVz4Hpm_DUcdDT1J448e2XxR0bnXRpVWL7VuLVa0BtuEzzPLCO6mFm5lLdSlfPkEsoFuzt216nZwNP1NNCDDt9LF69Gk3z2zR1B89ZoKrePxTavE_7SwbdyYCkOfts2TEQ62RxsHg7pDwG34WA8_Gdil0eIjah-0lrfhvHAjYjh8ROfJqKHCtxystbJtDaYrKLvWP5yQJx-PvKPIiaNKADKUCbVwnYQIYEz7WteNkGA-hwMTBm9BrTWH_4DgwfAx9yRa750RancH1XtpptsJ_sjNw62VM60VB7iDaq3ctxPiD1VX0XoG71-sg7pb_P7vI-UDXjtbKRdd2s_M0caFLAtYzKofwQmN8UPlg6HKxu_2fyhxEgmr-4e1Vg6e3bmL0Yixt2C0kZmRWckrNrTgGzUWVvcPY3z3UNMu-uLm8Pj7fEg7LD3S_ITrKi0X78yNLppjEnwG1jo4BvhZt9wdgh7fqKwnjLB5lQ3xbYz36Ot0GwI8N7SovIc2KqJJWZbL2RL_KPG8y973bTlzjEaAPfxRnUn4dAlLPoTfAe2tOOju9Pgn6fW8ySEC62GPS0a2nNOqwIxNtzUV4-JjZQx98Wk7W7M9Nf0n6y6_jdrGJxnnQh_hvYIfHw-lbAEpTPGR6PX0Icz2gQn3NZUybuo_141815KT1crL6LLcsV9xllVoibkRBzBvV-jx-VHKltNl2q3QR690h0cefXd35wOgz-kHD6n3w6ikSEtGaZphD_VsGqPMXuPJcRVbziHH260UJdtaR43bDtS_f7qT0TnkvcTZSSzxOQCOss7HW5Aada5KbRxwHG4vGQjXceA4Md-9P6YOwuh4SD-8spWuEvzly59fEdmEW2T4AMbG5I0JmaSTdCeCCUCNFGDdsUO4lQMcC4uns3Au6jCVVh9vskYsCV7ruhYO7-O9S7xMpwUrUlYsclhURT6t6LJakjydpxmtIK8IS0le5GHsVSsk9zFYid3o-pXFoGgpgYduD-FwEtdxQ7rCjbbiOby5vffPX4Rqn_HzotgWs46TdHXBLzO-zJb0Ai6n84LMpvN8ml7sL9k8rQrGUoDFomAVmfFZNmVlls_mRZbn_EJckpTk02lapAuST9MJXSzzFBaEF7MKaMnRLIWaCjnx7p1os7sIl7Iup0UxJ_mFpCVIG64NE6LgKV6wRYSg_PrCXIaYKNudRbNUCutsL8YJJ8N949HnRZRfo_zqtnF38X4hyq9xvJ8XLhPHyxhC7d67SfyTu8MXrZGXv34FrTP4cEn-NwAA___8SjNn">