From a035d19b50b4569fb6504e4762037b6e96287876 Mon Sep 17 00:00:00 2001 From: Ahmed Bougacha Date: Thu, 23 Oct 2014 22:49:25 +0000 Subject: [PATCH] [SelectionDAG] Teach the vector scalarizer about FP conversions. This adds support for legalization of instructions of the form: [fp_conv] <1 x i1> %op to <1 x double> where fp_conv is one of fpto[us]i, [us]itofp. This used to assert because they were simply missing from the vector operand scalarizer. A similar problem arose in r190830, with trunc instead. Fixes PR20778. Differential Revision: http://reviews.llvm.org/D5810 llvm-svn: 220533 --- .../SelectionDAG/LegalizeVectorTypes.cpp | 4 ++ .../AArch64/fpconv-vector-op-scalarize.ll | 44 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/CodeGen/AArch64/fpconv-vector-op-scalarize.ll diff --git a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp index 546cac6a350..68187dd0b8c 100644 --- a/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp +++ b/lib/CodeGen/SelectionDAG/LegalizeVectorTypes.cpp @@ -411,6 +411,10 @@ bool DAGTypeLegalizer::ScalarizeVectorOperand(SDNode *N, unsigned OpNo) { case ISD::ZERO_EXTEND: case ISD::SIGN_EXTEND: case ISD::TRUNCATE: + case ISD::FP_TO_SINT: + case ISD::FP_TO_UINT: + case ISD::SINT_TO_FP: + case ISD::UINT_TO_FP: Res = ScalarizeVecOp_UnaryOp(N); break; case ISD::CONCAT_VECTORS: diff --git a/test/CodeGen/AArch64/fpconv-vector-op-scalarize.ll b/test/CodeGen/AArch64/fpconv-vector-op-scalarize.ll new file mode 100644 index 00000000000..b91e1e20f60 --- /dev/null +++ b/test/CodeGen/AArch64/fpconv-vector-op-scalarize.ll @@ -0,0 +1,44 @@ +; RUN: llc < %s -mtriple=arm64-apple-darwin | FileCheck %s + +; PR20778 +; Check that the legalizer doesn't crash when scalarizing FP conversion +; instructions' operands. The operands are all illegal on AArch64, +; ensuring they are legalized. The results are all legal. + +define <1 x double> @test_sitofp(<1 x i1> %in) { +; CHECK-LABEL: test_sitofp: +; CHECK: sbfx w8, w0, #0, #1 +; CHECK-NEXT: scvtf d0, w8 +; CHECK-NEXT: ret +entry: + %0 = sitofp <1 x i1> %in to <1 x double> + ret <1 x double> %0 +} + +define <1 x double> @test_uitofp(<1 x i1> %in) { +; CHECK-LABEL: test_uitofp: +; CHECK: and w8, w0, #0x1 +; CHECK-NEXT: ucvtf d0, w8 +; CHECK-NEXT: ret +entry: + %0 = uitofp <1 x i1> %in to <1 x double> + ret <1 x double> %0 +} + +define <1 x i64> @test_fptosi(<1 x fp128> %in) { +; CHECK-LABEL: test_fptosi: +; CHECK: bl ___fixtfdi +; CHECK-NEXT: fmov d0, x0 +entry: + %0 = fptosi <1 x fp128> %in to <1 x i64> + ret <1 x i64> %0 +} + +define <1 x i64> @test_fptoui(<1 x fp128> %in) { +; CHECK-LABEL: test_fptoui: +; CHECK: bl ___fixunstfdi +; CHECK-NEXT: fmov d0, x0 +entry: + %0 = fptoui <1 x fp128> %in to <1 x i64> + ret <1 x i64> %0 +}