From 5cf6f112e67e7d6897ed350d5e029868d0af33bf Mon Sep 17 00:00:00 2001
From: Chris Lattner <sabre@nondot.org>
Date: Wed, 14 Aug 2002 23:21:10 +0000
Subject: 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
---
 lib/Transforms/Scalar/InstructionCombining.cpp | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

(limited to 'lib')

diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index 366752f..cc00093 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -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;
   }
 
-- 
cgit v1.1