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

    <tr>
        <th>Summary</th>
        <td>
            [Clang] Optimization LoopFuse.cpp crashes on valid LLVM IR. Assertion `!verifyFunction(*FC0.Header->getParent(), &errs())' failed.
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang
      </td>
    </tr>

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

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

<pre>
    To reproduce: https://godbolt.org/z/zMEsM448G
`opt -passes=mem2reg,loop-rotate,loop-fusion {test}` crashes on the LLVMIR generated from `clang -O0` because of an assertion failure.
Stack Dump:
```
PHI node entries do not match predecessors!
  %sum1.0.lcssa = phi i32 [ %add, %for.inc ]
label %for.inc
label %for.inc6
opt: /root/llvm-project/llvm/lib/Transforms/Scalar/LoopFuse.cpp:1759: llvm::Loop* {anonymous}::LoopFuser::performFusion(const {anonymous}::FusionCandidate&, const {anonymous}::FusionCandidate&): Assertion `!verifyFunction(*FC0.Header->getParent(), &errs())' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /opt/compiler-explorer/clang-assertions-trunk/bin/opt -o /app/output.s -S -passes=mem2reg,loop-rotate,loop-fusion <source>
1.      Running pass "function(mem2reg,loop(loop-rotate<header-duplication;no-prepare-for-lto>),loop-fusion)" on module "<source>"
2.      Running pass "loop-fusion" on function "main"
 #0 0x00000000054498e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x54498e8)
 #1 0x00000000054472a4 SignalHandler(int, siginfo_t*, void*) Signals.cpp:0:0
 #2 0x0000704d50642520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #3 0x0000704d506969fc pthread_kill (/lib/x86_64-linux-gnu/libc.so.6+0x969fc)
 #4 0x0000704d50642476 gsignal (/lib/x86_64-linux-gnu/libc.so.6+0x42476)
 #5 0x0000704d506287f3 abort (/lib/x86_64-linux-gnu/libc.so.6+0x287f3)
 #6 0x0000704d5062871b (/lib/x86_64-linux-gnu/libc.so.6+0x2871b)
 #7 0x0000704d50639e96 (/lib/x86_64-linux-gnu/libc.so.6+0x39e96)
 #8 0x000000000402a593 (anonymous namespace)::LoopFuser::performFusion((anonymous namespace)::FusionCandidate const&, (anonymous namespace)::FusionCandidate const&) LoopFuse.cpp:0:0
 #9 0x000000000402cab5 (anonymous namespace)::LoopFuser::fuseCandidates() LoopFuse.cpp:0:0
#10 0x000000000402e5c1 llvm::LoopFusePass::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x402e5c1)
#11 0x00000000031828ae llvm::detail::PassModel<llvm::Function, llvm::LoopFusePass, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x31828ae)
#12 0x0000000005243e40 llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x5243e40)
#13 0x0000000000e6e23e llvm::detail::PassModel<llvm::Function, llvm::PassManager<llvm::Function, llvm::AnalysisManager<llvm::Function>>, llvm::AnalysisManager<llvm::Function>>::run(llvm::Function&, llvm::AnalysisManager<llvm::Function>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xe6e23e)
#14 0x000000000524275b llvm::ModuleToFunctionPassAdaptor::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x524275b)
#15 0x0000000000e6d54e llvm::detail::PassModel<llvm::Module, llvm::ModuleToFunctionPassAdaptor, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0xe6d54e)
#16 0x0000000005242160 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x5242160)
#17 0x0000000000935dda 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) (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x935dda)
#18 0x000000000092944c optMain (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x92944c)
#19 0x0000704d50629d90 (/lib/x86_64-linux-gnu/libc.so.6+0x29d90)
#20 0x0000704d50629e40 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x29e40)
#21 0x0000000000920d25 _start (/opt/compiler-explorer/clang-assertions-trunk/bin/opt+0x920d25)
Program terminated with signal: SIGSEGV
Compiler returned: 139
```

