Hao Jin via llvm-dev
2021-Mar-09 16:07 UTC
[llvm-dev] [MemSSA] Getting more precise information regarding MemoryPhi
Hello all, I am trying to use MemorySSA in my analysis and recently I got a problem about querying the clobbering memory access. For the example below, both the loads for %c and %d have the clobbering memory access 5 = MemoryPhi({if.then,2},{if.else,4}). I believe it can be further optimized. The stores that actually define %c are; 1 = MemoryDef(liveOnEntry) and ; 3 = MemoryDef(liveOnEntry) so the clobbering memory access for the load of %c could be another MemoryPhi({if.then,1},{if.else,3}). I understand that it is the design of memorySSA to have a single MemoryPhi for each Basicblock but I am wondering if I want to have more precise information like this, should this be done as a part of MemSSA/Walker or should the analysis that uses MemorySSA handle this? Thank you for your time and I am looking forward to your reply. Best, Hao int foo(int a, int b, int m){ int c; int d; if(m){ c = a; d = b; }else{ c = a; d = b; } return c+d; } Corresponding IR and MemSSA dump: define dso_local i32 @foo(i32 %a, i32 %b, i32 %m) { entry: %c = alloca i32, align 4 %d = alloca i32, align 4 %tobool = icmp ne i32 %m, 0 br i1 %tobool, label %if.then, label %if.else if.then: ; preds = %entry ; 1 = MemoryDef(liveOnEntry) store i32 %a, i32* %c, align 4 ; 2 = MemoryDef(1) store i32 %b, i32* %d, align 4 br label %if.end if.else: ; preds = %entry ; 3 = MemoryDef(liveOnEntry) store i32 %a, i32* %c, align 4 ; 4 = MemoryDef(3) store i32 %b, i32* %d, align 4 br label %if.end if.end: ; preds = %if.else, %if.then ; 5 = MemoryPhi({if.then,2},{if.else,4}) ; MemoryUse(5) MayAlias %0 = load i32, i32* %c, align 4 ; MemoryUse(5) MayAlias %1 = load i32, i32* %d, align 4 %add = add nsw i32 %0, %1 ret i32 %add } -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210309/e8acae55/attachment.html>
Alina Sbirlea via llvm-dev
2021-Mar-09 20:37 UTC
[llvm-dev] [MemSSA] Getting more precise information regarding MemoryPhi
Hi, Adding another MemoryPhi, or altering the current one will make MemorySSA invalid. So simply creating the instance `MemoryPhi({if.then,1},{if.else,3})` is not a valid option in the current implementation, regardless of where it is done. I would suggest doing the querying you need in the analysis that uses MemorySSA, and then figure out if it makes sense to have the same mechanics in a custom walker. Best, Alina On Tue, Mar 9, 2021 at 8:07 AM Hao Jin via llvm-dev <llvm-dev at lists.llvm.org> wrote:> Hello all, > > > > I am trying to use MemorySSA in my analysis and recently I got a problem > about querying the clobbering memory access. > > > > For the example below, both the loads for %c and %d have the clobbering > memory access 5 = MemoryPhi({if.then,2},{if.else,4}). > > > > I believe it can be further optimized. The stores that actually define %c > are; 1 = MemoryDef(liveOnEntry) and ; 3 = MemoryDef(liveOnEntry) so the > clobbering memory access for the load of %c could be another > MemoryPhi({if.then,1},{if.else,3}). > > > > I understand that it is the design of memorySSA to have a single MemoryPhi > for each Basicblock but I am wondering if I want to have more precise > information like this, should this be done as a part of MemSSA/Walker or > should the analysis that uses MemorySSA handle this? > > > > Thank you for your time and I am looking forward to your reply. > > Best, > > Hao > > > > int foo(int a, int b, int m){ > > int c; > > int d; > > if(m){ > > c = a; > > d = b; > > }else{ > > c = a; > > d = b; > > } > > return c+d; > > } > > > > Corresponding IR and MemSSA dump: > > define dso_local i32 @foo(i32 %a, i32 %b, i32 %m) { > > entry: > > %c = alloca i32, align 4 > > %d = alloca i32, align 4 > > %tobool = icmp ne i32 %m, 0 > > br i1 %tobool, label %if.then, label %if.else > > > > if.then: ; preds = %entry > > ; 1 = MemoryDef(liveOnEntry) > > store i32 %a, i32* %c, align 4 > > ; 2 = MemoryDef(1) > > store i32 %b, i32* %d, align 4 > > br label %if.end > > > > if.else: ; preds = %entry > > ; 3 = MemoryDef(liveOnEntry) > > store i32 %a, i32* %c, align 4 > > ; 4 = MemoryDef(3) > > store i32 %b, i32* %d, align 4 > > br label %if.end > > > > if.end: ; preds = %if.else, > %if.then > > ; 5 = MemoryPhi({if.then,2},{if.else,4}) > > ; MemoryUse(5) MayAlias > > %0 = load i32, i32* %c, align 4 > > ; MemoryUse(5) MayAlias > > %1 = load i32, i32* %d, align 4 > > %add = add nsw i32 %0, %1 > > ret i32 %add > > } > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210309/b10ae059/attachment.html>