[llvm] r245535 - [PowerPC] Fix value type on XVCMPEQDP for v2f64 comparisons

Hal Finkel via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 19 20:02:02 PDT 2015


Author: hfinkel
Date: Wed Aug 19 22:02:02 2015
New Revision: 245535

URL: http://llvm.org/viewvc/llvm-project?rev=245535&view=rev
Log:
[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.

Added:
    llvm/trunk/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll
Modified:
    llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp

Modified: llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp?rev=245535&r1=245534&r2=245535&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp (original)
+++ llvm/trunk/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Wed Aug 19 22:02:02 2015
@@ -2305,14 +2305,15 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDN
     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())

Added: llvm/trunk/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll?rev=245535&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll (added)
+++ llvm/trunk/test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll Wed Aug 19 22:02:02 2015
@@ -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, <i64 -1, i64 -1, i64 -1>
+  %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> <i32 0, i32 1, i32 2, i32 undef>
+  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 }
+




More information about the llvm-commits mailing list