[all-commits] [llvm/llvm-project] 3f2d8e: [FixIrreducible][UnifyLoopExits] Fix callbr multie...

Lukas via All-commits all-commits at lists.llvm.org
Sun Jul 12 05:40:38 PDT 2026


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 3f2d8eb20a8d86d9aeea75a00e21a4ecff0a5234
      https://github.com/llvm/llvm-project/commit/3f2d8eb20a8d86d9aeea75a00e21a4ecff0a5234
  Author: Lukas <43409484+hertelukas at users.noreply.github.com>
  Date:   2026-07-12 (Sun, 12 Jul 2026)

  Changed paths:
    M llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
    M llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
    M llvm/lib/Transforms/Utils/FixIrreducible.cpp
    M llvm/lib/Transforms/Utils/UnifyLoopExits.cpp
    A llvm/test/Transforms/FixIrreducible/multiedge.ll
    M llvm/test/Transforms/UnifyLoopExits/basic.ll
    A llvm/test/Transforms/UnifyLoopExits/multiedge.ll

  Log Message:
  -----------
  [FixIrreducible][UnifyLoopExits] Fix callbr multiedge splitting (#207598)

This fixes a bug where splitting `callbr` multiedges corrupts the
successor's PHI nodes.

Originally, the first split edge would replace all incoming edges from
the `callbr` block with the newly introduced target block by using
`replacePhiUsesWith`. Later edges would create new target blocks and
would try to update their edge's PHI as well, but would not find it,
leading to a corrupted PHI node.

To fix this, it is theoretically only necessary to ensure that exactly
one PHI argument is replaced per split edge. However, as all the PHI
nodes must have the same argument for every edge from one predecessor, a
single target block suffices, through which all traffic can be routed,
which will be especially useful for switches, where multiedges are
common.

[Trunk crashing](https://godbolt.org/z/4MM5eMrW5)

Found while working on PR #206567, cc @ro-i.



To unsubscribe from these emails, change your notification settings at https://github.com/llvm/llvm-project/settings/notifications


More information about the All-commits mailing list