Compiler projects using llvm
; RUN: opt %s -passes=inline -inline-threshold=20 -S | FileCheck %s

declare i1 @llvm.is.constant.i64(i64)
declare void @foo()

define void @callee(i64 %val) {
  %cond = call i1 @llvm.is.constant.i64(i64 %val)
  br i1 %cond, label %cond.true, label %cond.false

cond.true:
; 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:
  ret void
}

define void @caller(i64 %val) {
; CHECK-LABEL: @caller(
; 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
;
  call void @callee(i64 %val)
  ret void
}