Implement capability to fold this:

uint %test4(int %A, int %B) {
        %COND = setlt int %A, %B                ; <bool> [#uses=1]
        %result = cast bool %COND to uint               ; <uint> [#uses=1]
        ret uint %result
}
into a single cast instruction.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3339 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-08-14 23:21:10 +00:00
parent 8360d0922a
commit 5cf6f112e6

View File

@ -476,6 +476,13 @@ Instruction *InstCombiner::visitShiftInst(Instruction &I) {
}
// isCIntegral - For the purposes of casting, we allow conversion of sizes and
// stuff as long as the value type acts basically integral like.
//
static bool isCIntegral(const Type *Ty) {
return Ty->isIntegral() || Ty == Type::BoolTy;
}
// isEliminableCastOfCast - Return true if it is valid to eliminate the CI
// instruction.
//
@ -488,13 +495,13 @@ static inline bool isEliminableCastOfCast(const CastInst &CI,
// It is legal to eliminate the instruction if casting A->B->A if the sizes
// are identical and the bits don't get reinterpreted (for example
// int->float->int)
// int->float->int would not be allowed)
if (SrcTy == DstTy && SrcTy->isLosslesslyConvertableTo(MidTy))
return true;
// Allow free casting and conversion of sizes as long as the sign doesn't
// change...
if (SrcTy->isIntegral() && MidTy->isIntegral() && DstTy->isIntegral() &&
if (isCIntegral(SrcTy) && isCIntegral(MidTy) && isCIntegral(DstTy) &&
SrcTy->isSigned() == MidTy->isSigned() &&
MidTy->isSigned() == DstTy->isSigned()) {
// Only accept cases where we are either monotonically increasing the type
@ -503,10 +510,10 @@ static inline bool isEliminableCastOfCast(const CastInst &CI,
unsigned SrcSize = SrcTy->getPrimitiveSize();
unsigned MidSize = MidTy->getPrimitiveSize();
unsigned DstSize = DstTy->getPrimitiveSize();
if (SrcSize < MidSize && MidSize < DstSize)
if (SrcSize <= MidSize && MidSize <= DstSize)
return true;
if (SrcSize > MidSize && MidSize > DstSize)
if (SrcSize >= MidSize && MidSize >= DstSize)
return true;
}