Commit 8b1fc860 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r245535:

------------------------------------------------------------------------
r245535 | hfinkel | 2015-08-19 20:02:02 -0700 (Wed, 19 Aug 2015) | 6 lines

[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.
------------------------------------------------------------------------

llvm-svn: 245574
parent 3eff3d8c
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -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())
+38 −0
Original line number Diff line number Diff line
; 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 }