; ModuleID = 'autogen_tmp/mac.bc'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128"
target triple = "i386-pc-linux-gnu"

define void @dummy_call() nounwind {
  %i = alloca i32, align 4
  call void @fw_data_get(i32 0, i32 0, i32 0, i32 0, float* null, i32 0, i32 0, i32 0)
  %1 = call i32 @fw_init_fw(i32 0)
  store i32 %1, i32* %i, align 4
  %2 = load i32* %i, align 4
  %3 = load i32* %i, align 4
  call void @fw_data_init(i32 0, i32 0, i32 0, i32 0, float* null, i32 %2, i32 %3, i32 0, float 0.000000e+00)
  call void @fw_op_start(i32 0)
  call void @fw_init_table()
  ret void
}

declare void @fw_data_get(i32, i32, i32, i32, float*, i32, i32, i32)

declare i32 @fw_init_fw(i32)

declare void @fw_data_init(i32, i32, i32, i32, float*, i32, i32, i32, float)

declare void @fw_op_start(i32)

declare void @fw_init_table()

define float @bar(float %c) nounwind readnone {
  %1 = fmul float %c, %c
  ret float %1
}

define float @foo(float* nocapture %c, float* nocapture %a, float* nocapture %b) nounwind {
  br label %1

; <label>:1                                       ; preds = %1, %0
  %i.01 = phi i32 [ 0, %0 ], [ %12, %1 ]
  %2 = getelementptr inbounds float* %b, i32 %i.01
  %3 = load float* %2, align 4, !tbaa !0
  %4 = getelementptr inbounds float* %c, i32 %i.01
  %5 = load float* %4, align 4, !tbaa !0
  %6 = getelementptr inbounds float* %a, i32 %i.01
  %7 = load float* %6, align 4, !tbaa !0
  %8 = fmul float %5, %7
  %9 = fadd float %3, %8
  %10 = fmul float %5, %3
  %11 = fadd float %9, %10
  store float %11, float* %6, align 4, !tbaa !0
  %12 = add nsw i32 %i.01, 1
  %exitcond = icmp eq i32 %12, 250
  br i1 %exitcond, label %13, label %1

; <label>:13                                      ; preds = %1
  %14 = getelementptr inbounds float* %b, i32 3
  %15 = load float* %14, align 4, !tbaa !0
  %16 = getelementptr inbounds float* %b, i32 5
  store float %15, float* %16, align 4, !tbaa !0
  %17 = load float* %14, align 4, !tbaa !0
  ret float %17
}

define void @foo2(float* nocapture %c, float* nocapture %a, float* nocapture %b) nounwind {
  br label %1

; <label>:1                                       ; preds = %18, %0
  %k.03 = phi i32 [ 0, %0 ], [ %19, %18 ]
  %2 = getelementptr inbounds float* %c, i32 %k.03
  %3 = load float* %2, align 4, !tbaa !0
  %4 = fadd float %3, 2.000000e+00
  store float %4, float* %2, align 4, !tbaa !0
  br label %.preheader

.preheader:                                       ; preds = %15, %1
  %j.02 = phi i32 [ 0, %1 ], [ %16, %15 ]
  br label %5

; <label>:5                                       ; preds = %5, %.preheader
  %i.01 = phi i32 [ 0, %.preheader ], [ %14, %5 ]
  %6 = getelementptr inbounds float* %a, i32 %i.01
  %7 = load float* %6, align 4, !tbaa !0
  %8 = getelementptr inbounds float* %c, i32 %i.01
  %9 = load float* %8, align 4, !tbaa !0
  %10 = fmul float %7, %9
  %11 = getelementptr inbounds float* %b, i32 %i.01
  %12 = load float* %11, align 4, !tbaa !0
  %13 = fadd float %10, %12
  store float %13, float* %11, align 4, !tbaa !0
  %14 = add nsw i32 %i.01, 1
  %exitcond = icmp eq i32 %14, 250
  br i1 %exitcond, label %15, label %5

; <label>:15                                      ; preds = %5
  %16 = add nsw i32 %j.02, 2
  %17 = icmp slt i32 %16, 250
  br i1 %17, label %.preheader, label %18

; <label>:18                                      ; preds = %15
  %19 = add nsw i32 %k.03, 2
  %20 = icmp slt i32 %19, 250
  br i1 %20, label %1, label %21

; <label>:21                                      ; preds = %18
  %22 = getelementptr inbounds float* %b, i32 2
  %23 = load float* %22, align 4, !tbaa !0
  %24 = getelementptr inbounds float* %b, i32 5
  store float %23, float* %24, align 4, !tbaa !0
  ret void
}

