[WebAssembly][GlobalISel] Implement integer comparisons and `G_SELECT` (#197257)
Adds legalization and tests for various integer comparison operations
(namely `G_ICMP` is legal, but also enable `lower` for some other ones),
as well as `G_SELECT`.
Split from #157161
[WebAssembly][GlobalISel] Implement `COPY` (#197256)
Adds instruction select handling and tests for `COPY`. While `COPY` gets
dissolved in the end, these changes are required to keep the selector
from crashing when trying to assign a regclass to its operands.
Split from #157161
[WebAssembly][GlobalISel] Implement conversion/cast ops between integer and floating-point (#197255)
Adds legalization and tests for operations converting between int and
float (`G_BITCAST`, `G_FPTOSI`, `G_FPTOUI`, `G_SITOFP` and `G_UITOFP`).
Saturating float => int ops will be finished later once comparison
operators are in place (which for this, `G_SELECT`, `G_FCMP`, `G_UMIN`,
and `G_SMIN` are needed at least).
Split from #157161
[WebAssembly] Define `__funcref_call_table` in generated asm and objects (#180900)
Currently, calls into funcref (`call addrspace(20)`) are lowered into a
store of the ref into a special single-element `__funcref_call_table`, a
call_indirect into said table, then a store of null into it.
It functions just fine when `-filetype=asm` (default), but when emitting
an object file directly from llc it fails with `LLVM ERROR: undefined
table symbol cannot be weak`
This fixes said error by "defining" it during `WebAssemblyAsmPrinter`,
and ensuring it is definitely emitted as weak (so duplicate tables in
multiple objects are merged into a single one).
[CodeGen] Avoid ambiguous Register comparison in C++20; NFC (#205814)
Fix an "ambiguous overload for ‘operator==’" error when compiling with
`-std=c++20`, caused by C++20's rewritten operator== candidate rules.
[VectorCombine] Bail out on all-poison leaves in shuffle transform (#206503)
foldShufflesOfLengthChangingShuffles() skips undef sources when
determining Y, so if all the leaves are undef, we can end up with Y
being nullptr after the loop. Bail out in this degenerate case.