[PATCH] D111272: [InlineCost] model calls to llvm.is.constant* more carefully

Kazu Hirata via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 7 15:51:02 PDT 2021


kazu added a comment.

Hi Nick,

I really like the idea of evaluating `__builin_constant_p`.  If it evaluates to true, we are all good.  Now, if it evaluates to false for now but later evaluates to true after some inlining, the cost may be wrong.  Should we worry about that?  I am guessing that's OK because statements inside the "then" clause of `__builtin_constant_p` tend to fold very well in most real world code.

By the way, could we have a shorter test?  If we just want to see the effect of `__builtin_constant_p` being folded to false, two function definitions should suffice like so:

  ; RUN: opt %s -passes=inline -inline-threshold=20 -S | FileCheck %s
  
  declare void @foo()
  
  define void @callee(i64 %val) {
  entry:
    %cond = call i1 @llvm.is.constant.i64(i64 %val)
    br i1 %cond, label %cond.true, label %cond.false
  
  cond.true:                                        ; preds = %entry
  ; Rack up costs with a couple of function calls so that this function
  ; gets inlined only when @llvm.is.constant.i64 is folded.  In reality,
  ; the "then" clause of __builtin_constant_p tends to have statements
  ; that fold very well, so the cost of the "then" clause is not a huge
  ; concern.
    call void @foo()
    call void @foo()
    ret void
  
  cond.false:                                       ; preds = %entry
    ret void
  }
  
  define void @caller(i64 %val) {
  ; CHECK-LABEL: @caller(
  ; CHECK-NEXT:  entry:
  ; CHECK-NEXT:    [[COND_I:%.*]] = call i1 @llvm.is.constant.i64(i64 [[VAL:%.*]])
  ; CHECK-NEXT:    br i1 [[COND_I]], label %[[COND_TRUE_I:.*]], label %[[COND_FALSE_I:.*]]
  ; CHECK:       [[COND_TRUE_I]]:
  ; CHECK-NEXT:    call void @foo()
  ; CHECK-NEXT:    call void @foo()
  ; CHECK-NEXT:    br label %[[CALLEE_EXIT:.*]]
  ; CHECK:       [[COND_FALSE_I]]:
  ; CHECK-NEXT:    br label %[[CALLEE_EXIT]]
  ; CHECK:       [[CALLEE_EXIT]]:
  ; CHECK-NEXT:    ret void
  entry:
    call void @callee(i64 %val)
    ret void
  }
  
  declare i1 @llvm.is.constant.i64(i64)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D111272



More information about the llvm-commits mailing list