;RUN: dsaopt %s -dsa-cbu -analyze -check-callees=lreadf,f_ungetc,lreadr
;RUN: dsaopt %s -dsa-cbu -analyze -check-callees=lreadr,f_ungetc,f_getc

; ModuleID = 'test1.o'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"

%struct.FILE = type { i32, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, i8*, %struct._IO_marker*, %struct.FILE*, i32, i32, i64, i16, i8, [1 x i8], i8*, i64, i8*, i8*, i8*, i8*, i64, i32, [20 x i8] }
%struct._IO_marker = type { %struct._IO_marker*, %struct.FILE*, i32 }
%struct.gen_readio = type { i32 (i8*)*, void (i32, i8*)*, i8* }

define i32* @lreadr(%struct.gen_readio* %f) nounwind {
entry:
  %f_addr = alloca %struct.gen_readio*            ; <%struct.gen_readio**> [#uses=5]
  %retval = alloca i32*                           ; <i32**> [#uses=2]
  %0 = alloca i32*                                ; <i32**> [#uses=2]
  %t = alloca i32                                 ; <i32*> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
  store %struct.gen_readio* %f, %struct.gen_readio** %f_addr
  %1 = load %struct.gen_readio*, %struct.gen_readio** %f_addr, align 8 ; <%struct.gen_readio*> [#uses=1]
  %2 = getelementptr inbounds %struct.gen_readio* %1, i32 0, i32 0 ; <i32 (i8*)**> [#uses=1]
  %3 = load i32 (i8*)*, i32 (i8*)** %2, align 8               ; <i32 (i8*)*> [#uses=1]
  %4 = load %struct.gen_readio*, %struct.gen_readio** %f_addr, align 8 ; <%struct.gen_readio*> [#uses=1]
  %5 = getelementptr inbounds %struct.gen_readio* %4, i32 0, i32 2 ; <i8**> [#uses=1]
  %6 = load i8*, i8** %5, align 8                      ; <i8*> [#uses=1]
  %7 = call i32 %3(i8* %6) nounwind               ; <i32> [#uses=1]
  store i32 %7, i32* %t, align 4
  %8 = load %struct.gen_readio*, %struct.gen_readio** %f_addr, align 8 ; <%struct.gen_readio*> [#uses=1]
  %9 = getelementptr inbounds %struct.gen_readio* %8, i32 0, i32 1 ; <void (i32, i8*)**> [#uses=1]
  %10 = load void (i32, i8*)*, void (i32, i8*)** %9, align 8        ; <void (i32, i8*)*> [#uses=1]
  %11 = load %struct.gen_readio*, %struct.gen_readio** %f_addr, align 8 ; <%struct.gen_readio*> [#uses=1]
  %12 = getelementptr inbounds %struct.gen_readio* %11, i32 0, i32 2 ; <i8**> [#uses=1]
  %13 = load i8*, i8** %12, align 8                    ; <i8*> [#uses=1]
  %14 = load i32, i32* %t, align 4                     ; <i32> [#uses=1]
  call void %10(i32 %14, i8* %13) nounwind
  %15 = call noalias i8* @malloc(i64 4) nounwind  ; <i8*> [#uses=1]
  %16 = bitcast i8* %15 to i32*                   ; <i32*> [#uses=1]
  store i32* %16, i32** %0, align 8
  %17 = load i32*, i32** %0, align 8                    ; <i32*> [#uses=1]
  store i32* %17, i32** %retval, align 8
  br label %return

return:                                           ; preds = %entry
  %retval1 = load i32*, i32** %retval                   ; <i32*> [#uses=1]
  ret i32* %retval1
}

declare noalias i8* @malloc(i64) nounwind

define void @init(%struct.gen_readio* %f, i32 (i8*)* %fcn) nounwind {
entry:
  %f_addr = alloca %struct.gen_readio*            ; <%struct.gen_readio**> [#uses=2]
  %fcn_addr = alloca i32 (i8*)*                   ; <i32 (i8*)**> [#uses=2]
  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
  store %struct.gen_readio* %f, %struct.gen_readio** %f_addr
  store i32 (i8*)* %fcn, i32 (i8*)** %fcn_addr
  %0 = load %struct.gen_readio*, %struct.gen_readio** %f_addr, align 8 ; <%struct.gen_readio*> [#uses=1]
  %1 = getelementptr inbounds %struct.gen_readio* %0, i32 0, i32 0 ; <i32 (i8*)**> [#uses=1]
  %2 = load i32 (i8*)*, i32 (i8*)** %fcn_addr, align 8        ; <i32 (i8*)*> [#uses=1]
  store i32 (i8*)* %2, i32 (i8*)** %1, align 8
  br label %return

return:                                           ; preds = %entry
  ret void
}

define i32* @lreadf(%struct.FILE* %f) nounwind {
entry:
  %f_addr = alloca %struct.FILE*                  ; <%struct.FILE**> [#uses=2]
  %retval = alloca i32*                           ; <i32**> [#uses=2]
  %0 = alloca i32*                                ; <i32**> [#uses=2]
  %s = alloca %struct.gen_readio                  ; <%struct.gen_readio*> [#uses=6]
  %c = alloca i32                                 ; <i32*> [#uses=1]
  %"alloca point" = bitcast i32 0 to i32          ; <i32> [#uses=0]
  store %struct.FILE* %f, %struct.FILE** %f_addr
  call void @init(%struct.gen_readio* %s, i32 (i8*)* bitcast (i32 (%struct.FILE*)* @f_getc to i32 (i8*)*)) nounwind
  %1 = getelementptr inbounds %struct.gen_readio* %s, i32 0, i32 1 ; <void (i32, i8*)**> [#uses=1]
  store void (i32, i8*)* bitcast (void (i32, %struct.FILE*)* @f_ungetc to void (i32, i8*)*), void (i32, i8*)** %1, align 8
  %2 = getelementptr inbounds %struct.gen_readio* %s, i32 0, i32 2 ; <i8**> [#uses=1]
  %3 = load %struct.FILE*, %struct.FILE** %f_addr, align 8       ; <%struct.FILE*> [#uses=1]
  %4 = bitcast %struct.FILE* %3 to i8*            ; <i8*> [#uses=1]
  store i8* %4, i8** %2, align 8
  %5 = getelementptr inbounds %struct.gen_readio* %s, i32 0, i32 1 ; <void (i32, i8*)**> [#uses=1]
  %6 = load void (i32, i8*)*, void (i32, i8*)** %5, align 8         ; <void (i32, i8*)*> [#uses=1]
  %7 = getelementptr inbounds %struct.gen_readio* %s, i32 0, i32 2 ; <i8**> [#uses=1]
  %8 = load i8*, i8** %7, align 8                      ; <i8*> [#uses=1]
  %9 = load i32, i32* %c, align 4                      ; <i32> [#uses=1]
  call void %6(i32 %9, i8* %8) nounwind
  %10 = call i32* @lreadr(%struct.gen_readio* %s) nounwind ; <i32*> [#uses=1]
  store i32* %10, i32** %0, align 8
  %11 = load i32*, i32** %0, align 8                    ; <i32*> [#uses=1]
  store i32* %11, i32** %retval, align 8
  br label %return

return:                                           ; preds = %entry
  %retval1 = load i32*, i32** %retval                   ; <i32*> [#uses=1]
  ret i32* %retval1
}

declare i32 @f_getc(%struct.FILE*)

declare void @f_ungetc(i32, %struct.FILE*)

define void @main() nounwind {
entry:
  br label %return

return:                                           ; preds = %entry
  ret void
}
