Catch more function pointer casting problems
authorAndrew Lenharth <andrewl@lenharth.org>
Wed, 28 Jun 2006 01:01:52 +0000 (01:01 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Wed, 28 Jun 2006 01:01:52 +0000 (01:01 +0000)
Remove the Function pointer cast in these calls, converting it to
a cast of argument.
%tmp60 = tail call int cast (int (ulong)* %str to int (int)*)( int 10 )
%tmp60 = tail call int cast (int (ulong)* %str to int (int)*)( uint %tmp51 )

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28953 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index c7fb84880250bd5427614852533760c63fb83700..63cd256dc57670e6fb5f26999512674fcd2396cd 100644 (file)
@@ -6048,7 +6048,15 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
   CallSite::arg_iterator AI = CS.arg_begin();
   for (unsigned i = 0, e = NumCommonArgs; i != e; ++i, ++AI) {
     const Type *ParamTy = FT->getParamType(i);
-    bool isConvertible = (*AI)->getType()->isLosslesslyConvertibleTo(ParamTy);
+    const Type *ActTy = (*AI)->getType();
+    ConstantSInt* c = dyn_cast<ConstantSInt>(*AI);
+    //Either we can cast directly, or we can upconvert the argument
+    bool isConvertible = ActTy->isLosslesslyConvertibleTo(ParamTy) ||
+      (ParamTy->isIntegral() && ActTy->isIntegral() &&
+       ParamTy->isSigned() == ActTy->isSigned() &&
+       ParamTy->getPrimitiveSize() >= ActTy->getPrimitiveSize()) ||
+      (c && ParamTy->getPrimitiveSize() >= ActTy->getPrimitiveSize() &&
+       c->getValue() > 0);
     if (Callee->isExternal() && !isConvertible) return false;
   }