[llvm] r213798 - DAG: fp->int conversion for non-splat constants.
Jim Grosbach
grosbach at apple.com
Wed Jul 23 13:41:31 PDT 2014
Author: grosbach
Date: Wed Jul 23 15:41:31 2014
New Revision: 213798
URL: http://llvm.org/viewvc/llvm-project?rev=213798&view=rev
Log:
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
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
llvm/trunk/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp?rev=213798&r1=213797&r2=213798&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Wed Jul 23 15:41:31 2014
@@ -2766,11 +2766,7 @@ SDValue SelectionDAG::getNode(unsigned O
// 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 O
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);
}
}
}
Modified: llvm/trunk/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll?rev=213798&r1=213797&r2=213798&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll (original)
+++ llvm/trunk/test/CodeGen/X86/x86-setcc-int-to-fp-combine.ll Wed Jul 23 15:41:31 2014
@@ -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
%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
+}
More information about the llvm-commits
mailing list