mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 23:32:27 +00:00
Enhance constant folding of bitcast operations on vectors of floats.
Add getAllOnesValue of FP numbers to Constants and APFloat. Add more tests. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125776 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bd9f6bf5cd
commit
093399cbf3
@ -246,6 +246,13 @@ namespace llvm {
|
|||||||
static APFloat getSmallestNormalized(const fltSemantics &Sem,
|
static APFloat getSmallestNormalized(const fltSemantics &Sem,
|
||||||
bool Negative = false);
|
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
|
/// Profile - Used to insert APFloat objects, or objects that contain
|
||||||
/// APFloat objects, into FoldingSets.
|
/// APFloat objects, into FoldingSets.
|
||||||
void Profile(FoldingSetNodeID& NID) const;
|
void Profile(FoldingSetNodeID& NID) const;
|
||||||
|
@ -3197,6 +3197,12 @@ APFloat::initFromAPInt(const APInt& api, bool isIEEE)
|
|||||||
llvm_unreachable(0);
|
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 APFloat::getLargest(const fltSemantics &Sem, bool Negative) {
|
||||||
APFloat Val(Sem, fcNormal, Negative);
|
APFloat Val(Sem, fcNormal, Negative);
|
||||||
|
|
||||||
|
@ -43,8 +43,7 @@ using namespace llvm;
|
|||||||
static Constant *BitCastConstantVector(ConstantVector *CV,
|
static Constant *BitCastConstantVector(ConstantVector *CV,
|
||||||
const VectorType *DstTy) {
|
const VectorType *DstTy) {
|
||||||
|
|
||||||
if (CV->isAllOnesValue() && DstTy->getElementType()->isIntegerTy())
|
if (CV->isAllOnesValue()) return Constant::getAllOnesValue(DstTy);
|
||||||
return Constant::getAllOnesValue(DstTy);
|
|
||||||
if (CV->isNullValue()) return Constant::getNullValue(DstTy);
|
if (CV->isNullValue()) return Constant::getNullValue(DstTy);
|
||||||
|
|
||||||
// If this cast changes element count then we can't handle it here:
|
// 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))
|
if (const IntegerType *ITy = dyn_cast<IntegerType>(Ty))
|
||||||
return ConstantInt::get(Ty->getContext(),
|
return ConstantInt::get(Ty->getContext(),
|
||||||
APInt::getAllOnesValue(ITy->getBitWidth()));
|
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;
|
SmallVector<Constant*, 16> Elts;
|
||||||
const VectorType *VTy = cast<VectorType>(Ty);
|
const VectorType *VTy = cast<VectorType>(Ty);
|
||||||
Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType()));
|
Elts.resize(VTy->getNumElements(), getAllOnesValue(VTy->getElementType()));
|
||||||
|
@ -18,7 +18,8 @@ define <4 x i32> @b(<1 x i64> %y) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
; CHECK: @foo
|
; CHECK: @foo
|
||||||
; CHECK: bitcast
|
; CHECK-NOT: bitcast
|
||||||
|
; CHECK: ret
|
||||||
|
|
||||||
; from MultiSource/Benchmarks/Bullet
|
; from MultiSource/Benchmarks/Bullet
|
||||||
define <2 x float> @foo() {
|
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…
x
Reference in New Issue
Block a user