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

    <tr>
        <th>Summary</th>
        <td>
            BitcodeReader does not merge same incoming pairs in PHI node when inserts phi constexpr block
        </td>
    </tr>

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

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

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

<pre>
    When inserting phi constexpr block it [simply replaces predecessor block with newly created block](https://github.com/llvm/llvm-project/blob/fd8b84ea0fa1eb1da105257f419d926278dc0445/llvm/lib/Bitcode/Reader/BitcodeReader.cpp#L6933), however the phi node may contain multiple entries for the predecessor block, but only one should be left since [there is only one edge from newly create phi constexpr block](https://github.com/llvm/llvm-project/blob/fd8b84ea0fa1eb1da105257f419d926278dc0445/llvm/lib/Bitcode/Reader/BitcodeReader.cpp#L6931) to the successor block. 

The problem can be easily reproduced when LLVM18+ tries to read binary bitcode compiled by LLVM17, because in LLVM18 [ most constant expressions were removed](https://discourse.llvm.org/t/rfc-remove-most-constant-expressions/63179). 

The problem can be reproduced with the attached `bug.ll`:
```
@.str = private unnamed_addr constant [5 x i8] c"WORK\00", align 1

define ptr @bug(i8 noundef %0)  {
  switch i8 %0, label %2 [
      i8 1, label %5
 i8 2, label %5
      i8 3, label %3
      i8 0, label %4
    ]

  2: ; preds = %1
 unreachable

  3:                                                ; preds = %1
    br label %5

  4:                                                ; preds = %1
    br label %5

  5: ; preds = %4, %3, %1, %1

    %6 = phi ptr [ inttoptr (i64 111 to ptr), %4 ], [ inttoptr (i64 222 to ptr), %3 ], [ inttoptr (i64 or (i64 sub (i64 ptrtoint (ptr @.str to i64), i64 32), i64 -9223372036854775808) to ptr), %1 ], [ inttoptr (i64 or (i64 sub (i64 ptrtoint (ptr @.str to i64), i64 32), i64 -9223372036854775808) to ptr), %1 ]
    ret ptr %6
}
```
Compile it to binary bitcode with LLVM17:
`/opt/llvm@17/bin/llvm-as bug.ll -o bug17.bc`
(`bug17.bc` is also attached)

The resulted bitcode file will be improperly read by LLVM18+:
```
/opt/llvm@19/bin/opt -passes="verify" bug17.bc
PHINode should have one entry for each predecessor of its parent basic block!
  %6 = phi ptr [ inttoptr (i64 111 to ptr), %4 ], [ inttoptr (i64 222 to ptr), %3 ], [ %constexpr1, %phi.constexpr ], [ %constexpr1, %phi.constexpr ]
/opt/llvm@19/bin/opt: bug17.bc: error: input module is broken!
```

Produced IR:
```
define ptr @bug(i8 noundef %0) {
  switch i8 %0, label %2 [
    i8 1, label %phi.constexpr
    i8 2, label %phi.constexpr
    i8 3, label %3
    i8 0, label %4
  ]

2: ; preds = %1
  unreachable

3: ; preds = %1
  br label %5

4: ; preds = %1
  br label %5

phi.constexpr:                                    ; preds = %1, %1
 %constexpr = or i64 sub (i64 ptrtoint (ptr @.str to i64), i64 32), -9223372036854775808
  %constexpr1 = inttoptr i64 %constexpr to ptr
  br label %5

5:                                                ; preds = %phi.constexpr, %4, %3
  %6 = phi ptr [ inttoptr (i64 111 to ptr), %4 ], [ inttoptr (i64 222 to ptr), %3 ], [ %constexpr1, %phi.constexpr ], [ %constexpr1, %phi.constexpr ]
  ret ptr %6
}
```
Note that `phi.constexpr` appears twice in the PHI node, while it should appear only once. 

[bug.zip](https://github.com/user-attachments/files/20120768/bug.zip)

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcWFtv47oR_jX0y8AGRd0f_GAnMM6i29PFouh5LChpZLErkQJJxev--mJ0sePEm03QFl3UCKALh6OZb4bfR0Y6p44accviPYsfV3LwjbFbrI5Sf1N6VZjqvP2jQQ1KO7Re6SP0jYLSaOfxe2-haE35DZQHFu-d6vr2DBb7VpbooLdYYYnOmcXupHwDGk_tGUqL0mM1DbD4kYms8b53LNwxcWDicFS-GYpNaTomDm37tFzWvTX_wNIzcShaUzBxqKusyCKUvJYBFkElAx6LOK2jIK9ykYg0q0oeRfEzP4rm7ZUvTYVMHL6irNBeX03Pm7LvmQg_J3kYMpEz8QCNOeETWvANjkBoUyF08kyIeKk0dEPrVd8ioPZWoYPazNYvwSB3xeDB6PYMRiO4xgxtBQVCi7UHp3SJBKtv0CIod7XE6ohQW9PdYHmvMr88sAETOXgzQuSG8jlAG2B8x_juryN6pmixg1JqAgilU1OnWVMNJVZwoib9_Plvfw4yJvYwYe8NWJQVFEpLe4ZiigFK0_Wqpd47T1PSsRZYysEhqMUPYQ-dcX4CVWoPBCw6p4x2cKKqWOzME1b3YK6UK81gHW4Im42xRyYOBK6ty_U0b03e14v39TPvTBySMEhzJvI3YHieP60sAlF6L8sGK2AJL4bjpm1ZwikovqOb6Y_vWMQ3zltg4SP0Vj1R_wxayw6rv8uqstecWbyP4TuojMWPUDIh_vjL1z-x-IFzJgQBJ1t11BBMUVZYK43Qk-uIAmAiUxloM-gKa2Ai5lRxYOme8R2AOylfNqCyeegBWllgS0-CPj0a0U9lENwMxzSkMhCv3y4Twpuh8PnQ7aeieYjqOKYBIFi4Axbux4XrRpyYiClLGLRFWTayaHGxDsn6g7_7zgGgsLf5jK-j__oX4rsZRwTUiN50DS7XeRrQUzI1UqOmysd7UNp7Mz6ITCURBEFA67H3dqZS8j0CTvd3JgghXk0I35pgLnduKJbb3ltvFLWxyOamHPveG1BJNHsmw1A8e1jnQoRhKniYZHGUpnHGs5mobuIJfsl4pqpY9FMxRJxQrdLHFxTwMNEgibc3Lzly5JOZHC_kIQ6m9wvZR5x481AoveiHdDAxDqwN3QXppihnuhHZxEfLO9Iz2Tpz4StK4sJzFt3QjruDOZyaAj2ptiXaU11vTY92VAB5pXFi_jtM9zLq_BK16T2se-kcOhY-MiGe0Kr6zIS4hs93X3779DvFMOtzI59wUmHt7XnUd2KDG4E3NSjvoJcWtYdCOlUuoj8twf_RkmEivmwQloXcN2pz3TV82PhnABOpXMAMd4DWGks3SveDh85UQzvubgprvqGeALqpH999WVTu09fX9X2n4nxQcF7JzU3mVyPxHqP7OvQDFbpo0BsK9FqCwjeM77B99DHz27zeJ0R3vF-V46a5RgNj4d-myrs0OS-3ayuPn7ssHXJwE8y8gH6ARPyfkOFbOOeFfdHZ_zd-eIcU_W48gm-kp13rLToJB9n3KK0Df1LluD-nfe6X3z6Npy_68KmZdWym6GnCcl4qcdlCs3hPAvVP1f_0XDQ4tOtJmzrUnjbkpEF0FTwQPE0yYrnZ26hdq2obVnmYyxVugzRK0pwLzlfNFoM4rkMRoUjDNOWpSERd5lEaYBwkSZis1FZwEfOY50EQcs43UR1FkudBnUUlllnCIo6dVO3lKLFSzg24DcJcRPFqbFI3HuKF0HiCcZS25_Hjym5HcS6Go2MRb5Xz7urGK9_i9uZwBpVBB9p46NAeEZzsCPTSdOPpXyrrqAYL_tPJa_r3gLt3BF0Ntt1--AQ6ZkBozyk-bcW_AgAA___ZwdcJ">