diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2008-03-18 22:22:53 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@dberlin.org> | 2008-03-18 22:22:53 +0000 |
commit | d3bf1aef3f1bfba362b71e72f416100a82d5b5db (patch) | |
tree | 0a360bf443468fe25d7ae978c54a30d5e58a640b /lib/Analysis | |
parent | 856ce2da14df1ab3a2375ecc93650757366d7a9f (diff) | |
download | external_llvm-d3bf1aef3f1bfba362b71e72f416100a82d5b5db.zip external_llvm-d3bf1aef3f1bfba362b71e72f416100a82d5b5db.tar.gz external_llvm-d3bf1aef3f1bfba362b71e72f416100a82d5b5db.tar.bz2 |
Fix PR 2160 by making sure arguments to external functions get marked as pointing to anything
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@48509 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis')
-rw-r--r-- | lib/Analysis/IPA/Andersens.cpp | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/lib/Analysis/IPA/Andersens.cpp b/lib/Analysis/IPA/Andersens.cpp index a66a6fa..49c6edd 100644 --- a/lib/Analysis/IPA/Andersens.cpp +++ b/lib/Analysis/IPA/Andersens.cpp @@ -647,9 +647,13 @@ Andersens::getModRefInfo(CallSite CS, Value *P, unsigned Size) { if (N1->PointsTo->empty()) return NoModRef; - +#if FULL_UNIVERSAL + if (!UniversalSet->PointsTo->test(FindNode(getNode(P)))) + return NoModRef; // Universal set does not contain P +#else if (!N1->PointsTo->test(UniversalSet)) return NoModRef; // P doesn't point to the universal set. +#endif } return AliasAnalysis::getModRefInfo(CS, P, Size); @@ -1266,29 +1270,43 @@ void Andersens::AddConstraintsForCall(CallSite CS, Function *F) { } CallSite::arg_iterator ArgI = CS.arg_begin(), ArgE = CS.arg_end(); + bool external = !F || F->isDeclaration(); if (F) { // Direct Call Function::arg_iterator AI = F->arg_begin(), AE = F->arg_end(); - for (; AI != AE && ArgI != ArgE; ++AI, ++ArgI) - if (isa<PointerType>(AI->getType())) { - if (isa<PointerType>((*ArgI)->getType())) { - // Copy the actual argument into the formal argument. - Constraints.push_back(Constraint(Constraint::Copy, getNode(AI), - getNode(*ArgI))); - } else { - Constraints.push_back(Constraint(Constraint::Copy, getNode(AI), - UniversalSet)); - } - } else if (isa<PointerType>((*ArgI)->getType())) { + for (; AI != AE && ArgI != ArgE; ++AI, ++ArgI) + { +#if !FULL_UNIVERSAL + if (external && isa<PointerType>((*ArgI)->getType())) + { + // Add constraint that ArgI can now point to anything due to + // escaping, as can everything it points to. The second portion of + // this should be taken care of by universal = *universal + Constraints.push_back(Constraint(Constraint::Copy, + getNode(*ArgI), + UniversalSet)); + } +#endif + if (isa<PointerType>(AI->getType())) { + if (isa<PointerType>((*ArgI)->getType())) { + // Copy the actual argument into the formal argument. + Constraints.push_back(Constraint(Constraint::Copy, getNode(AI), + getNode(*ArgI))); + } else { + Constraints.push_back(Constraint(Constraint::Copy, getNode(AI), + UniversalSet)); + } + } else if (isa<PointerType>((*ArgI)->getType())) { #if FULL_UNIVERSAL - Constraints.push_back(Constraint(Constraint::Copy, - UniversalSet, - getNode(*ArgI))); + Constraints.push_back(Constraint(Constraint::Copy, + UniversalSet, + getNode(*ArgI))); #else - Constraints.push_back(Constraint(Constraint::Copy, - getNode(*ArgI), - UniversalSet)); + Constraints.push_back(Constraint(Constraint::Copy, + getNode(*ArgI), + UniversalSet)); #endif + } } } else { //Indirect Call |