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

    <tr>
        <th>Summary</th>
        <td>
            SimplifyCFG pass breaks swifterror attribute usage. 
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          z-ukalnins
      </td>
    </tr>
</table>

<pre>
    Stumbled on the following optimisation error, the SimplifyCFG pass ignores the swifterror attribute and moves the swifterror argument to a Phi node, causing the verifier pass to fail.  

Consider the following synthetic example repeating the problem:
```llvm
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx10.13.0"

%swift.error = type opaque

declare swiftcc i8 @bar(i8, %swift.error**)

define internal swiftcc i8 @foo(i8 %0) {
    %sw1 = alloca swifterror %swift.error*, align 8
    %sw2 = alloca swifterror %swift.error*, align 8
    store %swift.error* null, %swift.error** %sw1, align 8
    store %swift.error* null, %swift.error** %sw2, align 8
    
    %cmpRes = icmp eq i8 %0, 0
    br i1 %cmpRes, label %one, label %two

  one:
    %mod1 = add i8 %0, 1
    %res1 = call i8 @bar(i8 %mod1, %swift.error** noalias nocapture nonnull swifterror dereferenceable(8) %sw1)
    br label %end

  two:
    %mod2 = add i8 %0, 2
    %res2 = call i8 @bar(i8 %mod2, %swift.error** noalias nocapture nonnull swifterror dereferenceable(8) %sw2)
    br label %end

  end:
    %res = phi i8 [%res1, %one], [%res2, %two]
    ret i8 %res
}
```

Building it with `llc  -filetype=obj -relocation-model=pic -O2 test.ll --simplifycfg-sink-common=false -o test.o` will succeed, but 
building with `llc  -filetype=obj -relocation-model=pic -O2 test.ll --simplifycfg-sink-common=true -o test.o`  will fail with:

```
swifterror value can only be loaded and stored from, or as a swifterror argument!
  %sw1 = alloca swifterror %swift.error*, align 8
  %sw1.sw2 = select i1 %cmpRes, %swift.error** %sw1, %swift.error** %sw2
swifterror value can only be loaded and stored from, or as a swifterror argument!
  %sw2 = alloca swifterror %swift.error*, align 8
  %sw1.sw2 = select i1 %cmpRes, %swift.error** %sw1, %swift.error** %sw2
swifterror argument should come from an alloca or parameter
  %sw1.sw2 = select i1 %cmpRes, %swift.error** %sw1, %swift.error** %sw2
  %res2 = call i8 @bar(i8 %mod2, %swift.error** noalias nocapture nonnull swifterror dereferenceable(8) %sw1.sw2)
```
.

Repeated this on llvm-project/main @ c5fe7eb2162e8ed114140eff0f4fef62d58178d3 . 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzNVtty4ygQ_Rr5pUsuCfkiP_ghl8o-7tbkCxC0bCYINICS8X79NkhObMczs1XZSW1KsWVous85DU03Vh62j2HoGo0SrIGwR2it1vZFmR3YPqhOeR4UTaFz1mXsLtk8qq7Xqj3cPfwBPfce1M5Yhz5N-hfVhmQOPASnmiEgcCOhs89XTNxu6NAECBY4_LVXYKzEGEjwwUcYccEzOtUqdGM0Mm250nOArLjPipvx884aryTZnLPwB0MDQQnA75xgIzjskUhNrntniX6XVZObbFWMj9bP3TgUCCQGkDxwzQ92CJBV95AxhnlcZ3O1WtD3apGrktX0Rp-5qdg49hjHGDtzRbJEJJMb7jqy4z0N5R0X1n8vi3lZzYvXZdMnWybl5qN0cXU49EiJ4t8GPLWUKDR3k9BCgKohWxQNpwzWqo7qnvvK2E16NudOWmUQlKFUGa4vnLXWJmfREwHdQLa-HdcB_SX3ZYLIKROCn-b8Suw7MqNNBPWFC_YhFz7QrnxvC2bQ-kciTND_Y3_sOsVTsqLrv9D5iHwVvQN-g1d176B4s20cqPJtRZzVvEEdh6zBs9_hxZ6mFCAaVDdngTsrp0xJeRqyPLOi4z1aCcrGxYY6evmhBsYSd-7pW_A-DCSisSaqdppTOrvY0r8RyOlIkuc67aspH5szBV4ZopHnDCPl9wzZNYbskiH7BUP2-xiyf88wDlwwdNPO6amARrTL2yllE-CY9uV9-nGcOnKJetHUqzdH9WkkTEZT4PX9RXE8BXQ7KC1jOVUBXlTYQyqeAiBvlcZYoQiZbb5C7jCe43if5CQmahrvqTDnfzII6MOc1MpzP10uot3Ru3nKhe06a8i25doj5HY0thSG4kWFByEQZeTTxOKcUDVHVL8VUnDDBaIRUryfUuS3e-WagCd745lrciW4oSOqD9AgaMsl3cvx6kyFR0LrbBdZxnvTA792j2bs9dh-uAaPDubHKuxRowjvas8viujPauInafCRS-TTNXhtiPzeDloCbTVMpEmEIwcbGyHHO6Q1nwv0f1AoE8e3VuX8QM1PD9uX1OjRngl75WN_G1u6nBq-ryRNxh46rkzEDmLZ4hobVq4Y1ijLclEuCmzbol202K6YXNblupYVzGGG23K12tSbdV1VM7mt5Kba8FlQQeP2XV_cOORP_npLPHi-Q3I4OL3dh9D7WCrYAz07qhtDMxdxoz-kNnT8OoGuvB9iRh-WG1YvZvutZDXB521bL-qKrzmK5bpY1IKtynXVlstZuk78NpV_ZvAFkovYYS7vZ2rLCsZKVpQlq4qqmAtcFYWsy6aoqorjilTCLvbcEcfcut3MbROkZth5mtTKB_82SdzpFCGmcOSfD2Fv3fbvfHji2ijjZyn6NqH_B-Uq0pY">