The Test IR causing the failure:
```
@.str = private unnamed_addr constant [7 x i8] c"%d %d\0A\00", align 1

define dso_local i32 @main() #0 {
entry:
 %retval = alloca i32, align 4
  %sum1 = alloca i32, align 4
  %sum2 = alloca i32, align 4
  %i = alloca i32, align 4
  %i1 = alloca i32, align 4
  store i32 0, ptr %retval, align 4
  store i32 0, ptr %sum1, align 4
 store i32 0, ptr %sum2, align 4
  store i32 0, ptr %i, align 4
  br label %for.cond

for.cond:
  %0 = load i32, ptr %i, align 4
  %cmp = icmp slt i32 %0, 10
  br i1 %cmp, label %for.body, label %for.end

for.body:
  %1 = load i32, ptr %i, align 4
  %2 = load i32, ptr %sum1, align 4
  %add = add nsw i32 %2, %1
  store i32 %add, ptr %sum1, align 4
  br label %for.inc

for.inc:
  %3 = load i32, ptr %i, align 4
  %inc = add nsw i32 %3, 1
  store i32 %inc, ptr %i, align 4
  br label %for.cond

for.end:
 store i32 0, ptr %i1, align 4
  br label %for.cond2

for.cond2:
  %4 = load i32, ptr %i1, align 4
  %cmp3 = icmp slt i32 %4, 10
  br i1 %cmp3, label %for.body4, label %for.end8

for.body4:
  %5 = load i32, ptr %i1, align 4
  %6 = load i32, ptr %i1, align 4
  %mul = mul nsw i32 %5, %6
  %7 = load i32, ptr %sum2, align 4
  %add5 = add nsw i32 %7, %mul
  store i32 %add5, ptr %sum2, align 4
  br label %for.inc6

for.inc6:
  %8 = load i32, ptr %i1, align 4
  %inc7 = add nsw i32 %8, 1
  store i32 %inc7, ptr %i1, align 4
  br label %for.cond2

for.end8:
  %9 = load i32, ptr %sum1, align 4
  %10 = load i32, ptr %sum2, align 4
  %call = call i32 (ptr, ...) @printf(ptr noundef @.str, i32 noundef %9, i32 noundef %10)
  ret i32 0
}

declare i32 @printf(ptr noundef, ...) #1

attributes #0 = { noinline nounwind uwtable "frame-pointer"="all" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { "frame-pointer"="all" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
```

