From 2dbf23afb409fea7b09081ac115fe495259a843d Mon Sep 17 00:00:00 2001 From: Andrew Lenharth Date: Tue, 18 Apr 2006 19:54:11 +0000 Subject: llvm.memc* improvements. helps PA a lot in some specmarks git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27811 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/DataStructure/Local.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'lib/Analysis/DataStructure/Local.cpp') diff --git a/lib/Analysis/DataStructure/Local.cpp b/lib/Analysis/DataStructure/Local.cpp index f191bb3159..9afc9661a6 100644 --- a/lib/Analysis/DataStructure/Local.cpp +++ b/lib/Analysis/DataStructure/Local.cpp @@ -553,14 +553,21 @@ void GraphBuilder::visitCallSite(CallSite CS) { // targets pointers alias, but rather merge the out edges of the graphs // for the pointers according to the type merging of the graphs. //Simply merging the two graphs is a crude approximation to this. + //Instead, copy the src pointer graph, then merge the copy with the + //dest pointer, thus avoiding contaminating the src with info from the dest //I might be wrong though. // Merge the first & second arguments, and mark the memory read and - // modified. - DSNodeHandle RetNH = getValueDest(**CS.arg_begin()); - RetNH.mergeWith(getValueDest(**(CS.arg_begin()+1))); + // modified. Preserve second graph + DSNodeHandle RetNH = getValueDest(**CS.arg_begin()); + DSNodeHandle SrcNH = getValueDest(**(CS.arg_begin()+1)); + DSNodeHandle Copy( new DSNode(*SrcNH.getNode(), SrcNH.getNode()->getParentGraph()), + SrcNH.getOffset()); + RetNH.mergeWith(Copy); if (DSNode *N = RetNH.getNode()) - N->setModifiedMarker()->setReadMarker(); + N->setModifiedMarker(); + if (DSNode *N = SrcNH.getNode()) + N->setReadMarker(); return; } case Intrinsic::memset_i32: -- cgit v1.2.3-18-g5258