[PATCH] D39637: [GVN PRE] Patch the source for Phi node in PRE
Daniel Berlin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 8 20:59:02 PST 2017
dberlin added a comment.
Can you please fix LoadPRE as well?
ConstructSSALoadSet needs to be patching instructions it materializes if they come from an existing value.
Here is a testcase that demonstrates the problem:
@H = common global i32 0
@G = common global i32 0
define i32 @test(i1 %cond, i32 %v) nounwind {
entry:
br i1 %cond, label %bb, label %bb1
bb:
%add.1 = add nuw nsw i32 %v, -1
store i32 %add.1, i32* @G, align 4
br label %merge
bb1:
%add.2 = add i32 %v, -1
store i32 %add.2, i32* @G, align 4
br label %merge
merge:
%foo = load i32, i32* @G, align 4
%cmp = icmp sgt i32 %foo, 0
br i1 %cmp, label %action, label %return
action:
store i32 %foo, i32* @H, align 4
br label %return
return:
%p = phi i32 [0, %merge], [1, %action]
ret i32 %p
}
Output after -gvn:
; Function Attrs: nounwind
define i32 @test(i1 %cond, i32 %v) #0 {
entry:
br i1 %cond, label %bb, label %bb1
bb: ; preds = %entry
%add.1 = add nuw nsw i32 %v, -1
store i32 %add.1, i32* @G, align 4
br label %merge
bb1: ; preds = %entry
%add.2 = add i32 %v, -1
store i32 %add.2, i32* @G, align 4
br label %merge
merge: ; preds = %bb1, %bb
%foo = phi i32 [ %add.2, %bb1 ], [ %add.1, %bb ]
%cmp = icmp sgt i32 %foo, 0
br i1 %cmp, label %action, label %return
action: ; preds = %merge
store i32 %foo, i32* @H, align 4
br label %return
return: ; preds = %action, %merge
%p = phi i32 [ 0, %merge ], [ 1, %action ]
ret i32 %p
}
attributes #0 = { nounwind }
Output after jump threading:
; ModuleID = 'pre-jt-load.ll'
source_filename = "pre-jt-load.ll"
@H = common global i32 0
@G = common global i32 0
; Function Attrs: nounwind
define i32 @test(i1 %cond, i32 %v) #0 {
entry:
br i1 %cond, label %merge.thread, label %merge
merge.thread: ; preds = %entry
%add.1 = add nuw nsw i32 %v, -1
store i32 %add.1, i32* @G, align 4
br label %return
merge: ; preds = %entry
%add.2 = add i32 %v, -1
store i32 %add.2, i32* @G, align 4
%cmp = icmp sgt i32 %add.2, 0
br i1 %cmp, label %action, label %return
action: ; preds = %merge
store i32 %add.2, i32* @H, align 4
br label %return
return: ; preds = %merge.thread, %action, %merge
%p = phi i32 [ 0, %merge ], [ 1, %action ], [ 0, %merge.thread ]
ret i32 %p
}
attributes #0 = { nounwind }
https://reviews.llvm.org/D39637
More information about the llvm-commits
mailing list