Enhance constant folding of bitcast operations on vectors of floats.

Add getAllOnesValue of FP numbers to Constants and APFloat.
Add more tests.

llvm-svn: 125776
This commit is contained in:
Nadav Rotem 2011-02-17 21:22:27 +00:00
parent 1af88f12a3
commit 7cc6d12ad0
5 changed files with 62 additions and 4 deletions

View File

@ -246,6 +246,13 @@ namespace llvm {
static APFloat getSmallestNormalized(const fltSemantics &Sem,
bool Negative = false);
/// getAllOnesValue - Returns a float which is bitcasted from
/// an all one value int.
///
/// \param BitWidth - Select float type
/// \param isIEEE - If 128 bit number, select between PPC and IEEE
static APFloat getAllOnesValue(unsigned BitWidth, bool isIEEE = false);
/// Profile - Used to insert APFloat objects, or objects that contain
/// APFloat objects, into FoldingSets.
void Profile(FoldingSetNodeID& NID) const;

View File

@ -3197,6 +3197,12 @@ APFloat::initFromAPInt(const APInt& api, bool isIEEE)
llvm_unreachable(0);
}
APFloat
APFloat::getAllOnesValue(unsigned BitWidth, bool isIEEE)
{
return APFloat(APInt::getAllOnesValue(BitWidth), isIEEE);
}
APFloat APFloat::getLargest(const fltSemantics &Sem, bool Negative) {
APFloat Val(Sem, fcNormal, Negative);

View File

@ -43,8 +43,7 @@ using namespace llvm;
static Constant *BitCastConstantVector(ConstantVector *CV,
const VectorType *DstTy) {
if (CV->isAllOnesValue() && DstTy->getElementType()->isIntegerTy())
return Constant::getAllOnesValue(DstTy);
if (CV->isAllOnesValue()) return Constant::getAllOnesValue(DstTy);
if (CV->isNullValue()) return Constant::getNullValue(DstTy);
// If this cast changes element count then we can't handle it here:

View File

@ -94,6 +94,12 @@ Constant *Constant::getAllOnesValue(const Type *Ty) {
return ConstantInt::get(Ty->getContext(),
APInt::getAllOnesValue(ITy->getBitWidth()));
if (Ty->isFloatingPointTy()) {
APFloat FL = APFloat::getAllOnesValue(Ty->getPrimitiveSizeInBits(),
!Ty->isPPC_FP128Ty());
return ConstantFP::get(Ty->getContext(), FL);
}
SmallVector<Constant*, 16> Elts;
const VectorType *VTy = cast<VectorType>(Ty);
Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType()));

View File

@ -18,7 +18,8 @@ define <4 x i32> @b(<1 x i64> %y) {
}
; CHECK: @foo
; CHECK: bitcast
; CHECK-NOT: bitcast
; CHECK: ret
; from MultiSource/Benchmarks/Bullet
define <2 x float> @foo() {
@ -27,4 +28,43 @@ define <2 x float> @foo() {
}
; CHECK: @foo2
; CHECK-NOT: bitcast
; CHECK: ret
define <2 x double> @foo2() {
%cast = bitcast i128 -1 to <2 x double>
ret <2 x double> %cast
}
; CHECK: @foo3
; CHECK-NOT: bitcast
; CHECK: ret
define <1 x float> @foo3() {
%cast = bitcast i32 -1 to <1 x float>
ret <1 x float> %cast
}
; CHECK: @foo4
; CHECK-NOT: bitcast
; CHECK: ret
define float @foo4() {
%cast = bitcast <1 x i32 ><i32 -1> to float
ret float %cast
}
; CHECK: @foo5
; CHECK-NOT: bitcast
; CHECK: ret
define double @foo5() {
%cast = bitcast <2 x i32 ><i32 -1, i32 -1> to double
ret double %cast
}
; CHECK: @foo6
; CHECK-NOT: bitcast
; CHECK: ret
define <2 x double> @foo6() {
%cast = bitcast <4 x i32><i32 -1, i32 -1, i32 -1, i32 -1> to <2 x double>
ret <2 x double> %cast
}