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

    <tr>
        <th>Summary</th>
        <td>
            `dso_local_equivalent` parsing doesn't correctly handle forward references
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    Take this example:

```llvm
source_filename = "test.ll"

declare void @func()

@const = constant i64 ptrtoint (ptr dso_local_equivalent @func to i64)
```

This parses correctly, but LLVM tools always canonicalize IR and put variables first, so running this example through `opt` produces:

```llvm
source_filename = "test.ll"

@const = constant i64 ptrtoint (ptr dso_local_equivalent @func to i64)

declare void @func()
```

Now, if we try to run `opt` again on this output, we get the following failure:

```
opt: /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3423: bool llvm::LLParser::parseValID(ValID &, PerFunctionState *, Type *): Assertion `GV && "Could not find a corresponding global variable"' failed.
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: /usr/local/google/home/phosek/llvm/llvm-project/build/debug/bin/opt -S
 #0 0x000055ecbe63a3da llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:569:11
 #1 0x000055ecbe63a4eb PrintStackTraceSignalHandler(void*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:636:1
 #2 0x000055ecbe638d86 llvm::sys::RunSignalHandlers() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Signals.cpp:103:5
 #3 0x000055ecbe63aac5 SignalHandler(int) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/Support/Unix/Signals.inc:407:1
 #4 0x00007fdf5f6f1200 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x12200)
 #5 0x00007fdf5f3eb8c1 raise ./signal/../sysdeps/unix/sysv/linux/raise.c:50:1
 #6 0x00007fdf5f3d5546 abort ./stdlib/abort.c:81:7
 #7 0x00007fdf5f3d542f get_sysdep_segment_value ./intl/loadmsgcat.c:509:8
 #8 0x00007fdf5f3d542f _nl_load_domain ./intl/loadmsgcat.c:970:34
 #9 0x00007fdf5f3e4242 (/lib/x86_64-linux-gnu/libc.so.6+0x31242)
