Allow AArch64FastISel to degrade graceully in the presence of an MVT::i128

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
This commit is contained in:
Louis Gerbarg 2014-07-07 21:37:51 +00:00
parent 80c193dec7
commit e7f8191b18
2 changed files with 24 additions and 0 deletions

View 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;

View File

@ -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)