[llvm] r212492 - Allow AArch64FastISel to degrade graceully in the presence of an MVT::i128

Eric Christopher echristo at gmail.com
Mon Jul 7 15:31:54 PDT 2014


Maybe just check that DestVT is legal? (is integer > 64 legal on
aarch64? if so, we should handle this a bit differently.)

-eric

On Mon, Jul 7, 2014 at 2:37 PM, Louis Gerbarg <lgg at apple.com> wrote:
> Author: louis
> Date: Mon Jul  7 16:37:51 2014
> New Revision: 212492
>
> URL: http://llvm.org/viewvc/llvm-project?rev=212492&view=rev
> Log:
> 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
>
> Added:
>     llvm/trunk/test/CodeGen/AArch64/i128-fast-isel-fallback.ll
> Modified:
>     llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
>
> Modified: llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp?rev=212492&r1=212491&r2=212492&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp (original)
> +++ llvm/trunk/lib/Target/AArch64/AArch64FastISel.cpp Mon Jul  7 16:37:51 2014
> @@ -1750,6 +1750,12 @@ unsigned AArch64FastISel::Emiti1Ext(unsi
>  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;
>
>
> Added: llvm/trunk/test/CodeGen/AArch64/i128-fast-isel-fallback.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/AArch64/i128-fast-isel-fallback.ll?rev=212492&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/AArch64/i128-fast-isel-fallback.ll (added)
> +++ llvm/trunk/test/CodeGen/AArch64/i128-fast-isel-fallback.ll Mon Jul  7 16:37:51 2014
> @@ -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)
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list