[llvm] [GlobalISel] LegalizationArtifactCombiner for merge-unmerge->unmerge where src and dst of result would be different scalar/vector types (PR #213086)

Madhur Kumar via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 4 02:20:37 PDT 2026


================
@@ -1016,14 +1017,22 @@ class LegalizationArtifactCombiner {
       // %AnotherDst:_(DstTy) = G_merge_like_opcode %2:_(EltTy), %3
       //
       // %Dst:_(DstTy), %AnotherDst = G_UNMERGE_VALUES %UnmergeSrc
-      if (((!DstTy.isVector() && !UnmergeSrcTy.isVector()) ||
-           (DstTy.isVector() && UnmergeSrcTy.isVector() &&
+      if ((!DstTy.isVector() ||
+           (UnmergeSrcTy.isVector() &&
             DstTy.getScalarType() == UnmergeSrcTy.getScalarType())) &&
           (Elt0UnmergeIdx % NumMIElts == 0) &&
+          (DstTy.getSizeInBits() < UnmergeSrcTy.getSizeInBits()) &&
           getCoverTy(UnmergeSrcTy, DstTy) == UnmergeSrcTy) {
         if (!isSequenceFromUnmerge(MI, 0, Unmerge, Elt0UnmergeIdx, NumMIElts,
                                    EltSize, false))
           return false;
+        if (!DstTy.isVector() && UnmergeSrcTy.isVector()) {
----------------
MadhurKumar004 wrote:

`lowerUnmergeValues` function bitcast the src to integer then calls `buildTrunc(Dst0Reg, SrcReg)`. If dst type is a vector buildtrunc asserts SrcTy is a vector. I dont actually know if this is the intentional for some reason or something to be improved upon.

https://github.com/llvm/llvm-project/pull/213086


More information about the llvm-commits mailing list