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

    <tr>
        <th>Summary</th>
        <td>
            [GISel] `matchExtendThroughPhis` is unsound for ops with multiple destination operands
        </td>
    </tr>

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

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

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

<pre>
    Discovered in a proprietary fork, so no reproducer.

before:
```
%91:_(s32), %92:_(s32) = G_UNMERGE_VALUES %8:_(s64) ; g_105.f0, g_105.f1,pad
...
%75:_(s32) = G_PHI %92:_(s32), %bb.4, %81:_(s32), %bb.3, %95:_(s32), %bb.2 ; g_105.f1,pad
```

combiner says:
```
Try combining %75:_(s32) = G_PHI %92:_(s32), %bb.4, %81:_(s32), %bb.3, %95:_(s32), %bb.2
Applying rule 'extend_through_phis'
Creating: G_ANYEXT

CSEInfo::Recording new MI G_ANYEXT
Creating: G_ANYEXT

CSEInfo::Recording new MI G_ANYEXT
Creating: G_ANYEXT

CSEInfo::Recording new MI G_ANYEXT
Creating: %103:_(s64) = G_PHI %120:_(s64), %bb.4, %121:_(s64), %bb.3, %122:_(s64), %bb.2

Erasing: %103:_(s64) = G_ANYEXT %75:_(s32)

Created: %120:_(s64) = G_ANYEXT %91:_(s32)
Created: %121:_(s64) = G_ANYEXT %81:_(s32)
Created: %122:_(s64) = G_ANYEXT %95:_(s32)
Created: %103:_(s64) = G_PHI %120:_(s64), %bb.4, %121:_(s64), %bb.3, %122:_(s64), %bb.2
```

what I guess it looks like after this one combiner rule:
```
%120:_(s64) = G_ANYEXT %91:_(s32)
%103:_(s64) = G_PHI %120:_(s64), %bb.4, %121:_(s64), %bb.3, %122:_(s64), %bb.2
```

after all of post legalizer combiner:
```
%8:_(s64) = G_LOAD %6:_(p0) :: (load (s64) from %ir.1, align 4)
%103:_(s64) = G_PHI %8:_(s64), %bb.4, %121:_(s64), %bb.3, %122:_(s64), %bb.2   ; g_105.f0,f1,pad
```

You can see that a use of %92 was incorrectly replaced with an anyext use of %91. You can turn this into a crash, "bug scanner"-style, like this (diff line nos likely wrong):

```diff
--- a/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
@@ -4024,6 +4024,7 @@ void CombinerHelper::applyExtendThroughPhis(MachineInstr &MI,
 Builder.setDebugLoc(MI.getDebugLoc());
     auto NewExt = Builder.buildExtOrTrunc(ExtMI->getOpcode(), ExtTy,
 SrcMI->getOperand(0).getReg());
+ assert(MI.getOperand(SrcIdx).getReg() == SrcMI->getOperand(0).getReg());
 OldToNewSrcMap[SrcMI] = NewExt;
   }

```

PR incoming.

Tagging @aemerson as author of combiner rule `extend_through_phis`, @andcarminati @agostonrobert as collaborators
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUV12P2jwW_jXm5ogocUICF1zwOUXqzFQzdLW9Qk58CN4xdmQ7BfbXr5zADDBMW3X16u2LECT2OY-f82UfM2tFqRCHpDcmvWmH1W6jzRBfpKiceOnkmh-GU2EL_R0NchAKGFRGV0agY-YAa21eCJ2A1aA0GKyM5nWBJiDhlISj9jfHtTZI4uMrScPjt32lvUFE4tGK0L6NKaEDD-hH6cUokHgKd6uvD_ezp7vZ6l-jz19nz16ufxJLk1ZsDOUqCnvBOvRIx-eI0EnFeLtmEASvi2e9W8t8-bS4weHILM-D5PjYv0k9z4P4ZEXvAwF6zvSC3bWDmt9Cb3Oh0IBlB_uRL5fmAK2gUCX8nca1fEZVJQ-eiqklAqEZ7h0qvnIbo-tys6o2whKatcITg8wJVZJ4BHer0cO32b-X5x6YPM8Waq297fHoCQttuIdWuIP7xZXGPwGL0F4UxtfJexafiIYXs-8DFNHoA4n4VYJ-IEHPbZgZZn9KqzXkRlpdeMNbiPyEdGXCO6Tr0r-JEf0Y4zpNb2LQn_C4ZdEVxh8QrFs7w27DHCygrNFaEA6k1i8WpHhBYGuHBtxGWNAK4XUP8eX4g_3496L2B7uo9QOTEvQaKm0dSCyZFP9F8-qUH_jj3Qnjjfr8OJr6pdPjZBW2c6M2XfpSMw5vSmujt15cmMBv9sCkKBUkv-69_l_pO4Drc_MXjqRvuoaCKbCI4HwSMqgtehc3hwvsmAWhCm0MFk4efHsgWYEcdsJtgClg6oB7d64UBXBCdbVRbeoK5TQwKAyzm5YzzesSbMGUjxulXesOEv1Uk_WNEqF9LtZrkEIhKN0WhDzAzmhVeuNfw31poFdqh7rdLjBC51J-3_o_kRM6n2iOd6gInd9JnTO5eEbZDLdJ9AllhSYoquoU1XH7hfz_RUpCkoTQTULqI54CoePjcwbHye9acLgEaPOR-XN41py9y_bo_dKcvP17VmyEwoWyzgCh6f2C0Em7IIxrITmawKKbYl6Xn3XhNRZBeTHQJNKAxOOjmv-w2ml4wN1s75okPkHl_n-2d49maWrltWd7d7_oknhWonusCs3xBDmB2d4tD298nk1xJoqGKU5o31edZ_SE5Xsy3vHMWjTulfmb5rMpFnx_re75esq_sRo8Sr7UD7jzuqwivXEDQnrTxgmtP84dRbLpzRw8H_zy1NTQVqjyoqlesrJsmrwkZLhFY7UCZqHt4H05XWz2QNLwVu-VNi2yx1C8YGYrFHOieS-1dVoZnaNxHrjQUrJcG-a0sR0-jPkgHrAODqMsTAZZltKssxly7K1Dvu71soKmeRGlSUgZZ4N-tI6QY9IRQxrSJIyiKKK9OMkCXqRxNqB5lrFBOqAZSULcMiEDXyyBNmVHWFvjMPNLdCTLUdrmukKp77CaSUKpv72Yodfp5nVpSRJKYZ19Q3HCyeaec9cUmo9JGm6ZKzbv6yINQVioldW14v6OA7qy7a61raUTlUTgaF3jLa1At_lhO7WRw41zVdOg0zmh81K4TZ0Hhd6e1b9nWRn9HywcofPGBEvovDHxfwEAAP__WcWyUA">