mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-13 09:33:50 +00:00
[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/trunk@228969 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e53f1302f9
commit
8452d01224
@ -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
test/CodeGen/PowerPC/vsel-prom.ll
Normal file
23
test/CodeGen/PowerPC/vsel-prom.ll
Normal file
@ -0,0 +1,23 @@
|
||||
; 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 }
|
||||
|
Loading…
x
Reference in New Issue
Block a user