[PATCH] D32720: [LICM] Introduce a finer granularity option to compute early exits.

Aditya Kumar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 28 20:11:52 PDT 2022


hiraditya added a comment.
Herald added a project: All.

FYI, all the tests in this patch are already handled with the current licm. Do we still need this patch?

$ opt -S -licm loop-early-exits.ll

  ; ModuleID = 'licm.ll'
  source_filename = "licm.ll"
  
  declare void @use(i64)
  
  declare void @use_nothing()
  
  ; Function Attrs: nounwind
  declare void @call_nothrow() #0
  
  define void @throw_header1(i64 %x, i64 %y, i1* %cond) {
  entry:
    %div = udiv i64 %x, %y
    br label %loop
  
  loop:                                             ; preds = %loop, %entry
    call void @use(i64 %div)
    br label %loop
  }
  
  define void @throw_header2(i64 %x, i64 %y, i1* %cond) {
  entry:
    br label %loop
  
  loop:                                             ; preds = %loop, %entry
    call void @use_nothing()
    %div = udiv i64 %x, %y
    call void @use(i64 %div)
    br label %loop
  }
  
  define void @throw_body1(i64 %x, i64 %y, i1* %cond) {
  entry:
    %div = udiv i64 %x, %y
    br label %loop
  
  loop:                                             ; preds = %body, %entry
    br label %body
  
  body:                                             ; preds = %loop
    call void @use(i64 %div)
    br i1 false, label %loop, label %exit
  
  exit:                                             ; preds = %body
    ret void
  }
  
  define void @throw_body2(i64 %x, i64 %y, i1* %cond) {
  entry:
    br label %loop
  
  loop:                                             ; preds = %body, %entry
    br label %body
  
  body:                                             ; preds = %loop
    call void @use_nothing()
    %div = udiv i64 %x, %y
    call void @use(i64 %div)
    br i1 false, label %loop, label %exit
  
  exit:                                             ; preds = %body
    ret void
  }
  
  define void @throw_body3(i64 %x, i64 %y, i1* %cond) {
  entry:
    br label %loop
  
  loop:                                             ; preds = %body, %entry
    br label %body
  
  body:                                             ; preds = %loop
    call void @call_nothrow()
    %div = udiv i64 %x, %y
    call void @use(i64 %div)
    br i1 false, label %loop, label %exit
  
  exit:                                             ; preds = %body
    ret void
  }
  
  attributes #0 = { nounwind }


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

https://reviews.llvm.org/D32720



More information about the llvm-commits mailing list