From e2b375192478d8f6b20678bf79c27763a8e861b3 Mon Sep 17 00:00:00 2001 From: Hal Finkel Date: Mon, 31 Mar 2014 17:48:16 +0000 Subject: [PATCH] [PowerPC] Don't ever expand BUILD_VECTOR of v2i64 with shuffles If we have two unique values for a v2i64 build vector, this will always result in two vector loads if we expand using shuffles. Only one is necessary. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@205231 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCISelLowering.cpp | 9 +++++++++ lib/Target/PowerPC/PPCISelLowering.h | 5 +++++ test/CodeGen/PowerPC/vsx.ll | 11 ++++++----- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/lib/Target/PowerPC/PPCISelLowering.cpp b/lib/Target/PowerPC/PPCISelLowering.cpp index 9015a3c5216..32ac1dce906 100644 --- a/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/lib/Target/PowerPC/PPCISelLowering.cpp @@ -8845,6 +8845,15 @@ bool PPCTargetLowering::isFMAFasterThanFMulAndFAdd(EVT VT) const { return false; } +bool +PPCTargetLowering::shouldExpandBuildVectorWithShuffles( + EVT VT , unsigned DefinedValues) const { + if (VT == MVT::v2i64) + return false; + + return TargetLowering::shouldExpandBuildVectorWithShuffles(VT, DefinedValues); +} + Sched::Preference PPCTargetLowering::getSchedulingPreference(SDNode *N) const { if (DisableILPPref || PPCSubTarget.enableMachineScheduler()) return TargetLowering::getSchedulingPreference(N); diff --git a/lib/Target/PowerPC/PPCISelLowering.h b/lib/Target/PowerPC/PPCISelLowering.h index 9461e46198c..da6d4dcc3a3 100644 --- a/lib/Target/PowerPC/PPCISelLowering.h +++ b/lib/Target/PowerPC/PPCISelLowering.h @@ -477,6 +477,11 @@ namespace llvm { /// expanded to fmul + fadd. virtual bool isFMAFasterThanFMulAndFAdd(EVT VT) const; + // Should we expand the build vector with shuffles? + virtual bool + shouldExpandBuildVectorWithShuffles(EVT VT, + unsigned DefinedValues) const; + /// createFastISel - This method returns a target-specific FastISel object, /// or null if the target does not support "fast" instruction selection. virtual FastISel *createFastISel(FunctionLoweringInfo &FuncInfo, diff --git a/test/CodeGen/PowerPC/vsx.ll b/test/CodeGen/PowerPC/vsx.ll index a1710938ab5..9c37fe6d40d 100644 --- a/test/CodeGen/PowerPC/vsx.ll +++ b/test/CodeGen/PowerPC/vsx.ll @@ -631,12 +631,13 @@ define <2 x i32> @test80(i32 %v) { ret <2 x i32> %i ; CHECK-LABEL: @test80 -; CHECK: addi -; CHECK: addi -; CHECK: lxvd2x +; CHECK-DAG: addi [[R1:[0-9]+]], 3, 3 +; CHECK-DAG: addi [[R2:[0-9]+]], 1, -16 +; CHECK-DAG: addi [[R3:[0-9]+]], 3, 2 +; CHECK: std [[R1]], 8([[R2]]) +; CHECK: std [[R3]], -16(1) +; CHECK: lxvd2x 34, 0, [[R2]] ; CHECK-NOT: stxvd2x -; FIXME: We still make one vector for each vector element and this shuffle them -; together instead of just composing one vector on the stack. ; CHECK: blr } -- 2.34.1