Commit 022a4c41 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r228969:

------------------------------------------------------------------------
r228969 | hfinkel | 2015-02-12 14:43:52 -0800 (Thu, 12 Feb 2015) | 7 lines

[SDAG] Don't try to use FP_EXTEND/FP_ROUND for int<->fp promotions

The PowerPC backend has long promoted some floating-point vector operations
(such as select) to integer vector operations. Unfortunately, this behavior was
broken by r216555. When using FP_EXTEND/FP_ROUND for promotions, we must check
that both the old and new types are floating-point types. Otherwise, we must
use BITCAST as we did prior to r216555 for everything.
------------------------------------------------------------------------

llvm-svn: 228986
parent aae610a1
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -390,7 +390,8 @@ SDValue VectorLegalizer::Promote(SDValue Op) {
      if (Op.getOperand(j)
              .getValueType()
              .getVectorElementType()
              .isFloatingPoint())
              .isFloatingPoint() &&
          NVT.isVector() && NVT.getVectorElementType().isFloatingPoint())
        Operands[j] = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Op.getOperand(j));
      else
        Operands[j] = DAG.getNode(ISD::BITCAST, dl, NVT, Op.getOperand(j));
@@ -399,8 +400,9 @@ SDValue VectorLegalizer::Promote(SDValue Op) {
  }

  Op = DAG.getNode(Op.getOpcode(), dl, NVT, Operands);
  if (VT.isFloatingPoint() ||
      (VT.isVector() && VT.getVectorElementType().isFloatingPoint()))
  if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) ||
      (VT.isVector() && VT.getVectorElementType().isFloatingPoint() &&
       NVT.isVector() && NVT.getVectorElementType().isFloatingPoint()))
    return DAG.getNode(ISD::FP_ROUND, dl, VT, Op, DAG.getIntPtrConstant(0));
  else
    return DAG.getNode(ISD::BITCAST, dl, VT, Op);
+23 −0
Original line number Diff line number Diff line
; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
target datalayout = "E-m:e-i64:64-n32:64"
target triple = "powerpc64-unknown-linux-gnu"

; Function Attrs: nounwind
define void @Compute_Lateral() #0 {
entry:
  br i1 undef, label %if.then, label %if.end

if.then:                                          ; preds = %entry
  unreachable

if.end:                                           ; preds = %entry
  %0 = select i1 undef, <2 x double> undef, <2 x double> zeroinitializer
  %1 = extractelement <2 x double> %0, i32 1
  store double %1, double* undef, align 8
  ret void

; CHECK-LABEL: @Compute_Lateral
}

attributes #0 = { nounwind }