define float @foo_bar(float* nocapture %b, float* nocapture %a, float* nocapture %c) nounwind {
  br label %1

; <label>:1                                       ; preds = %1, %0
  %i.01 = phi i32 [ 0, %0 ], [ %10, %1 ]
  %2 = getelementptr inbounds float* %b, i32 %i.01
  %3 = load float* %2, align 4, !tbaa !0
  %4 = add nsw i32 %i.01, 2
  %5 = getelementptr inbounds float* %c, i32 %4
  %6 = load float* %5, align 4, !tbaa !0
  %7 = fmul float %6, %3
  %8 = fadd float %3, %7
  %9 = getelementptr inbounds float* %a, i32 %4
  store float %8, float* %9, align 4, !tbaa !0
  %10 = add nsw i32 %i.01, 1
  %exitcond = icmp eq i32 %10, 250
  br i1 %exitcond, label %11, label %1

; <label>:11                                      ; preds = %1
  %12 = getelementptr inbounds float* %a, i32 6
  %13 = load float* %12, align 4, !tbaa !0
  %14 = getelementptr inbounds float* %b, i32 3
  store float %13, float* %14, align 4, !tbaa !0
  ret float %13
}

define void @compute(float* nocapture %a, float* nocapture %b, float* nocapture %c, i32 %decide) nounwind {
  %1 = icmp eq i32 %decide, 0
  br i1 %1, label %4, label %2

; <label>:2                                       ; preds = %0
  %3 = tail call float @foo(float* %c, float* %a, float* %b)
  br label %5

; <label>:4                                       ; preds = %0
  tail call void @foo2(float* %b, float* %a, float* %c)
  br label %5

; <label>:5                                       ; preds = %4, %2
  ret void
}

define i32 @main() nounwind {
  %a = alloca [256 x float], align 4
  %b = alloca [256 x float], align 4
  %c = alloca [256 x float], align 4
  br label %1

; <label>:1                                       ; preds = %1, %0
  %i.02 = phi i32 [ 0, %0 ], [ %5, %1 ]
  %2 = getelementptr inbounds [256 x float]* %a, i32 0, i32 %i.02
  store float 1.000000e+01, float* %2, align 4, !tbaa !0
  %3 = getelementptr inbounds [256 x float]* %b, i32 0, i32 %i.02
  store float 2.000000e+00, float* %3, align 4, !tbaa !0
  %4 = getelementptr inbounds [256 x float]* %c, i32 0, i32 %i.02
  store float 1.000000e+00, float* %4, align 4, !tbaa !0
  %5 = add nsw i32 %i.02, 1
  %exitcond3 = icmp eq i32 %5, 256
  br i1 %exitcond3, label %6, label %1

; <label>:6                                       ; preds = %1
  %7 = getelementptr inbounds [256 x float]* %a, i32 0, i32 1
  %8 = ptrtoint float* %7 to i32
  %9 = and i32 %8, -8
  %10 = inttoptr i32 %9 to float*
  %11 = getelementptr inbounds [256 x float]* %b, i32 0, i32 1
  %12 = ptrtoint float* %11 to i32
  %13 = and i32 %12, -8
  %14 = inttoptr i32 %13 to float*
  %15 = getelementptr inbounds [256 x float]* %c, i32 0, i32 1
  %16 = ptrtoint float* %15 to i32
  %17 = and i32 %16, -8
  %18 = inttoptr i32 %17 to float*
  br label %19

; <label>:19                                      ; preds = %19, %6
  %i.11 = phi i32 [ 0, %6 ], [ %20, %19 ]
  call void @compute(float* %10, float* %14, float* %18, i32 0)
  %20 = add nsw i32 %i.11, 1
  %exitcond = icmp eq i32 %20, 10000
  br i1 %exitcond, label %21, label %19

; <label>:21                                      ; preds = %19
  ret i32 0
}

!0 = metadata !{metadata !"float", metadata !1}
!1 = metadata !{metadata !"omnipotent char", metadata !2}
!2 = metadata !{metadata !"Simple C/C++ TBAA", null}
