llvm.memc* improvements. helps PA a lot in some specmarks
authorAndrew Lenharth <andrewl@lenharth.org>
Tue, 18 Apr 2006 19:54:11 +0000 (19:54 +0000)
committerAndrew Lenharth <andrewl@lenharth.org>
Tue, 18 Apr 2006 19:54:11 +0000 (19:54 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27811 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DataStructure/Local.cpp

index f191bb3159bdf40d4c74d99914a0c122cb6a0d74..9afc9661a6351d043973992c082005d23dfbdd81 100644 (file)
@@ -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: