Implement capability to fold this:
authorChris Lattner <sabre@nondot.org>
Wed, 14 Aug 2002 23:21:10 +0000 (23:21 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 14 Aug 2002 23:21:10 +0000 (23:21 +0000)
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

lib/Transforms/Scalar/InstructionCombining.cpp

index 366752f2d6466ca92206301364055d5867d29088..cc00093c78a84bb93c4437888258ecc8b06b1046 100644 (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;
   }