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

    <tr>
        <th>Summary</th>
        <td>
            DeadArgumentElimination creates invalid code with musttail calls returning structs
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            crash-on-valid
      </td>
    </tr>

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

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

<pre>
    The DeadArgumentElimination pass creates code which fails the IR verifier when run on this input:

```test.ll
%struct.S = type { i32 }

define internal %struct.S @F38()  {
  ret %struct.S { i32 0 }
}

define %struct.S @F36() {
  %3 = musttail call %struct.S @F38()
  ret %struct.S %3
}
```

```
$ /work/llvm/build/bin/opt test.ll -passes=deadargelim -S
cannot guarantee tail call due to mismatched return types
  %1 = musttail call i32 @F38()
LLVM ERROR: Broken module found, compilation aborted!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /work/llvm/build/bin/opt test.ll -passes=deadargelim -S
1.      Running pass "verify" on module "test.ll"
 #0 0x000055c16a99ca37 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/work/llvm/build/bin/opt+0x4133a37)
 #1 0x000055c16a99a57e llvm::sys::RunSignalHandlers() (/work/llvm/build/bin/opt+0x413157e)
 #2 0x000055c16a99d27a SignalHandler(int) Signals.cpp:0:0
 #3 0x00007f38e3a42520 (/lib/x86_64-linux-gnu/libc.so.6+0x42520)
 #4 0x00007f38e3a969fc __pthread_kill_implementation ./nptl/pthread_kill.c:44:76
 #5 0x00007f38e3a969fc __pthread_kill_internal ./nptl/pthread_kill.c:78:10
 #6 0x00007f38e3a969fc pthread_kill ./nptl/pthread_kill.c:89:10
 #7 0x00007f38e3a42476 gsignal ./signal/../sysdeps/posix/raise.c:27:6
 #8 0x00007f38e3a287f3 abort ./stdlib/abort.c:81:7
 #9 0x000055c16a9857a3 llvm::report_fatal_error(llvm::Twine const&, bool) (/work/llvm/build/bin/opt+0x411c7a3)
#10 0x000055c16a9855f6 (/work/llvm/build/bin/opt+0x411c5f6)
#11 0x000055c16afe2d4a (/work/llvm/build/bin/opt+0x4779d4a)
#12 0x000055c16bd1b53d llvm::detail::PassModel<llvm::Module, llvm::VerifierPass, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) NewPMDriver.cpp:0:0
#13 0x000055c16abad88a llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (/work/llvm/build/bin/opt+0x434488a)
#14 0x000055c16bd146eb 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) (/work/llvm/build/bin/opt+0x54ab6eb)
#15 0x000055c16a964609 optMain (/work/llvm/build/bin/opt+0x40fb609)
#16 0x00007f38e3a29d90 __libc_start_call_main ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
#17 0x00007f38e3a29e40 call_init ./csu/../csu/libc-start.c:128:20
#18 0x00007f38e3a29e40 __libc_start_main ./csu/../csu/libc-start.c:379:5
#19 0x000055c16a95e0a5 _start (/work/llvm/build/bin/opt+0x40f50a5)
fish: Job 1, '/work/llvm/build/bin/opt test.l…' terminated by signal SIGABRT (Abort)
```