#10 0x000055ecbd08d5f3 llvm::LLParser::parseValID(llvm::ValID&, llvm::LLParser::PerFunctionState*, llvm::Type*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3425:10
#11 0x000055ecbd08fa7f llvm::LLParser::parseGlobalValue(llvm::Type*, llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3780:17
#12 0x000055ecbd08bbec llvm::LLParser::parseGlobalTypeAndValue(llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3789:27
#13 0x000055ecbd08d7c0 llvm::LLParser::parseValID(llvm::ValID&, llvm::LLParser::PerFunctionState*, llvm::Type*) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3466:41
#14 0x000055ecbd08fa7f llvm::LLParser::parseGlobalValue(llvm::Type*, llvm::Constant*&) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:3780:17
#15 0x000055ecbd0878c3 llvm::LLParser::parseGlobal(std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>> const&, llvm::SMLoc, unsigned int, bool, unsigned int, unsigned int, bool, llvm::GlobalValue::ThreadLocalMode, llvm::GlobalValue::UnnamedAddr) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:1191:9
#16 0x000055ecbd083c78 llvm::LLParser::parseNamedGlobal() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:669:5
#17 0x000055ecbd0809bd llvm::LLParser::parseTopLevelEntities() /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:394:11
#18 0x000055ecbd0804f7 llvm::LLParser::Run(bool, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/LLParser.cpp:103:10
#19 0x000055ecbd07804f parseAssemblyInto(llvm::MemoryBufferRef, llvm::Module*, llvm::ModuleSummaryIndex*, llvm::SMDiagnostic&, llvm::SlotMapping*, bool, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:34:8
#20 0x000055ecbd077e4c llvm::parseAssemblyInto(llvm::MemoryBufferRef, llvm::Module*, llvm::ModuleSummaryIndex*, llvm::SMDiagnostic&, llvm::SlotMapping*, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:41:3
#21 0x000055ecbd07816d llvm::parseAssembly(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::SlotMapping*, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/AsmParser/Parser.cpp:52:7
#22 0x000055ecbde3e6d2 llvm::parseIR(llvm::MemoryBufferRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/IRReader/IRReader.cpp:88:10
#23 0x000055ecbde3e91a llvm::parseIRFile(llvm::StringRef, llvm::SMDiagnostic&, llvm::LLVMContext&, llvm::function_ref<llvm::Optional<std::__2::basic_string<char, std::__2::char_traits<char>, std::__2::allocator<char>>> (llvm::StringRef)>) /usr/local/google/home/phosek/llvm/llvm-project/llvm/lib/IRReader/IRReader.cpp:102:10
#24 0x000055ecbacf7ab0 main /usr/local/google/home/phosek/llvm/llvm-project/llvm/tools/opt/opt.cpp:604:9
#25 0x00007fdf5f3d681d __libc_start_main ./csu/../csu/libc-start.c:332:16
#26 0x000055ecbacbb919 _start (/usr/local/google/home/phosek/llvm/llvm-project/build/debug/bin/opt+0x4919919)
```

The issue seems to be that `dso_local_equivalent` parsing doesn't correctly handle forward references.

cc @PiJoules 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztWVtT6zYQ_jXJi4aM73Ye8pDDpaUDLQP0vHpkS07UI1uuJAPpr--uHHBiLod2gDOdwjC2Iq_29q20K6lQbLO4pt84sWthCL-jdSv5JFxOvKOJd_9MvP5fypu67zKq0yXPKyF5Q2tOJuERmQSB5cbOpITW7njGS0k1JzdKMDKJvKprykmQTYL5npTIK1VjrOPlWrSxRCQRaa22SsAPGARtwozKpSqpzPmfnbihoIO950uswjED73vdd0Vdo60t1YYbkKQ1L63cTIJDUnSWnJ19PQcuShpC5S3dAAltVCNAnviLk9NLQhtGWqC8oVrQQgKTSmhjkYFRRHdNI5rVnkPhh1bdak1AEdVaeJJWK9aV3Lyxr9_Ji6_D8Slf_6pu0TGiIrfgBr1B1uCiHU_QFRUNUU3vMdVZ8C0OAfoVt9DLSaWkVLfo1YoK2elnI7T_iYzDJRh60hkNT2cmvFdKrSC6g5O1qvHVrpXh35AAnd2_DgCYPyAgdnpFAc-lqS8wYpDf2VnfnJVtC4LCKAhRXgFBQ9wg0C5c3lP1v1y4faXy9Ahc5t6gX4J2XnB9Ap60QjVXlloAOFhi__Wm3bbnyH1pgBcSoet--tqPTjASDlUnGWmUhTiE0KR9TJtWNQxdtpKqoPIhWjFggtQ5krNZ77CLs-Pl1TExXVELCwyKbkU0b5W2CNfa2tbFaXCCThR23RWzUtXPOk4Y00FkByduqoimlB3jDshSU7MmBS2_WU1LvhUPZpffCOvq9gFXb0bc34VWK01rQvWqqyFCzVsAW3RCMngzDobib9HAE6KGHFz14kFE6BHvzoO_OOZlwZOQhozuwGs2pm9caJhVzoRrtAngHYg0vc2VsZrTeos20AKgbxubV12LWEHr90bcYYdYNVSaGbgelIgTDCDfH0zzx6ZFvCAjO3oePwOCEoM-w1nfR-OHKp-ECSo_6B6MdM9YljwFy2XX7Jlg-qXqvZS_17pfEnwPV4R40Doce5yWMRm7-AfERuSl--6NtoqmFaviKqn8wPNInsN6YpXmuXb544H7XZbkSXQgRdPdHayarv_QQrrjlM2MmnmT4It35wfA5SFPoJh4T0zIi6z0iabCcDIDJsYpCY2Z-7UxjLe4oHS9DdBx40SBWHi7cTMX6t6-Ncm-GBbHUUJogQubY2xZb4frchwyHx7pwCEdc4iCCvNS3iuVG77CdSmHBNr1ugOK0oFHWW1WJbVbzXASZgPj7CnGeSNzHJgzVWNWfJ7fPPVc6hkYzkcujYIoeAVYJcKUOJhCH4YM6RzWib01kHkZA8avS3ED0bbHrX7PDR3nwG0KHMgxGb7H6vNyWo_dVB7c4Y_cUdG0etkdP7nk-xWDY88pD_bsGnm4rdfch-RDbU0zN3PSwdZgZGtR8PI1tqJly4Y9NvmHWoeTL9ixLhwHdlp6_5_ATjCnRv7gjuh_FNjxyNY0K7-zpvW2gpmQL_ruPA_6RkGNKHOo8KDSnoSH5Zpqtw98RIhfcih6BZawPV14_DQplegUSLc7hOFxv5t7FG5X52eqxK6uwaTJWV9hHrrdyFP9z9ENLHeh7TF16fwMkTpXjH-H-vcGt6lsyZj-SKR9f46peyd5JSOgwzLNXgb6V1T8Ae2P1D5xNXo8KJ-OlPfmBXtZ-WvVnvEbLo8bK6zg71LvvjTT5tHOLgNNyMYmRFX6rAlQroPCj4Ox2q6eUIFWMB-GD7-12A0WhYc_clrizNxbAK-c0EvQFvftxx86BdyuY7dgme9DkCIG_ckXHifUhdycNlbt6X_Oa6U3X7qq4tpZsYsGTP9OPl7f--6rrq6pBo6M3z0iuTo_EnTVwGZYlI8XMansOW1bRKsf-BkI_ygQRvl98rDTwA3zqIhPUx7tVnL_hXD4DIN_HgYRpsNwCAN_vBb4CXsuDF4fAi8CiWfpUPtZfvdE4fIJ8huAHKOeQ3Eb7O_aeMgTFoxBPr38AHg_IRxBeHp5CUW0Q_C-ucUwy_azdhCOQZz79DGIJ0Ly5yz4hPBjIfS9YITh3o6allVKC4-4M703UsldUU7ctUX_vN9JeJj-h21QMDpqZUnmM5LnePQHMFFt84ejxtLgoeBsaCLRgSNyh45h6MxMBubJvplFMYeas2e7PXt8n5sad14ZgTD4_95lLyfuQooYzmuDF1oFXkZRixdpT92CuutZmGN4ecYUNyAytcNFMVm7A3tSKX1LNSMwO7jmTcnNbFduWeId6YX4RXV4RTzlCz9JwjjM4rk3ZYuQzcM5ncJWTfLFWysy7bRc_Ptruxhqg3i6XvhhRudBmMY8yljBEuDPwiwNPR6WSRX7U0kLLs1iEn-ZxEdTsQi8IPDmfgbP0PdmgZcyP4nLeF4xFoQZ-INDrMkZCp4pvZrqhdMBwDXwUQpjzfCRGndSwe_5086ulV603GoXNVOn8MJp-zdM5CJ7">