; Make sure that the CGSCC pass manager can handle when instcombine simplifies
; one libcall into an unrelated libcall and update the call graph accordingly.
;
; Also check that it can handle inlining *removing* a libcall entirely.
;
; Finally, we include some recursive patterns and forced analysis invaliadtion
; that can trigger infinite CGSCC refinement if not handled correctly.
;
; RUN: opt -passes='cgscc(inline,function(instcombine,invalidate<all>))' -S < %s | FileCheck %s

define i8* @wibble(i8* %arg1, i8* %arg2) {
; CHECK-LABEL: define i8* @wibble(
bb:
  %tmp = alloca [1024 x i8], align 16
  %tmp2 = getelementptr inbounds [1024 x i8], [1024 x i8]* %tmp, i64 0, i64 0
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp2, i8* %arg1, i64 1024, i32 0, i1 false)
; CHECK:         call void @llvm.memcpy
  %tmp3 = call i64 @llvm.objectsize.i64.p0i8(i8* %tmp2, i1 false, i1 true)
  %tmp4 = call i8* @__strncpy_chk(i8* %arg2, i8* %tmp2, i64 1023, i64 %tmp3)
; CHECK-NOT:     call
; CHECK:         call i8* @strncpy(i8* %arg2, i8* nonnull %tmp2, i64 1023)
; CHECK-NOT:     call

  ret i8* %tmp4
; CHECK:         ret
}

define i8* @strncpy(i8* %arg1, i8* %arg2, i64 %size) noinline {
bb:
  %result = call i8* @my_special_strncpy(i8* %arg1, i8* %arg2, i64 %size)
  ret i8* %result
}

declare i8* @my_special_strncpy(i8* %arg1, i8* %arg2, i64 %size)

declare i64 @llvm.objectsize.i64.p0i8(i8*, i1, i1)

declare i8* @__strncpy_chk(i8*, i8*, i64, i64)

declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1)

; Check that even when we completely remove a libcall we don't get the call
; graph wrong once we handle libcalls in the call graph specially to address
; the above case.
define i32 @hoge(i32* %arg1) {
; CHECK-LABEL: define i32 @hoge(
bb:
  %tmp41 = load i32*, i32** null
  %tmp6 = load i32, i32* %arg1
  %tmp7 = call i32 @ntohl(i32 %tmp6)
; CHECK-NOT: call i32 @ntohl
  ret i32 %tmp7
; CHECK: ret i32
}

; Even though this function is not used, it should be retained as it may be
; used when doing further libcall transformations.
define internal i32 @ntohl(i32 %x) {
; CHECK-LABEL: define internal i32 @ntohl(
entry:
  %and2 = lshr i32 %x, 8
  %shr = and i32 %and2, 65280
  ret i32 %shr
}

define i64 @write(i32 %i, i8* %p, i64 %j) {
entry:
  %val = call i64 @write_wrapper(i32 %i, i8* %p, i64 %j) noinline
  ret i64 %val
}

define i64 @write_wrapper(i32 %i, i8* %p, i64 %j) {
entry:
  %val = call i64 @write(i32 %i, i8* %p, i64 %j) noinline
  ret i64 %val
}
