[PowerPC] Fix value type on XVCMPEQDP for v2f64 comparisons
authorHal Finkel <hfinkel@anl.gov>
Thu, 20 Aug 2015 03:02:02 +0000 (03:02 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 20 Aug 2015 03:02:02 +0000 (03:02 +0000)
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

lib/Target/PowerPC/PPCISelDAGToDAG.cpp
test/CodeGen/PowerPC/xvcmpeqdp-v2f64.ll [new file with mode: 0644]

index bf3072f783e76f84847f65eac333d87860a8b04b..0b43b046a44a1531fadadaf54bf3954db31837e7 100644 (file)
@@ -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 (file)
index 0000000..ef63233
--- /dev/null
@@ -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 }
+