aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2012-02-01 00:08:17 +0000
committerJim Grosbach <grosbach@apple.com>2012-02-01 00:08:17 +0000
commitd0e277d272d517ca1cda368267d199f0da7cad95 (patch)
tree632f0e1cf045667d851f80f4ad3cc8472de1e8db /lib
parent24dda217052b48373ed89d043a778aabb2f65080 (diff)
downloadexternal_llvm-d0e277d272d517ca1cda368267d199f0da7cad95.zip
external_llvm-d0e277d272d517ca1cda368267d199f0da7cad95.tar.gz
external_llvm-d0e277d272d517ca1cda368267d199f0da7cad95.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149457 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/InstCombine/InstCombineCalls.cpp19
1 files changed, 5 insertions, 14 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp
index a87fbbd..c3c13ae 100644
--- a/lib/Transforms/InstCombine/InstCombineCalls.cpp
+++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp
@@ -1105,21 +1105,12 @@ bool InstCombiner::transformConstExprCastCall(CallSite CS) {
if (FT->isVarArg()!=cast<FunctionType>(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<Value*> Args;