1. Apr 11, 2024
    • Mingming Liu's avatar
      [ThinLTO]Record import type in GlobalValueSummary::GVFlags (#87597) · dda73336
      Mingming Liu authored
      The motivating use case is to support import the function declaration
      across modules to construct call graph edges for indirect calls [1]
      when importing the function definition costs too much compile time
      (e.g., the function is too large has no `noinline` attribute).
      1. Currently, when the compiled IR module doesn't have a function
      definition but its postlink combined summary contains the function
      summary or a global alias summary with this function as aliasee, the
      function definition will be imported from source module by IRMover. The
      implementation is in FunctionImporter::importFunctions [2]
      2. In order for FunctionImporter to import a declaration of a function,
      both function summary and alias summary need to carry the def / decl
      state. Specifically, all existing summary fields doesn't differ across
      import modules, but the def / decl state of is decided by
      `<ImportModule, Function>`.
      
      This change encodes the def/decl state in `GlobalValueSummary::GVFlags`.
      
      In the subsequent changes
      1. The indexing step `computeImportForModule` [3]
      will compute the set of definitions and the set of declarations for each
      module, and passing on the information to bitcode writer.
      2. Bitcode writer will look up the def/decl state and sets the state
      when it writes out the flag value. This is demonstrated in
      https://github.com/llvm/llvm-project/pull/87600
      3. Function importer will read the def/decl state when reading the
      combined summary to figure out two sets of global values, and IRMover
      will be updated to import the declaration (aka linkGlobalValuePrototype [4])
      into the destination module.
      
      - The next change is https://github.com/llvm/llvm-project/pull/87600
      
      [1] mentioned in rfc https://discourse.llvm.org/t/rfc-for-better-call-graph-sort-build-a-more-complete-call-graph-by-adding-more-indirect-call-edges/74029#support-cross-module-function-declaration-import-5
      [2] https://github.com/llvm/llvm-project/blob/3b337242ee165554f0017b00671381ec5b1ba855/llvm/lib/Transforms/IPO/FunctionImport.cpp#L1608-L1764
      [3] https://github.com/llvm/llvm-project/blob/3b337242ee165554f0017b00671381ec5b1ba855/llvm/lib/Transforms/IPO/FunctionImport.cpp#L856
      [4] https://github.com/llvm/llvm-project/blob/3b337242ee165554f0017b00671381ec5b1ba855/llvm/lib/Linker/IRMover.cpp#L605
      dda73336
    • Craig Topper's avatar
    • Jianjian Guan's avatar
      [RISCV] Only support SPLAT_VECTOR for Zvfhmin when also enable the scalar... · fd501511
      Jianjian Guan authored
      [RISCV] Only support SPLAT_VECTOR for Zvfhmin when also enable the scalar extension of half fp (#88275)
      
      fd501511
    • Freddy Ye's avatar
    • Jordan Rupprecht's avatar
      [llvm][NFC] Suppress `-Wunused-result` call to `write` · 6b46166e
      Jordan Rupprecht authored
      Commit 87e6f87f adds a call to `::write()`, which may be annotated w/ `warn_unused_result`, leading to `-Wunused-result` failures.
      6b46166e
    • Owen Pan's avatar
      [clang-format] Don't merge a short block for SBS_Never (#88238) · 51f16814
      Owen Pan authored
      Also fix unit tests.
      
      Fixes #87484.
      51f16814
    • Bill Wendling's avatar
      [NFC][Clang] Improve const correctness for IdentifierInfo (#79365) · fca51911
      Bill Wendling authored
      The IdentifierInfo isn't typically modified. Use 'const' wherever
      possible.
      fca51911
    • Arthur Eubanks's avatar
      Revert "[Driver] Ensure ToolChain::LibraryPaths is not empty for non-Darwin" · be10070f
      Arthur Eubanks authored
      This reverts commit ccdebbae.
      
      Causes test failures in the presence of Android runtime libraries in resource-dir.
      See comments on https://github.com/llvm/llvm-project/pull/87866.
      be10070f
    • Arthur Eubanks's avatar
      [gn build] Port 0a131756 · 9786a3b4
      Arthur Eubanks authored
      9786a3b4
    • Arthur Eubanks's avatar
      [gn build] Port 5d7d6ad6 · 233edab8
      Arthur Eubanks authored
      233edab8
    • Arthur Eubanks's avatar
      [gn build] Port 59e66c51 · 40270666
      Arthur Eubanks authored
      40270666
    • Arthur Eubanks's avatar
      [gn build] Port 1fda1776 · 19e516fb
      Arthur Eubanks authored
      19e516fb
    • Jie Fu's avatar
      [clang] Fix -Wunused-function in CGStmtOpenMP.cpp (NFC) · 6ef44507
      Jie Fu authored
      llvm-project/clang/lib/CodeGen/CGStmtOpenMP.cpp:7959:13:
      error: unused function 'emitTargetTeamsLoopCodegenStatus' [-Werror,-Wunused-function]
      static void emitTargetTeamsLoopCodegenStatus(CodeGenFunction &CGF,
                  ^
      1 error generated.
      6ef44507
    • Vitaly Buka's avatar
      [UBSAN] Emit optimization remarks (#88304) · d927d186
      Vitaly Buka authored
      d927d186
    • Matthias Braun's avatar
      [WebAssembly] Remove threadlocal.address when disabling TLS (#88209) · acb7ddc5
      Matthias Braun authored
      Remove `llvm.threadlocal.address` intrinsic usage when disabling TLS.
      This fixes errors revealed by the stricter IR verification introduced in
      PR #87841.
      acb7ddc5
    • Daniel Chen's avatar
      [Flang] Define c_int_fast16_t and c_int_fast32_t for PowerPC. (#88292) · 8136ac1c
      Daniel Chen authored
      On Linux, PowerPC defines `int_fast16_t` and `int_fast32_t` as `long`.
      Need to update the corresponding type, `c_int_fast16_t` and
      `c_int_fast32_t` in `iso_c_binding` module so they are interoparable.
      8136ac1c
    • Oskar Wirga's avatar
      [MergeFuncs/CFI] Ensure all type metadata is propogated for CFI (#88218) · a9d4ddd9
      Oskar Wirga authored
      I noticed that we weren't propagating ALL type metadata that was
      attached to CFI functions:
      
      # BEFORE
      
      ```
      ; Function Attrs: minsize nounwind optsize ssp uwtable(sync)
      define internal void @foo(ptr nocapture noundef readonly %0) #0 !dbg !62311 !type !34028 !type !34029 !type !34030
      ... fn merging
      ; Function Attrs: minsize nounwind optsize ssp uwtable(sync)
      define internal void @foo(ptr nocapture noundef readonly %0) #0 !type !34028
      ```
      
      # AFTER
      
      ```
      ; Function Attrs: minsize nounwind optsize ssp uwtable(sync)
      define internal void @foo(ptr nocapture noundef readonly %0) #0 !dbg !62311 !type !34028 !type !34029 !type !34030
      ... fn merging
      ; Function Attrs: minsize nounwind optsize ssp uwtable(sync)
      define internal void @foo(ptr nocapture noundef readonly %0) #0 !type !type !34028 !type !34029 !type !34030
      ```
      
      This patch makes sure that the entire vector of metadata is copied over.
      a9d4ddd9
    • Craig Topper's avatar
      [APInt] Remove accumulator initialization from tcMultiply and tcFullMultiply. NFCI (#88202) · d8f1e5d2
      Craig Topper authored
      The tcMultiplyPart routine has a flag that says whether to add to the
      accumulator or overwrite it. By using the overwrite mode on the first
      iteration we don't need to initialize the accumulator to zero.
      
      Note, the initialization in tcFullMultiply was only initializing the
      first rhsParts of dst. tcMultiplyPart always overwrites the rhsParts+1
      part that just contains the last carry. The first write to each part of
      dst past rhsParts is a carry write so that's how the upper part of dst
      is initialized.
      d8f1e5d2
    • Chelsea Cassanova's avatar
      Revert "[lldb][sbdebugger] Move SBDebugger Broadcast bit enum into lldb-enumerations.h" (#88324) · 9f6d08f2
      Chelsea Cassanova authored
      Reverts llvm/llvm-project#87409 due a missed update to the broadcast bit
      causing a build failure on the x86_64 Debian buildbot.
      9f6d08f2
    • Stanislav Mekhanoshin's avatar
      [AMDGPU] Add v2i32 to the VS_64 types. NFCI. (#88318) · 2fdfea08
      Stanislav Mekhanoshin authored
      I am trying to use VOP3Inst with intrinsic taking v2i32 operand and it
      fails to create patterm without it.
      2fdfea08
    • Chelsea Cassanova's avatar
      [lldb][sbdebugger] Move SBDebugger Broadcast bit enum into lldb-enumerations.h (#87409) · af7c196f
      Chelsea Cassanova authored
      When the `eBroadcastBitProgressCategory` bit was originally added to
      Debugger.h and SBDebugger.h, each corresponding bit was added in order
      of the other bits that were previously there. Since `Debugger.h` has an
      enum bit that `SBDebugger.h` does not, this meant that their offsets did
      not match.
      
      Instead of trying to keep the bit offsets in sync between the two, it's
      preferable to just move SBDebugger's enum into the main enumerations
      header and use the bits from there. This also requires that API tests using the bits from SBDebugger update their usage.
      af7c196f
    • Jeff Niu's avatar
      [mlir] Slightly optimize bytecode op numbering (#88310) · fb771fe3
      Jeff Niu authored
      If the bytecode encoding supports properties, then the dictionary
      attribute is always the raw dictionary attribute of the operation,
      regardless of what it contains. Otherwise, get the dictionary attribute
      from the op: if the op does not have properties, then it returns the raw
      dictionary, otherwise it returns the combined inherent and discardable
      attributes.
      fb771fe3
    • Nick Desaulniers's avatar
      [libc] fix typo in hdr/CMakeLists · 8cfa72ad
      Nick Desaulniers authored
      Fixes #87896
      8cfa72ad
    • Fangrui Song's avatar
      [ELF] Move createSyntheticSections from Writer.cpp to SyntheticSections.cpp. NFC · c258f573
      Fangrui Song authored
      SyntheticSections.cpp is more appropriate. This change enables
      elimination of many explicit template instantiations.
      
      Due to `make<SymbolTableSection<ELFT>>(*strtab)` in Arch/ARM.cpp,
      we do not remove explicit template instantiations for SymbolTableSection.
      c258f573
    • Farzon Lotfi's avatar
      [Spirv][HLSL] Add OpAll lowering and float vec support (#87952) · 05093e24
      Farzon Lotfi authored
      The main point of this change was to add support for HLSL's all
      intrinsic.
      In the process of doing that I found a few issues around creating an
      `OpConstantComposite` via `buildZerosVal`.
      
      First the current code didn't support floats so the process of adding
      `buildZerosValF` meant I needed a
      float version of `getOrCreateIntConstVector`. After doing so I renamed
      both versions to `getOrCreateConstVector`. That meant I needed to create
      a float type version of `getOrCreateIntCompositeOrNull`. Luckily the
      type information was low for this function so was able to split it out
      into a helpwe and rename `getOrCreateIntCompositeOrNull` to
      `getOrCreateCompositeOrNull` With the exception of type handling
      differences of the code and Null vs 0 Constant Op codes these functions
      should be identical.
      
      To handle scalar floats I could not use `buildConstantFP` like this PR
      did:
      https://github.com/llvm/llvm-project/commit/0a2aaab5aba46#diff-733a189c5a8c3211f3a04fd6e719952a3fa231eadd8a7f11e6ecf1e584d57411R1603
      because that would create too many superfluous registers (that causes
      problems in the validator), I had to create a float version of
      `getOrCreateConstInt` which I called `getOrCreateConstFP`.
      similar problems with doing it like this:
      https://github.com/llvm/llvm-project/blob/main/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp#L1540.
      
      `buildZerosValF` also has a use of a function `getZeroFP`. This is
      because half, float, and double scalar values of 0 would collide in
      `SPIRVDuplicatesTracker<Constant> CT` if you use `APFloat(0.0f)`.
      
      `getORCreateConstFP` needed its own version of `getOrCreateConstIntReg`
      which I called `getOrCreateConstFloatReg` The one difference in this
      function is `getOrCreateConstFloatReg` returns a bit width so we don't
      have to call `getScalarOrVectorBitWidth` twice ie when it is used again
      in `getOrCreateConstFP` for `OpConstantF` `addNumImm`.
      
      `getOrCreateConstFloatReg` needed an `assignFloatTypeToVReg` helper
      which called a `getOrCreateSPIRVFloatType` helper. There was no
      equivalent IntegerType::get for floats so I handled this with a switch
      statement on bit widths to get the right LLVM float type.
      
      Finally, there is the use of `bool ZeroAsNull = STI.isOpenCLEnv();` This
      is partly a cosmetic change. When Zeros are treated as nulls, we don't
      create `OpConstantComposite` vectors which is something we do in the
      DXCs SPIRV backend. The DXC SPIRV backend also does not use
      `OpConstantNull`. Finally, I needed a means to test the behavior of the
      OpConstantNull and `OpConstantComposite` changes and this was one way I
      could do that via the same tests.
      05093e24
    • Christopher Di Bella's avatar
      [Flang] responds to Clang Tidy feedback (#87847) · d347235b
      Christopher Di Bella authored
      Line 267: performance-unnecessary-copy-initialization
      Line 592: readability-container-size-empty
      d347235b
    • David Pagan's avatar
      [OpenMP][CodeGen] Improved codegen for combined loop directives (#87278) · a1283664
      David Pagan authored
      IR for 'target teams loop' is now dependent on suitability of associated
      loop-nest.
      
      If a loop-nest:
      
      - does not contain a function call, or
      - the -fopenmp-assume-no-nested-parallelism has been specified,
      - or the call is to an OpenMP API AND
      - does not contain nested loop bind(parallel) directives
      
      then it can be emitted as 'target teams distribute parallel for', which
      is the current default. Otherwise, it is emitted as 'target teams
      distribute'.
      
      Added debug output indicating how 'target teams loop' was emitted. Flag
      is -mllvm -debug-only=target-teams-loop-codegen
      
      Added LIT tests explicitly verifying 'target teams loop' emitted as a
      parallel loop and a distribute loop.
      
      Updated other 'loop' related tests as needed to reflect change in IR.
      - These updates account for most of the changed files and
      additions/deletions.
      a1283664
    • Xing Xue's avatar
      [OpenMP][AIX] Fix test config for AIX (#88272) · b3792ae4
      Xing Xue authored
      This patch fixes the test config so that it works for
      `tasking/omp50_taskdep_depobj.c` which uses different flags to test with
      compiler's `omp.h`.
      * set test environment variable `OBJECT_MODE` to `64` if it is set
      explicitly to `64` in the AIX environment. `OBJECT_MODE` is default to
      `32` and is recognized by AIX compilers and toolchain. In this way, we
      don't need to set `-m64` for all compiler flags for 64-bit mode
      * add option `-Wl,-bmaxdata` to 32-bit `test_openmp_flags` used by
      `tasking/omp50_taskdep_depobj.c`
      b3792ae4
    • erichkeane's avatar
      [NFC] Remove a pair of incorrect comments from ParseOpenACC · a6d1366b
      erichkeane authored
      We attempt to continue parsing, but the comment says the opposite.  Just
      remove the inaccurate comments in this patch.
      a6d1366b
    • martinboehme's avatar
      Revert "[clang][dataflow] Propagate locations from result objects to initializers." (#88315) · 7549b458
      martinboehme authored
      Reverts llvm/llvm-project#87320
      
      This is causing buildbots to fail because
      `isOriginalRecordConstructor()` is now unused.
      7549b458
    • shamithoke's avatar
      Perform bitreverse using AVX512 GFNI for i32 and i64. (#81764) · e3ef4612
      shamithoke authored
      
      
      Currently, the lowering operation for bitreverse using Intel AVX512 GFNI only supports byte vectors
      
      Extend the operation to i32 and i64.
      
      ---------
      
      Co-authored-by: default avatarshami <shami_thoke@yahoo.com>
      e3ef4612
    • Fangrui Song's avatar
    • Joseph Huber's avatar
      [libc] Add note to use `LIBC_GPU_BUILD=ON` as another form · fad14707
      Joseph Huber authored
      Summary:
      This is a shorthand to enable GPU support so it should be listed in the
      docs.
      fad14707
    • Joseph Huber's avatar
      [Libomptarget] Add RPC-based printf implementation for OpenMP #85638 · f81879c0
      Joseph Huber authored
      Summary:
      Relanding after reverting, only applies to AMDGPU for now.
      
      This patch adds an implementation of printf that's provided by the GPU
      C library runtime. This pritnf currently implemented using the same
      wrapper handling that OpenMP sets up. This will be removed once we have
      proper varargs support.
      
      This printf differs from the one CUDA offers in that it is synchronous
      and uses a finite size. Additionally we support pretty much every
      format specifier except the %n option.
      
      Depends on #85331
      f81879c0
    • Mark de Wever's avatar
      [libc++] Adds a global private constructor tag. (#87920) · 0a131756
      Mark de Wever authored
      This removes the similar tags used in the chrono tzdb implementation.
      
      Fixes: https://github.com/llvm/llvm-project/issues/85432
      0a131756
    • Alexey Bataev's avatar
      [SLP]Buildvector for alternate instructions with non-profitable gather operands. · 2b00a73f
      Alexey Bataev authored
      If the operands of the potentially alternate node are going to produce
      buildvector sequences, which result in more instructions, than the
      original code, then suhinstructions should be vectorized as alternate
      node, better to end up with the buildvector node.
      
      Left column - experimental, Right - reference.
      
      Metric: size..text
      
      Program                                                                                                                                                size..text
                                                                                                                                                             results     results0    diff
                                                                                            test-suite :: SingleSource/Benchmarks/Adobe-C++/loop_unroll.test   413680.00   416272.00  0.6%
                                                                                    test-suite :: External/SPEC/CFP2017rate/526.blender_r/526.blender_r.test 12351788.00 12354844.00  0.0%
                                                                                        test-suite :: External/SPEC/CINT2017speed/625.x264_s/625.x264_s.test   664901.00   664949.00  0.0%
                                                                                         test-suite :: External/SPEC/CINT2017rate/525.x264_r/525.x264_r.test   664901.00   664949.00  0.0%
                                                                                      test-suite :: External/SPEC/CFP2017rate/511.povray_r/511.povray_r.test  1171371.00  1171355.00 -0.0%
                                                                                               test-suite :: MultiSource/Benchmarks/7zip/7zip-benchmark.test  1036396.00  1036284.00 -0.0%
                                                                               test-suite :: MultiSource/Benchmarks/MiBench/consumer-jpeg/consumer-jpeg.test   111280.00   111248.00 -0.0%
                                                                                    test-suite :: External/SPEC/CFP2017rate/538.imagick_r/538.imagick_r.test  1392113.00  1391361.00 -0.1%
                                                                                   test-suite :: External/SPEC/CFP2017speed/638.imagick_s/638.imagick_s.test  1392113.00  1391361.00 -0.1%
                                                                              test-suite :: MultiSource/Benchmarks/Prolangs-C/TimberWolfMC/timberwolfmc.test   281676.00   281452.00 -0.1%
                                                                                          test-suite :: MultiSource/Benchmarks/VersaBench/ecbdes/ecbdes.test     3025.00     3019.00 -0.2%
                                                                                      test-suite :: MultiSource/Benchmarks/Prolangs-C/plot2fig/plot2fig.test     6351.00     6335.00 -0.3%
      
      Metric: SLP.NumVectorInstructions
      
      Program                                                                                                                                                SLP.NumVectorInstructions
                                                                                                                                                             results                   results0 diff
                                                                                          test-suite :: MultiSource/Benchmarks/VersaBench/ecbdes/ecbdes.test    15.00                     16.00   6.7%
                                                                                         test-suite :: External/SPEC/CINT2017rate/525.x264_r/525.x264_r.test  1703.00                   1707.00   0.2%
                                                                                        test-suite :: External/SPEC/CINT2017speed/625.x264_s/625.x264_s.test  1703.00                   1707.00   0.2%
                                                                                    test-suite :: External/SPEC/CFP2017rate/526.blender_r/526.blender_r.test 26241.00                  26239.00  -0.0%
                                                                                      test-suite :: External/SPEC/CFP2017rate/510.parest_r/510.parest_r.test 11761.00                  11754.00  -0.1%
                                                                              test-suite :: MultiSource/Benchmarks/Prolangs-C/TimberWolfMC/timberwolfmc.test   824.00                    822.00  -0.2%
                                                                                   test-suite :: External/SPEC/CFP2017speed/638.imagick_s/638.imagick_s.test  5668.00                   5654.00  -0.2%
                                                                                    test-suite :: External/SPEC/CFP2017rate/538.imagick_r/538.imagick_r.test  5668.00                   5654.00  -0.2%
                                                                                           test-suite :: External/SPEC/CINT2017rate/502.gcc_r/502.gcc_r.test   792.00                    790.00  -0.3%
                                                                                          test-suite :: External/SPEC/CINT2017speed/602.gcc_s/602.gcc_s.test   792.00                    790.00  -0.3%
                                                                                             test-suite :: MultiSource/Benchmarks/FreeBench/pifft/pifft.test  1389.00                   1384.00  -0.4%
                                                                                               test-suite :: MultiSource/Benchmarks/7zip/7zip-benchmark.test   596.00                    590.00  -1.0%
                                                                                      test-suite :: MultiSource/Benchmarks/Prolangs-C/plot2fig/plot2fig.test     6.00                      5.00 -16.7%
      
      Metric: exec_time
      
      Program                                                                                                                                                exec_time
                                                                                                                                                             results   results0  diff
                                                                                     test-suite :: External/SPEC/CFP2017rate/526.blender_r/526.blender_r.test     99.14    100.00    0.9%
      
      Other changes are not significant (less than 0.1% percent with exectime
      less 5 secs).
      
      SingleSource/Benchmarks/Adobe-C++/loop_unroll - same small patterns
      remain scalar, smaller code.
      External/SPEC/CFP2017rate/526.blender_r/526.blender_r - many small
      changes, some extra stores gets vectorized.
      External/SPEC/CINT2017speed/625.x264_s/625.x264_s
      External/SPEC/CINT2017rate/525.x264_r/525.x264_r
      x264 has one change in a loop body, in function ssim_end4, some code
      remain scalar, resulting in less code size.
      External/SPEC/CFP2017rate/511.povray_r/511.povray_r - some extra code
      gets vectorized, looks like some other patterns were matched.
      MultiSource/Benchmarks/7zip/7zip-benchmark - extra stores were
      vectorized (looks like the graphs become profitable)
      MultiSource/Benchmarks/MiBench/consumer-jpeg/consumer-jpeg - small
      changes in vectorized code (some small part remain scalar).
      External/SPEC/CFP2017rate/538.imagick_r/538.imagick_r
      External/SPEC/CFP2017speed/638.imagick_s/638.imagick_s
      Many changes cause by the fact that the code of one function becomes
      smaller (onvertLCHabToRGB) and this functions gets inlined after that.
      MultiSource/Benchmarks/Prolangs-C/TimberWolfMC/timberwolfmc - some small
      changes here and there, some extra code is vectorized, some remain
      scalar (2 x vectors)
      MultiSource/Benchmarks/VersaBench/ecbdes/ecbdes - emits 2 scalars
      + 2 insertelems instead of insert, broadcast, alt code (3 instructions,
        total 5 insts)
      MultiSource/Benchmarks/Prolangs-C/plot2fig/plot2fig - small graph
      becomes profitable and gets vectorized.
      External/SPEC/CINT2017rate/502.gcc_r/502.gcc_r
      External/SPEC/CINT2017speed/602.gcc_s/602.gcc_s
      Some small graph becomes profitable and gets vectorized.
      MultiSource/Benchmarks/FreeBench/pifft/pifft - no changes in final code.
      
      Reviewers: RKSimon, dtcxzyw
      
      Reviewed By: RKSimon
      
      Pull Request: https://github.com/llvm/llvm-project/pull/84978
      2b00a73f
    • Noah Goldstein's avatar
      [ValueTracking] Add support for `xor`/`disjoint or` in `isKnownNonZero` · 81cdd35c
      Noah Goldstein authored
      Handles cases like `X ^ Y == X` / `X disjoint| Y == X`.
      
      Both of these cases have identical logic to the existing `add` case,
      so just converting the `add` code to a more general helper.
      
      Proofs: https://alive2.llvm.org/ce/z/Htm7pe
      
      Closes #87706
      81cdd35c
    • Noah Goldstein's avatar
    • Noah Goldstein's avatar
      [ValueTracking] Add support for `xor`/`disjoint or` in `getInvertibleOperands` · 0c57a2e4
      Noah Goldstein authored
      This strengthens our `isKnownNonEqual` logic with some fairly
      trivial cases.
      
      Proofs: https://alive2.llvm.org/ce/z/4pxRTj
      
      Closes #87705
      0c57a2e4
    • Noah Goldstein's avatar