1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

enhance constant folding to be able to constant fold bitcast of

ConstantVector's to integer type.

llvm-svn: 149110
This commit is contained in:
Chris Lattner 2012-01-27 01:44:03 +00:00
parent e6ac20aadf
commit 929f66cdfa
3 changed files with 51 additions and 2 deletions

View File

@ -52,6 +52,44 @@ static Constant *FoldBitCast(Constant *C, Type *DestTy,
if (C->isAllOnesValue() && !DestTy->isX86_MMXTy())
return Constant::getAllOnesValue(DestTy);
// Handle a vector->integer cast.
if (IntegerType *IT = dyn_cast<IntegerType>(DestTy)) {
// FIXME: Remove ConstantVector support.
if ((!isa<ConstantDataVector>(C) && !isa<ConstantVector>(C)) ||
// TODO: Handle big endian someday.
!TD.isLittleEndian())
return ConstantExpr::getBitCast(C, DestTy);
unsigned NumSrcElts = C->getType()->getVectorNumElements();
// If the vector is a vector of floating point, convert it to vector of int
// to simplify things.
if (C->getType()->getVectorElementType()->isFloatingPointTy()) {
unsigned FPWidth =
C->getType()->getVectorElementType()->getPrimitiveSizeInBits();
Type *SrcIVTy =
VectorType::get(IntegerType::get(C->getContext(), FPWidth), NumSrcElts);
// Ask VMCore to do the conversion now that #elts line up.
C = ConstantExpr::getBitCast(C, SrcIVTy);
}
// 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(C->getType()->getVectorElementType());
APInt Result(IT->getBitWidth(), 0);
for (unsigned i = 0; i != NumSrcElts; ++i) {
// FIXME: Rework when we have ConstantDataVector.
ConstantInt *Elt=dyn_cast_or_null<ConstantInt>(C->getAggregateElement(i));
if (Elt == 0) // Elt must be a constant expr or something.
return ConstantExpr::getBitCast(C, DestTy);
Result |= Elt->getValue().zext(IT->getBitWidth()) << i*BitShift;
}
return ConstantInt::get(IT, Result);
}
// The code below only handles casts to vectors currently.
VectorType *DestVTy = dyn_cast<VectorType>(DestTy);
if (DestVTy == 0)

View File

@ -1,5 +1,8 @@
; RUN: opt < %s -constprop -die -S | FileCheck %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.7.2"
; This is a basic sanity check for constant propagation. The add instruction
; should be eliminated.
define i32 @test1(i1 %B) {
@ -40,3 +43,11 @@ define i1 @TNAN() {
%C = or i1 %A, %B
ret i1 %C
}
define i128 @vector_to_int_cast() {
%A = bitcast <4 x i32> <i32 1073741824, i32 1073741824, i32 1073741824, i32 1073741824> to i128
ret i128 %A
; CHECK: @vector_to_int_cast
; CHECK: ret i128 85070591750041656499021422275829170176
}

View File

@ -121,8 +121,8 @@ define i1 @test12(i1 %A) {
%B = icmp ne i64 bitcast (<2 x i32> <i32 1, i32 -1> to i64), %S
ret i1 %B
; CHECK: @test12
; CHECK-NEXT: %B = select i1
; CHECK-NEXT: ret i1 %B
; CHECK-NEXT: = xor i1 %A, true
; CHECK-NEXT: ret i1
}
; PR6481