From 9fa0481569b688e95d297cf23fa6d5eb4c01e00a Mon Sep 17 00:00:00 2001 From: Jim Grosbach Date: Wed, 1 Feb 2012 00:08:17 +0000 Subject: Disable InstCombine unsafe folding bitcasts of calls w/ varargs. Changing arguments from being passed as fixed to varargs is unsafe, as the ABI may require they be handled differently (stack vs. register, for example). Remove two tests which rely on the bitcast being folded into the direct call, which is exactly the transformation that's unsafe. llvm-svn: 149457 --- llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'llvm/lib/Transforms') diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index a87fbbd9895..c3c13ae362f 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -1105,21 +1105,12 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) { if (FT->isVarArg()!=cast(APTy->getElementType())->isVarArg()) return false; } - - if (FT->getNumParams() < NumActualArgs && FT->isVarArg() && - !CallerPAL.isEmpty()) - // In this case we have more arguments than the new function type, but we - // 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.getNumSlots(); i; --i) { - if (CallerPAL.getSlot(i - 1).Index <= FT->getNumParams()) - break; - Attributes PAttrs = CallerPAL.getSlot(i - 1).Attrs; - if (PAttrs & Attribute::VarArgsIncompatible) - return false; - } - + // If we're casting varargs to non-varargs, that may not be allowable + // under the ABI, so conservatively don't do anything. + if (FT->getNumParams() < NumActualArgs && FT->isVarArg()) + return false; + // Okay, we decided that this is a safe thing to do: go ahead and start // inserting cast instructions as necessary. std::vector Args; -- cgit v1.2.3