MSSA: Only rename accesses whose defining access is nullptr
authorDaniel Berlin <dberlin@dberlin.org>
Mon, 22 Aug 2016 19:14:16 +0000 (19:14 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Mon, 22 Aug 2016 19:14:16 +0000 (19:14 +0000)
llvm-svn: 279461

llvm/lib/Transforms/Utils/MemorySSA.cpp

index a99cfa5..af2f954 100644 (file)
@@ -1123,21 +1123,13 @@ MemoryAccess *MemorySSA::renameBlock(BasicBlock *BB,
   if (It != PerBlockAccesses.end()) {
     AccessList *Accesses = It->second.get();
     for (MemoryAccess &L : *Accesses) {
-      switch (L.getValueID()) {
-      case Value::MemoryUseVal:
-        cast<MemoryUse>(&L)->setDefiningAccess(IncomingVal);
-        break;
-      case Value::MemoryDefVal:
-        // We can't legally optimize defs, because we only allow single
-        // memory phis/uses on operations, and if we optimize these, we can
-        // end up with multiple reaching defs. Uses do not have this
-        // problem, since they do not produce a value
-        cast<MemoryDef>(&L)->setDefiningAccess(IncomingVal);
-        IncomingVal = &L;
-        break;
-      case Value::MemoryPhiVal:
+      if (MemoryUseOrDef *MUD = dyn_cast<MemoryUseOrDef>(&L)) {
+        if (MUD->getDefiningAccess() == nullptr)
+          MUD->setDefiningAccess(IncomingVal);
+        if (isa<MemoryDef>(&L))
+          IncomingVal = &L;
+      } else {
         IncomingVal = &L;
-        break;
       }
     }
   }