Found using a fuzzer while testing #102896.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMWE1z6yrS_jV4Q8UlgT4XXign8fuemZO5qSR1t66WQDYTBCpASXx-_RRIPrYc5871nVlMyrFkBE93P91N0wJrxVZxvkLpLUrvFjC4nTYrbR0oBYYtas32q5cdx3ccWGW2Q8eVu5eiEwqc0Ar3YC1uDAfHLW404_h9J5odbkFIi92O4-9P-I0b0Qpu8PuOK2wGhbXCbicsFqofHKIViu5QdPjOovHjuHVLKadRklpnhsYtnzGid9jte45RfosFJRjld6cIjLdCcSyU40aBxLO1SbSmBSIFIiX2AOMSjA1384kTdnSCflHMJ_RsQj8BRySlQe1usM6BkLgB-bViX-pEUnquyoGtixQeuEswIut3bV4RWUv51iGyrgchmb8Khcha9w5PfOMb71RuEb1jHBiYLZeiwzfPI1gDSmmHtwMYUI5zfDSHDRw7jTthO3DNjjNvwGBUcJY94SK-wEXw4ycOfvz4_QHfPz399oRohW-NfuUKd5oNkuNWD4oh8g03uuuFHAMSam0cZ4jEI8Djj_vq-R7boe6Ew4DrYYsN77VxXtWdc7318UfWiKy3wu2Getno7kiTv9z0Rv-TNw6RtbB24BaRNQbFsFCNHBgPcd4YsDtcQ_PqDDR8OYp_dtC8YjZ0_a8oj5Y4_D0avTXQYZjSyuvx33NTPEl5GpQSajsmKiIk5OIeEeJzcCISEXLINUImNyFCIxx9RFEUpWkTZ1CWDdAcB7VohWhl93a8eTRCuWDoi7cckeI4ycD7RltnOHSIZN5ZQrmQHN7J_85WRG6jjySmFGh-TAtEaHymGqQ5v6Ta06CexVaB_H9QTHJjD6l5jfQ4zflMOjmTzkgOeCYHkWKycxy2y6b3ERCF_19AdALKW1pwCglJSTTpJkWNyPqjyDZZciOFGj5utmoYHzRLq5fZqJ5fMlMumWOWWdk2eLPp3c5wYJtXIeVGdL3kPubGnFkisla9k4isT6ctG0SrJEG0yrMjfvpn8A877x8h5wWiVXzCRnYJ-XTZH8IV5Rlcfk5ukmd4a4M_AtJ4i8h6GX7tLeO9T-1eW_GByNqAsDxgkxzR6oSDYg5Niryl484zAjs2ui8MjdrF3uIjQjkPoSLNgZ4E8LhDbVpwIDfcGG1mWfXy7gtPo5V1U1bVWstrAztucqC_YsdnVXSuVdpmV0KmbTaDnGdqywlL4BrIPC9ZAjPIWfrVLK5Tyk64Y9wXlWlrAmsfNOMS0W_HGQ9h2_O0Hcd-n84ofsX8SaVA7q2wD6Bgy80lJHofPsFzg5q56iAr-yugflWJ_8HfHx_ujHjj5vM24gmhM45rYEUBJ7ICCV_L-d8y9orQoElSFPPQSM5CI8l4fZpWg_JkPIqeS6HmlerZGaG2T7yd6_6FSS--3roHaHYBp7r09IeoDZj9d9Xq710vP8_SWv42uH5wayEvgPxHj78wpzIG9n701AeBEzlshQp--GK-dWwcawfV-LqB6Lc3LRie0eixbr2_fBEMW8EYLzNU3buN8ztW-DVa8XcxHua-mnVI0MO8cce79npNgKUJ1BmvZwGWznfILMmiEuvePYBQ18Ru1NZZVM6gz8ofKVkZ4c3G1_uNdWDcxp-TN52X5KtMY4fPtWuqjpcWLXeIVmkoutlRan4ulSdROJBvhBLuXNB469FvAnqobTHxoORkQzqvjwF0ZsolKy6C09zX9fSIfVY5Ux5BikfU6xyQRpD-ckArrKcH_03XOPbhgkj-p8_i6J6gIkJVhkiOHTehO-YM13s8HTeev_9fdfv04hWs_Jng6PhL7dvaNzZ4sP7cDrgdfv4MvbOQPAj0w6Fak6LMlgu2oqykJSz4Ks5JmhGal8Vit2JJXECZRk3TQMmbLM7ruMziKG9qlrRtvRArEpEkKqMsjtOMFsuUtjUvkzpv6ryOixIlEe9AyKW3f6nNdhHan1Uc5WlWLiTUXNrw7oCQKW1170QnfoZzpfXdBPmGCAm90Y1WN28gBfPD6d3CrEJvVQ9bi5JICuvsUZATTvLVV28dDi8chAqA04sH4XbzntJO_acnbOyh7WIwcvXXu77J8rcV-VcAAAD__2sIKOs">