mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-05 13:09:10 +00:00
DAG: fp->int conversion for non-splat constants.
Constant fold the lanes of the input constant build_vector individually so we correctly handle when the vector elements are not all the same constant value. PR20394 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213798 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2941802bad
commit
df48c93ef0
@ -2766,11 +2766,7 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,
|
||||
|
||||
// Constant fold unary operations with a vector integer operand.
|
||||
if (BuildVectorSDNode *BV = dyn_cast<BuildVectorSDNode>(Operand.getNode())) {
|
||||
APInt Val;
|
||||
APInt DummyUndefs;
|
||||
unsigned SplatBitSize;
|
||||
bool DummyHasUndefs;
|
||||
if (BV->isConstantSplat(Val, DummyUndefs, SplatBitSize, DummyHasUndefs)) {
|
||||
if (BV->isConstant()) {
|
||||
switch (Opcode) {
|
||||
default:
|
||||
// FIXME: Entirely reasonable to perform folding of other unary
|
||||
@ -2778,13 +2774,16 @@ SDValue SelectionDAG::getNode(unsigned Opcode, SDLoc DL,
|
||||
break;
|
||||
case ISD::UINT_TO_FP:
|
||||
case ISD::SINT_TO_FP: {
|
||||
APFloat APF(
|
||||
EVTToAPFloatSemantics(VT.getVectorElementType()),
|
||||
APInt::getNullValue(VT.getVectorElementType().getSizeInBits()));
|
||||
(void)APF.convertFromAPInt(Val, Opcode == ISD::SINT_TO_FP,
|
||||
APFloat::rmNearestTiesToEven);
|
||||
|
||||
return getConstantFP(APF, VT);
|
||||
SmallVector<SDValue, 8> Ops;
|
||||
for (int i = 0, e = VT.getVectorNumElements(); i != e; ++i) {
|
||||
SDValue OpN = BV->getOperand(i);
|
||||
// Let the above scalar folding handle the conversion of each
|
||||
// element.
|
||||
OpN = getNode(ISD::SINT_TO_FP, DL, VT.getVectorElementType(),
|
||||
OpN);
|
||||
Ops.push_back(OpN);
|
||||
}
|
||||
return getNode(ISD::BUILD_VECTOR, DL, VT, Ops);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
||||
|
||||
define <4 x float> @foo(<4 x float> %val, <4 x float> %test) nounwind {
|
||||
; CHECK-LABEL: LCPI0_0
|
||||
; CHECK-LABEL: LCPI0_0:
|
||||
; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00
|
||||
; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00
|
||||
; CHECK-NEXT: .long 1065353216 ## float 1.000000e+00
|
||||
@ -16,3 +16,17 @@ define <4 x float> @foo(<4 x float> %val, <4 x float> %test) nounwind {
|
||||
%result = sitofp <4 x i32> %ext to <4 x float>
|
||||
ret <4 x float> %result
|
||||
}
|
||||
|
||||
define void @bar(<4 x float>* noalias %result) nounwind {
|
||||
; CHECK-LABEL: LCPI1_0:
|
||||
; CHECK-NEXT: .long 1082130432 ## float 4.000000e+00
|
||||
; CHECK-NEXT: .long 1084227584 ## float 5.000000e+00
|
||||
; CHECK-NEXT: .long 1086324736 ## float 6.000000e+00
|
||||
; CHECK-NEXT: .long 1088421888 ## float 7.000000e+00
|
||||
; CHECK-LABEL: bar:
|
||||
; CHECK: movaps LCPI1_0(%rip), %xmm0
|
||||
|
||||
%val = uitofp <4 x i32> <i32 4, i32 5, i32 6, i32 7> to <4 x float>
|
||||
store <4 x float> %val, <4 x float>* %result
|
||||
ret void
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user