OSDN Git Service

[MemorySSA] Consider def-only BBs for live-in calculations.
authorGeorge Burgess IV <george.burgess.iv@gmail.com>
Mon, 21 Mar 2016 21:25:39 +0000 (21:25 +0000)
committerGeorge Burgess IV <george.burgess.iv@gmail.com>
Mon, 21 Mar 2016 21:25:39 +0000 (21:25 +0000)
If we have a BB with only MemoryDefs, live-in calculations will ignore
it. This means we get results like this:

define void @foo(i8* %p) {
  ; 1 = MemoryDef(liveOnEntry)
  store i8 0, i8* %p
  br i1 undef, label %if.then, label %if.end

if.then:
  ; 2 = MemoryDef(1)
  store i8 1, i8* %p
  br label %if.end

if.end:
  ; 3 = MemoryDef(1)
  store i8 2, i8* %p
  ret void
}

...When there should be a MemoryPhi in the `if.end` BB.

This patch fixes that behavior.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@263991 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/MemorySSA.cpp
test/Transforms/Util/MemorySSA/livein.ll

index f49d666..a794406 100644 (file)
@@ -253,17 +253,13 @@ MemorySSAWalker *MemorySSA::buildMemorySSA(AliasAnalysis *AA,
   // Go through each block, figure out where defs occur, and chain together all
   // the accesses.
   for (BasicBlock &B : F) {
-    bool InsertIntoDefUse = false;
     bool InsertIntoDef = false;
     AccessListType *Accesses = nullptr;
     for (Instruction &I : B) {
       MemoryUseOrDef *MUD = createNewAccess(&I, true);
       if (!MUD)
         continue;
-      if (isa<MemoryDef>(MUD))
-        InsertIntoDef = true;
-      else
-        InsertIntoDefUse = true;
+      InsertIntoDef |= isa<MemoryDef>(MUD);
 
       if (!Accesses)
         Accesses = getOrCreateAccessList(&B);
@@ -271,7 +267,7 @@ MemorySSAWalker *MemorySSA::buildMemorySSA(AliasAnalysis *AA,
     }
     if (InsertIntoDef)
       DefiningBlocks.insert(&B);
-    if (InsertIntoDefUse)
+    if (Accesses)
       DefUseBlocks.insert(&B);
   }
 
index c6d7814..92d09f9 100644 (file)
@@ -27,3 +27,26 @@ merge:
 %c = load i8, i8* %0
 ret void 
 }
+
+; Ensure we treat def-only blocks as though they have uses for phi placement.
+; CHECK-LABEL: define void @F3
+define void @F3() {
+  %a = alloca i8
+; CHECK: 1 = MemoryDef(liveOnEntry)
+; CHECK-NEXT: store i8 0, i8* %a
+  store i8 0, i8* %a
+  br i1 undef, label %if.then, label %if.end
+
+if.then:
+; CHECK: 2 = MemoryDef(1)
+; CHECK-NEXT: store i8 1, i8* %a
+  store i8 1, i8* %a
+  br label %if.end
+
+if.end:
+; CHECK: 4 = MemoryPhi({%0,1},{if.then,2})
+; CHECK: 3 = MemoryDef(4)
+; CHECK-NEXT: store i8 2, i8* %a
+  store i8 2, i8* %a
+  ret void
+}