mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
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:
parent
e797a8c29f
commit
ad2fd4eada
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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:
|
||||
|
@ -93,7 +93,13 @@ Constant *Constant::getAllOnesValue(const Type *Ty) {
|
||||
if (const IntegerType *ITy = dyn_cast<IntegerType>(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()));
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user