It is generated from
```c
#include <stdio.h>
int main() {
    int sum1 = 0, sum2 = 0;
    for (int i = 0; i < 10; i++) {
        sum1 += i;
    }
    for (int i = 0; i < 10; i++) {
 sum2 += i * i;
    }
    printf("%d %d\n", sum1, sum2);
    return 0;
}
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzkWktv27gW_jXMhpBBUe9FFopTzwS3wQRNMNuAEimZtxIpkFSa9NdfkJQt2XHaONMBBnOLpJHEcz6ex6fDl4jWvBWMXYLkCiTXF2Q0W6kuv3MjRft9K0emeH1RSfpy-SChYoOSdKwZiEq4NWbQICoB3gC8aSWtZGdWUrUAb77b39tP-jaO898AKkGK5GBgMBCtmQbRdc96rFgL8LqTcgiUNMSw3V0zai4FBNmVYdqA7BqkCNaK6C3TUApotgx-_vzn7c0X2DLBFDGMwkbJHoIU1R0RLQz-QFapYjUZNYOygURA27kyFrohvBsVWwFU3htSf4XXYz9YX5yp0w8q736_gUJSBpkwijMNqYRCGtgTU2_hoBhlNdNaKg1wCFAJIcCJHvtwhVZdrTWBILqGw5ZDHmEIkivbTigFeG2vGqlWXNQQJNcAlR2pWLd4fOJRClApB2OjD_BGSWkA3nTdUx8MSv6X1btb-4dXAG8eFBG6karXAG_ua9IRBfDms5TDZtRsVQ_W6TBLCgvpNKMSRKUVALi0GSBCipdejtqmYd9otZW_HZiyHWxczgDOaym0Oa3pZdZEUE5dulMbiDMVnKnlPpM2UTh8Yoo3L5tR1MZbAXC5WaPV74xQpgIQfWqZuSOKCeMaC5-BlCmbOv-gADhzxGDU8uLu86fy_hPUY9VzAwmsxtbyXyoDjTwmPzfbsVrVsl8k4DAtXOuR2SxAIijkou5GyhyTHbFhReqvRpF6wUm65yRaAVTcKdkq0kOi2rFnwuiJBpYQeFPLfuAdUwF7HjqpmM2zexWCPet1YNQovgK8qbjwijCQFoIMg70fzTCalYbB_blvarTWclS2LnwCqAytuV9GIbhooQWCAONmTs4hJMD5Ejlab33S6Dh0vCZOJ7oSMhgUG4hiQSNV0Blp-3KJXFjiHmBbI3pJx47Zjg-MwxigEp-y7wDFQewstq09sSGzyhDgCEH0jHb_kjgucpYvXh_9ov3FneLCuGQ-2NRaT_dCinx7lNooRvrpReCWnAV0fPxLWQX4Cj1PZtmIeKPDI6MzTGJ4z1tBut-JoJ0Fz50Na6h5y0UjHw3Apb1_kpy6y2LS0FPtQO7Xd4CnDjIU0wSlMU4wmrzx1eg5Tx_TOOi4GJ-DVoy-oV5puUqdzU5ltjg6BCzSoqnhYLaKEfr4lXfdeehOf0aPj82NsxS22rl3rtlxls7AySEwzrMmgqSyleMsWKc4w6avYMPqbMCwmgGzQ8CoYEV6HqBTmQHzJcNihElSRBZwX9ihID3Tg3sVineNJj_RPhog_FgyvU4fVi3g0QC5JHlx5GNNquRMH5tRs32_0_DzVpf2vUVHXbKkDo8Ga6t5R_RUdtQoDkrNPC66wMwNpSDdi-b6lgjSWvPWJ5Rs1Ux_YWGaPPC0sf4dFKYozHFO2MJIygzh3VRQida3krLutKkHzh3E5UNu259_fjyniM3xxAeFHscRi9HCSBfDHxn4L47VFI05VtEyVoilDEe_gnt_W4z_xbnxwZ9TEx_RGGdJtbDx1k3wHuTOHhvykpLBSHXaW69wlq-Tyt_AQuvM7GpyxEKaxOexcOfb-p0B-kAE3iLRPyesPm5zVNNjAoXpe-rgqVj-W0I0RWGOUXbAvCJKKCULE9XoaHPHB9ZxcbiAuTeKi_YLa07R7pWzD0S1zNySeutwylOtn3mliHq5EY286YfutZSU3R9ukbrh3QmQv9T8hjulUuTFPl1mx8WkG1suXtfkWV4bupvw7Urm2i6k4EEYLdbVyDtq8-j3N15XejmYRyPlVAO8F__hgv5I6k-meMOZ2slVtuXsv7-Mep5bM_PyQ-bhIo5rKAdzS7j4ZX061LnP4mgJVdDizBWqU9kDYnQMaKdaj49W51EbosxjP7vz7i6WMxQcHsUJUZxAD_7rwmRBfZe7XSbDVM-F21n9xs0W-nUxiEp4f_Pb_aff_gSoXE9dQsXMqASzdIdhVBztogJUPmwZfGDawJsvsCaj5qJ1e1_TPuzrnVcQo5U2yu-fKv5kV2ijsEsr-kgoVX65RoSBILnK4DPkOUiuYQ0wBjixr1hCQbJGpf0PuadrSDreChh6kyhruGCQavnYyZp0fos2Rn6nJ_fMjxAE2RVAJRNGvXgzLbZi5ol0zjrSWXWrPXcRL_eC3yWFfy7F3yHys860kYo5T5FtGmyEd968T9Z6dCT5puA7u-fHYpWCBzvftRTUJ21_5zNhBZBzuZOE7hx-CxbgpO4HJ87the6MTzpOnDkh2vVu4-iEXX1dmlJJ-vLqIVua5yRm88JzzMNvCZ-I-nSU4BNOKRT6284bPJ0vhEdBnw8ffgB7HHx_EjE5Z29m36JzfHMHHa9tjVzkXxtqe_owRdieIW8w7qdeWzx8yDm88Dx-0_NTaar7ITpJu_gN2kUneRefIl5-yLx4YWRylpHpWdL96Kuf_bvIZjIxL93JZT9g9KkKRihNTtEkm4D7sTtJ6uQn0CdYnR7QOl0ELj8rFFzU2SmT87eZnf0VLrqkz8YWZ9aM8M2C-UZKatL5XLsL70Q-GLeIXK1WbqCM0aC4MI1vgUKOgrIGTqO4O9yI8PwYJ8WJZ-Fu69_OJ6Z3FpUgu94N2HVHdmE83eHSJBxNAz0xRvFqNExPA3p0bQd1KCQXdlHjlL9xQeH4zZDKHxo1ivQsGCQXxs6kMIiuAcak6wDG7jyIi6BjLemCJ1YbqYJvnJrtXhBNYkIGRpFh4KINerIQMGpkk4w2pP4aDEoaj1SNTcNUoPl3thfPJ1nj1klBPYz7puc8DdL4sL1hxIyK6b0QwFd1L58AXtur59xfNM9a-au-f_YXWrP9BfZXz3m2Qx8FO-jbnb7z2jW7NB3GOtzH-h0R_X8L1dEM-cZAro8-Z1hK1X45sDs49stLLldbf-TKhYHLmaubtEIIoW3Yz0LdGLifbSIQ7aQaaStAboX5vs1duvHJXgN85X6W4PafB8dXbnybEb2TH8X2Nk6gEODyNPS-BhxN-8U04d-VQF_ZihnCL1h2EXidkAt6GdEiKsgFuwyzGMVxiOPsYntZ13mekCwKcRNGpEZNTENGCKkShMII4wt-iRFOEMYxjpIYZasIZTiMUVXTGNMQhyBGrCe8W9l1-0qq9sJ9GnAZ4jxF6MJVfu0-x8HYrd-sL8n1hbp0XxRUY6tBjDqujZ4hDDed-4Zn7TSSa_jHYHjPv7vj84PDpeWHNE-k49R9SgNvvqz-9q8qLkbVXX78y4kpQk-X-H8BAAD__4Ah4fM">