[llvm-commits] [PATCH] ARM: Custom lower v2f32 = fp_round to fix crash with NEON
David Peixotto
dpeixott at codeaurora.org
Wed Nov 14 17:47:23 PST 2012
Hi Pete,
Thanks for fixing this bug! I have a few minor comments on the patch below.
Index: lib/Target/ARM/ARMISelLowering.cpp
===================================================================
--- lib/Target/ARM/ARMISelLowering.cpp (revision 167913)
+++ lib/Target/ARM/ARMISelLowering.cpp (working copy)
+SDValue ARMTargetLowering::LowerFP_ROUND(SDValue Op, SelectionDAG &DAG)
const {
+ assert(Op.getValueType() == MVT::v2f32 &&
+ "FP_ROUND custom lowering should only occur for v2f32.");
+
+ DebugLoc DL = Op.getDebugLoc();
+ SmallVector<SDValue, 2> Vals;
I think a fixed size array would work fine here. It is preferred over
SmallVector in the llvm programmers manual:
http://llvm.org/docs/ProgrammersManual.html#ds_sequential
+ for(unsigned i = 0; i < 2; i++) {
+ SDValue Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, MVT::f64,
+ Op.getOperand(0), DAG.getConstant(i,
MVT::i32));
+ Vals.push_back(DAG.getNode(ISD::FP_ROUND, DL, MVT::f32,
+ Val, DAG.getIntPtrConstant(0)));
+ }
+ EVT VecVT = EVT::getVectorVT(*DAG.getContext(), MVT::f32, 2);
+ return DAG.getNode(ISD::BUILD_VECTOR, DL, VecVT, &Vals[0], 2);
+}
+
Index: test/CodeGen/ARM/neon_fpconv.ll
===================================================================
--- test/CodeGen/ARM/neon_fpconv.ll (revision 0)
+++ test/CodeGen/ARM/neon_fpconv.ll (revision 0)
@@ -0,0 +1,9 @@
+; RUN: llc < %s -march=arm -mattr=+neon | FileCheck %s
Please add a comment that this test is for PR12540.
+
+define <2 x float> @vtrunc(<2 x double> %a) {
+; CHECK: vcvt.f32.f64 [[S0:s[0-9]+]], [[D0:d[0-9]+]]
+; CHECK: vcvt.f32.f64 [[S1:s[0-9]+]], [[D1:d[0-9]+]]
+ %vt = fptrunc <2 x double> %a to <2 x float>
+ ret <2 x float> %vt
+}
+
Thanks,
David
-- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
by The Linux Foundation
From: llvm-commits-bounces at cs.uiuc.edu
[mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Pete Couperus
Sent: Tuesday, November 13, 2012 11:24 PM
To: llvm-commits at cs.uiuc.edu
Subject: [llvm-commits] [PATCH] ARM: Custom lower v2f32 = fp_round to fix
crash with NEON
Hello,
Lowering "fptrunc <2 x double> %a to <2 x float>" is broken on ARM with
NEON.
This patch custom lowers this conversion using two single element vcvt's.
This fixes the following PRs.
http://llvm.org/bugs/show_bug.cgi?id=12540
http://llvm.org/bugs/show_bug.cgi?id=13964
Please review!
Thanks.
Pete
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20121114/a3c6f181/attachment.html>
More information about the llvm-commits
mailing list