forked from OSchip/llvm-project
Constant fold vector bitcasts of halves similarly to how floats and doubles are folded. Test case included.
llvm-svn: 176131
This commit is contained in:
parent
fd666e9e3c
commit
a7b93c1e5f
|
@ -54,13 +54,12 @@ static Constant *FoldBitCast(Constant *C, Type *DestTy,
|
|||
|
||||
// Handle a vector->integer cast.
|
||||
if (IntegerType *IT = dyn_cast<IntegerType>(DestTy)) {
|
||||
ConstantDataVector *CDV = dyn_cast<ConstantDataVector>(C);
|
||||
if (CDV == 0)
|
||||
VectorType *VTy = dyn_cast<VectorType>(C->getType());
|
||||
if (VTy == 0)
|
||||
return ConstantExpr::getBitCast(C, DestTy);
|
||||
|
||||
unsigned NumSrcElts = CDV->getType()->getNumElements();
|
||||
|
||||
Type *SrcEltTy = CDV->getType()->getElementType();
|
||||
unsigned NumSrcElts = VTy->getNumElements();
|
||||
Type *SrcEltTy = VTy->getElementType();
|
||||
|
||||
// If the vector is a vector of floating point, convert it to vector of int
|
||||
// to simplify things.
|
||||
|
@ -70,9 +69,12 @@ static Constant *FoldBitCast(Constant *C, Type *DestTy,
|
|||
VectorType::get(IntegerType::get(C->getContext(), FPWidth), NumSrcElts);
|
||||
// Ask IR to do the conversion now that #elts line up.
|
||||
C = ConstantExpr::getBitCast(C, SrcIVTy);
|
||||
CDV = cast<ConstantDataVector>(C);
|
||||
}
|
||||
|
||||
ConstantDataVector *CDV = dyn_cast<ConstantDataVector>(C);
|
||||
if (CDV == 0)
|
||||
return ConstantExpr::getBitCast(C, DestTy);
|
||||
|
||||
// Now that we know that the input value is a vector of integers, just shift
|
||||
// and insert them into our result.
|
||||
unsigned BitShift = TD.getTypeAllocSizeInBits(SrcEltTy);
|
||||
|
|
|
@ -31,3 +31,8 @@ define <4 x i32> @test6() {
|
|||
%tmp3 = bitcast <2 x double> <double 0.5, double 1.0> to <4 x i32>
|
||||
ret <4 x i32> %tmp3
|
||||
}
|
||||
|
||||
define i32 @test7() {
|
||||
%tmp3 = bitcast <2 x half> <half 0xH1100, half 0xH0011> to i32
|
||||
ret i32 %tmp3
|
||||
}
|
Loading…
Reference in New Issue