mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Catch more function pointer casting problems
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
This commit is contained in:
parent
c9094dbbe9
commit
b8e604c29a
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user