[PATCH] D87163: [DSE] Switch to MemorySSA-backed DSE by default.

Florian Hahn via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 10:19:56 PDT 2020


fhahn added a comment.

In D87163#2274549 <https://reviews.llvm.org/D87163#2274549>, @dmajor wrote:

> Reduced a bit more: https://godbolt.org/z/j59evK (C++) and https://godbolt.org/z/8xG688 (IR) -- the store at line 43 of `while.end` has been removed.

Thanks! I reverted the change for now in fb109c42d91c <https://reviews.llvm.org/rGfb109c42d91c30c8c7497ef1fd7aff6f2969c6e7>.

I think the problem here is that the load in the loop has `liveOnEntry` as defining access (which is outside the loop), so according to MemorySSA, the load does not read the memory written by the store. A slightly further IR example with the MemorySSA printed: https://godbolt.org/z/G34oM4. I think this is similar to the issue https://bugs.llvm.org/show_bug.cgi?id=47498.

@asbirlea do you have any thoughts on the issue? Do I understand correctly that in the example, `%use = load i32, i32* %ptr.1, align 4` should have `; 8 = MemoryPhi({entry,1},{loop.latch,7})` as defining access?

  define i32 @test() {
  entry:
    %nodeStack = alloca [12 x i32], align 4
    %nodeStack.cast = bitcast [12 x i32]* %nodeStack to i8*
  ; 1 = MemoryDef(liveOnEntry)
    %c.1 = call i1 @cond(i32 1)
    br i1 %c.1, label %cleanup, label %loop.header
  
  loop.header:                                      ; preds = %loop.latch, %entry
  ; 8 = MemoryPhi({entry,1},{loop.latch,7})
    %depth.1 = phi i32 [ %depth.1.be, %loop.latch ], [ 0, %entry ]
    %cmp = icmp sgt i32 %depth.1, 0
    br i1 %cmp, label %cond.read, label %cond.store
  
  cond.read:                                        ; preds = %loop.header
    %sub = add nsw i32 %depth.1, -1
    %ptr.1 = getelementptr inbounds [12 x i32], [12 x i32]* %nodeStack, i32 0, i32 %sub
  ; MemoryUse(liveOnEntry)
    %use = load i32, i32* %ptr.1, align 4
  ; 2 = MemoryDef(8)
    %c.2 = call i1 @cond(i32 %use)
    br i1 %c.2, label %loop.latch, label %cond.store
  
  cond.store:                                       ; preds = %cond.read, %loop.header
  ; 9 = MemoryPhi({loop.header,8},{cond.read,2})
    %ptr.2 = getelementptr inbounds [12 x i32], [12 x i32]* %nodeStack, i32 0, i32 %depth.1
  ; 3 = MemoryDef(9)
    store i32 10, i32* %ptr.2, align 4
    %inc = add nsw i32 %depth.1, 1
  ; 4 = MemoryDef(3)
    %c.3 = call i1 @cond(i32 20)
    br i1 %c.3, label %cleanup, label %loop.latch
  
  loop.latch:                                       ; preds = %cond.store, %cond.read
  ; 7 = MemoryPhi({cond.read,2},{cond.store,4})
    %depth.1.be = phi i32 [ %sub, %cond.read ], [ %inc, %cond.store ]
    br label %loop.header
  
  cleanup:                                          ; preds = %cond.store, %entry
  ; 6 = MemoryPhi({entry,1},{cond.store,4})
  ; 5 = MemoryDef(6)
    call void @llvm.lifetime.end.p0i8(i64 48, i8* nonnull %nodeStack.cast)
    ret i32 20
  }




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D87163/new/

https://reviews.llvm.org/D87163



More information about the llvm-commits mailing list