llvm.org GIT mirror llvm / ae64fdf
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. ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_36@228986 91177308-0d34-0410-b5e6-96231b3b80d8 Hans Wennborg 5 years ago
2 changed file(s) with 28 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
389389 if (Op.getOperand(j)
390390 .getValueType()
391391 .getVectorElementType()
392 .isFloatingPoint())
392 .isFloatingPoint() &&
393 NVT.isVector() && NVT.getVectorElementType().isFloatingPoint())
393394 Operands[j] = DAG.getNode(ISD::FP_EXTEND, dl, NVT, Op.getOperand(j));
394395 else
395396 Operands[j] = DAG.getNode(ISD::BITCAST, dl, NVT, Op.getOperand(j));
398399 }
399400
400401 Op = DAG.getNode(Op.getOpcode(), dl, NVT, Operands);
401 if (VT.isFloatingPoint() ||
402 (VT.isVector() && VT.getVectorElementType().isFloatingPoint()))
402 if ((VT.isFloatingPoint() && NVT.isFloatingPoint()) ||
403 (VT.isVector() && VT.getVectorElementType().isFloatingPoint() &&
404 NVT.isVector() && NVT.getVectorElementType().isFloatingPoint()))
403405 return DAG.getNode(ISD::FP_ROUND, dl, VT, Op, DAG.getIntPtrConstant(0));
404406 else
405407 return DAG.getNode(ISD::BITCAST, dl, VT, Op);
0 ; RUN: llc -mcpu=pwr7 < %s | FileCheck %s
1 target datalayout = "E-m:e-i64:64-n32:64"
2 target triple = "powerpc64-unknown-linux-gnu"
3
4 ; Function Attrs: nounwind
5 define void @Compute_Lateral() #0 {
6 entry:
7 br i1 undef, label %if.then, label %if.end
8
9 if.then: ; preds = %entry
10 unreachable
11
12 if.end: ; preds = %entry
13 %0 = select i1 undef, <2 x double> undef, <2 x double> zeroinitializer
14 %1 = extractelement <2 x double> %0, i32 1
15 store double %1, double* undef, align 8
16 ret void
17
18 ; CHECK-LABEL: @Compute_Lateral
19 }
20
21 attributes #0 = { nounwind }
22