Author: baldrick Date: Sun Jan 13 02:02:44 2008 New Revision: 45931 URL: http://llvm.org/viewvc/llvm-project?rev=45931&view=rev Log: When turning a call to a bitcast function into a direct call, if this becomes a varargs call then deal correctly with any parameter attributes on the newly vararg call arguments.
Added: llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=45931&r1=45930&r2=45931&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sun Jan 13 02:02:44 2008 @@ -8142,9 +8142,9 @@ return false; // Cannot transform this return value. if (!Caller->use_empty() && - !CastInst::isCastable(FT->getReturnType(), OldRetTy) && // void -> non-void is handled specially - FT->getReturnType() != Type::VoidTy) + FT->getReturnType() != Type::VoidTy && + !CastInst::isCastable(FT->getReturnType(), OldRetTy)) return false; // Cannot transform this return value. if (CallerPAL && !Caller->use_empty()) { @@ -8200,14 +8200,17 @@ Callee->isDeclaration()) return false; // Do not delete arguments unless we have a function body... - if (FT->getNumParams() < NumActualArgs && FT->isVarArg()) + if (FT->getNumParams() < NumActualArgs && FT->isVarArg() && CallerPAL) // In this case we have more arguments than the new function type, but we - // won't be dropping them. Some of them may have attributes. If so, we - // cannot perform the transform because attributes are not allowed after - // the end of the function type. - if (CallerPAL && CallerPAL->size() && - CallerPAL->getParamIndex(CallerPAL->size()-1) > FT->getNumParams()) - return false; + // won't be dropping them. Check that these extra arguments have attributes + // that are compatible with being a vararg call argument. + for (unsigned i = CallerPAL->size(); i; --i) { + if (CallerPAL->getParamIndex(i - 1) <= FT->getNumParams()) + break; + uint16_t PAttrs = CallerPAL->getParamAttrsAtIndex(i - 1); + if (PAttrs & ParamAttr::VarArgsIncompatible) + return false; + } // Okay, we decided that this is a safe thing to do: go ahead and start // inserting cast instructions as necessary... @@ -8269,10 +8272,12 @@ } else { Args.push_back(*AI); } - } - // No need to add parameter attributes - we already checked that there - // aren't any. + // Add any parameter attributes. + uint16_t PAttrs = CallerPAL ? CallerPAL->getParamAttrs(i + 1) : 0; + if (PAttrs) + attrVec.push_back(ParamAttrsWithIndex::get(i + 1, PAttrs)); + } } if (FT->getReturnType() == Type::VoidTy) Modified: llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll?rev=45931&r1=45930&r2=45931&view=diff ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll (original) +++ llvm/trunk/test/Transforms/InstCombine/2008-01-06-BitCastAttributes.ll Sun Jan 13 02:02:44 2008 @@ -1,4 +1,4 @@ -; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep bitcast | count 2 +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep bitcast define void @a() { ret void @@ -17,7 +17,6 @@ call <2 x i32> bitcast (i32 (i32*)* @b to <2 x i32> (i32*)*)( i32* inreg null ) ; <<2 x i32>>:1 [#uses=0] %x = call i64 bitcast (i32 (i32*)* @b to i64 (i32)*)( i32 0 ) ; <i64> [#uses=0] call void bitcast (void (...)* @c to void (i32)*)( i32 0 ) - call i32 bitcast (i32 (i32*)* @b to i32 (i32)*)( i32 zeroext 0 ) ; <i32>:2 [#uses=0] call void bitcast (void (...)* @c to void (i32)*)( i32 zeroext 0 ) ret void } Added: llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll?rev=45931&view=auto ============================================================================== --- llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll (added) +++ llvm/trunk/test/Transforms/InstCombine/2008-01-13-NoBitCastAttributes.ll Sun Jan 13 02:02:44 2008 @@ -0,0 +1,15 @@ +; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep bitcast | count 2 + +define i32 @b(i32* inreg %x) signext { + ret i32 0 +} + +define void @c(...) { + ret void +} + +define void @g(i32* %y) { + call i32 bitcast (i32 (i32*)* @b to i32 (i32)*)( i32 zeroext 0 ) ; <i32>:2 [#uses=0] + call void bitcast (void (...)* @c to void (i32*)*)( i32* sret null ) + ret void +} _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits