[AArch64][GlobalISel] Fix an assertion during G_UNMERGE selection for s128 types.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@369172 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/AArch64/AArch64InstructionSelector.cpp b/lib/Target/AArch64/AArch64InstructionSelector.cpp
index 0c808bc..bab15dd 100644
--- a/lib/Target/AArch64/AArch64InstructionSelector.cpp
+++ b/lib/Target/AArch64/AArch64InstructionSelector.cpp
@@ -2963,7 +2963,9 @@
   const LLT NarrowTy = MRI.getType(I.getOperand(0).getReg());
   const LLT WideTy = MRI.getType(SrcReg);
   (void)WideTy;
-  assert(WideTy.isVector() && "can only unmerge from vector types!");
+  assert(WideTy.isVector() ||
+         WideTy.getSizeInBits() == 128 &&
+             "can only unmerge from vector or s128 types!");
   assert(WideTy.getSizeInBits() > NarrowTy.getSizeInBits() &&
          "source register size too small!");
 
diff --git a/test/CodeGen/AArch64/GlobalISel/select-unmerge.mir b/test/CodeGen/AArch64/GlobalISel/select-unmerge.mir
index fdc5f12..5162fa2 100644
--- a/test/CodeGen/AArch64/GlobalISel/select-unmerge.mir
+++ b/test/CodeGen/AArch64/GlobalISel/select-unmerge.mir
@@ -27,6 +27,8 @@
     ret <2 x half> undef
   }
 
+  define void @test_s128(i128 %p) { ret void }
+
 ...
 ---
 name:            test_v2s64_unmerge
@@ -208,3 +210,18 @@
     $s1 = COPY %2(<2 x s16>)
     RET_ReallyLR implicit $s0
 ...
+---
+name:            test_s128
+alignment:       2
+legalized:       true
+regBankSelected: true
+tracksRegLiveness: true
+body:             |
+  bb.1:
+    liveins: $q0
+    %0:fpr(s128) = COPY $q0
+    %1:fpr(s64), %2:fpr(s64) = G_UNMERGE_VALUES %0(s128)
+    $d0 = COPY %1(s64)
+    $d1 = COPY %2(s64)
+    RET_ReallyLR implicit $d0, implicit $d1
+...