[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