From: Hal Finkel Date: Thu, 20 Aug 2015 03:02:02 +0000 (+0000) Subject: [PowerPC] Fix value type on XVCMPEQDP for v2f64 comparisons X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d51dd69e7929840bcefc50012040c246178e81a8;p=oota-llvm.git [PowerPC] Fix value type on XVCMPEQDP for v2f64 comparisons XVCMPEQDP is used for VSX v2f64 equality comparisons, but the value type needs to be v2i64 (as that's the corresponding SETCC type). Fixes PR24225. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245535 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index bf3072f783e..0b43b046a44 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -2305,14 +2305,15 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDNode *N) { if (Swap) std::swap(LHS, RHS); + EVT ResVT = VecVT.changeVectorElementTypeToInteger(); if (Negate) { - SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, VecVT, LHS, RHS), 0); + SDValue VCmp(CurDAG->getMachineNode(VCmpInst, dl, ResVT, LHS, RHS), 0); return CurDAG->SelectNodeTo(N, PPCSubTarget->hasVSX() ? PPC::XXLNOR : PPC::VNOR, - VecVT, VCmp, VCmp); + ResVT, VCmp, VCmp); } - return CurDAG->SelectNodeTo(N, VCmpInst, VecVT, LHS, RHS); + return CurDAG->SelectNodeTo(N, VCmpInst, ResVT, LHS, RHS); } if (PPCSubTarget->useCRBits()) diff --git a/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll b/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll new file mode 100644 index 00000000000..ef63233e746 --- /dev/null +++ b/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll @@ -0,0 +1,38 @@ +; RUN: llc < %s | FileCheck %s +target datalayout = "e-m:e-i64:64-n32:64" +target triple = "powerpc64le-unknown-linux-gnu" + +; Function Attrs: nounwind +define void @__fmax_double3_3D_exec() #0 { +entry: + br i1 undef, label %if.then.i, label %fmax_double3.exit + +if.then.i: ; preds = %entry + %cmp24.i.i = fcmp ord <3 x double> undef, zeroinitializer + %sext25.i.i = sext <3 x i1> %cmp24.i.i to <3 x i64> + %neg.i.i = xor <3 x i64> %sext25.i.i, + %or.i.i = or <3 x i64> undef, %neg.i.i + %neg.i.i.i = select <3 x i1> undef, <3 x i64> zeroinitializer, <3 x i64> %sext25.i.i + %and.i.i.i = and <3 x i64> undef, %neg.i.i.i + %and26.i.i.i = and <3 x i64> undef, %or.i.i + %or.i.i.i = or <3 x i64> %and.i.i.i, %and26.i.i.i + %astype32.i.i.i = bitcast <3 x i64> %or.i.i.i to <3 x double> + %extractVec33.i.i.i = shufflevector <3 x double> %astype32.i.i.i, <3 x double> undef, <4 x i32> + store <4 x double> %extractVec33.i.i.i, <4 x double>* undef, align 32 + br label %fmax_double3.exit + +; CHECK-LABEL: @__fmax_double3_3D_exec +; CHECK: xvcmpeqdp + +fmax_double3.exit: ; preds = %if.then.i, %entry + br i1 undef, label %if.then, label %do.end + +if.then: ; preds = %fmax_double3.exit + unreachable + +do.end: ; preds = %fmax_double3.exit + ret void +} + +attributes #0 = { nounwind } +