Allow AArch64FastISel to degrade graceully in the presence of an MVT::i128
authorLouis Gerbarg <lgg@apple.com>
Mon, 7 Jul 2014 21:37:51 +0000 (21:37 +0000)
committerLouis Gerbarg <lgg@apple.com>
Mon, 7 Jul 2014 21:37:51 +0000 (21:37 +0000)
Currently AArch64FastISel crashes if it tries to extend an integer into an
MVT::i128. This can happen by creating 128 bit integers like so:

  typedef unsigned int uint128_t __attribute__((mode(TI)));
  typedef int sint128_t __attribute__((mode(TI)));

This patch makes EmitIntExt check for their presence and then falls back to
SelectionDAG.

Tests included.

rdar://17516686

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212492 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/AArch64/AArch64FastISel.cpp
test/CodeGen/AArch64/i128-fast-isel-fallback.ll [new file with mode: 0644]

index cc2a70ee8a2e15e7530e436974312747e2c9d2eb..d822c1bf327ba0bc71a08ce64c9c3a7f6d185c81 100644 (file)
@@ -1750,6 +1750,12 @@ unsigned AArch64FastISel::Emiti1Ext(unsigned SrcReg, MVT DestVT, bool isZExt) {
 unsigned AArch64FastISel::EmitIntExt(MVT SrcVT, unsigned SrcReg, MVT DestVT,
                                      bool isZExt) {
   assert(DestVT != MVT::i1 && "ZeroExt/SignExt an i1?");
+
+  // FastISel does not have plumbing to deal with an MVT::i128, if we see one
+  // so rather than return one we need to bail out to SelectionDAG.
+  if (DestVT == MVT::i128)
+    return 0;
+
   unsigned Opc;
   unsigned Imm = 0;
 
diff --git a/test/CodeGen/AArch64/i128-fast-isel-fallback.ll b/test/CodeGen/AArch64/i128-fast-isel-fallback.ll
new file mode 100644 (file)
index 0000000..1cffbf3
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llc -O0 -mtriple=arm64-apple-ios7.0 -mcpu=generic < %s | FileCheck %s
+
+; Function Attrs: nounwind ssp
+define void @test1() {
+  %1 = sext i32 0 to i128
+  call void  @test2(i128 %1)
+  ret void
+
+; The i128 is 0 so the we can test to make sure it is propogated into the x
+; registers that make up the i128 pair
+
+; CHECK:  mov  x0, xzr
+; CHECK:  mov  x1, x0
+; CHECK:  bl  _test2
+
+}
+
+declare void @test2(i128)