; ModuleID = 'LFortran'
source_filename = "LFortran"

%array = type { i32*, i32, %dimension_descriptor*, i1, i32 }
%dimension_descriptor = type { i32, i32, i32 }

@0 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@1 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@2 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@3 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@4 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@5 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@6 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@7 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@8 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@9 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@10 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@11 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@12 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@13 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@14 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@15 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@16 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@17 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@18 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@19 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@20 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@21 = private unnamed_addr constant [11 x i8] c"ERROR STOP\00", align 1
@22 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@23 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@24 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@25 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1

define i32 @main(i32 %0, i8** %1) {
.entry:
  %r = alloca i32, align 4
  %stat = alloca i32, align 4
  call void @_lpython_call_initial_functions(i32 %0, i8** %1)
  %c = alloca %array*, align 8
  store %array* null, %array** %c, align 8
  %arr_desc = alloca %array, align 8
  %2 = getelementptr %array, %array* %arr_desc, i32 0, i32 2
  %3 = alloca i32, align 4
  store i32 3, i32* %3, align 4
  %4 = load i32, i32* %3, align 4
  %5 = alloca %dimension_descriptor, i32 %4, align 8
  store %dimension_descriptor* %5, %dimension_descriptor** %2, align 8
  %6 = getelementptr %array, %array* %arr_desc, i32 0, i32 4
  store i32 3, i32* %6, align 4
  %7 = getelementptr %array, %array* %arr_desc, i32 0, i32 0
  store i32* null, i32** %7, align 8
  store %array* %arr_desc, %array** %c, align 8
  %r1 = alloca i32, align 4
  %stat2 = alloca i32, align 4
  store i32 1, i32* %stat2, align 4
  %8 = load %array*, %array** %c, align 8
  %9 = ptrtoint %array* %8 to i32
  %10 = icmp eq i32 %9, 0
  br i1 %10, label %then, label %else

then:                                             ; preds = %.entry
  %11 = alloca %array, align 8
  %12 = getelementptr %array, %array* %11, i32 0, i32 2
  %13 = alloca i32, align 4
  store i32 3, i32* %13, align 4
  %14 = load i32, i32* %13, align 4
  %15 = alloca %dimension_descriptor, i32 %14, align 8
  store %dimension_descriptor* %15, %dimension_descriptor** %12, align 8
  %16 = getelementptr %array, %array* %11, i32 0, i32 4
  store i32 3, i32* %16, align 4
  store %array* %11, %array** %c, align 8
  br label %ifcont

else:                                             ; preds = %.entry
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  %17 = load %array*, %array** %c, align 8
  %18 = getelementptr %array, %array* %17, i32 0, i32 1
  store i32 0, i32* %18, align 4
  %19 = getelementptr %array, %array* %17, i32 0, i32 2
  %20 = load %dimension_descriptor*, %dimension_descriptor** %19, align 8
  %21 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %20, i32 0
  %22 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 0
  %23 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 1
  %24 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 2
  store i32 1, i32* %22, align 4
  store i32 1, i32* %23, align 4
  store i32 3, i32* %24, align 4
  %25 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %20, i32 1
  %26 = getelementptr %dimension_descriptor, %dimension_descriptor* %25, i32 0, i32 0
  %27 = getelementptr %dimension_descriptor, %dimension_descriptor* %25, i32 0, i32 1
  %28 = getelementptr %dimension_descriptor, %dimension_descriptor* %25, i32 0, i32 2
  store i32 3, i32* %26, align 4
  store i32 1, i32* %27, align 4
  store i32 3, i32* %28, align 4
  %29 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %20, i32 2
  %30 = getelementptr %dimension_descriptor, %dimension_descriptor* %29, i32 0, i32 0
  %31 = getelementptr %dimension_descriptor, %dimension_descriptor* %29, i32 0, i32 1
  %32 = getelementptr %dimension_descriptor, %dimension_descriptor* %29, i32 0, i32 2
  store i32 9, i32* %30, align 4
  store i32 1, i32* %31, align 4
  store i32 3, i32* %32, align 4
  %33 = getelementptr %array, %array* %17, i32 0, i32 0
  %34 = alloca i32, align 4
  store i32 108, i32* %34, align 4
  %35 = load i32, i32* %34, align 4
  %36 = call i8* @_lfortran_malloc(i32 %35)
  %37 = bitcast i8* %36 to i32*
  store i32* %37, i32** %33, align 8
  store i32 0, i32* %stat2, align 4
  %38 = load i32, i32* %stat2, align 4
  %39 = icmp ne i32 %38, 0
  br i1 %39, label %then3, label %else4

then3:                                            ; preds = %ifcont
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @20, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @18, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @19, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont5

else4:                                            ; preds = %ifcont
  br label %ifcont5

ifcont5:                                          ; preds = %else4, %then3
  %40 = load %array*, %array** %c, align 8
  %41 = getelementptr %array, %array* %40, i32 0, i32 2
  %42 = load %dimension_descriptor*, %dimension_descriptor** %41, align 8
  %43 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %42, i32 0
  %44 = getelementptr %dimension_descriptor, %dimension_descriptor* %43, i32 0, i32 1
  %45 = load i32, i32* %44, align 4
  %46 = sub i32 1, %45
  %47 = getelementptr %dimension_descriptor, %dimension_descriptor* %43, i32 0, i32 0
  %48 = load i32, i32* %47, align 4
  %49 = mul i32 %48, %46
  %50 = add i32 0, %49
  %51 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %42, i32 1
  %52 = getelementptr %dimension_descriptor, %dimension_descriptor* %51, i32 0, i32 1
  %53 = load i32, i32* %52, align 4
  %54 = sub i32 1, %53
  %55 = getelementptr %dimension_descriptor, %dimension_descriptor* %51, i32 0, i32 0
  %56 = load i32, i32* %55, align 4
  %57 = mul i32 %56, %54
  %58 = add i32 %50, %57
  %59 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %42, i32 2
  %60 = getelementptr %dimension_descriptor, %dimension_descriptor* %59, i32 0, i32 1
  %61 = load i32, i32* %60, align 4
  %62 = sub i32 1, %61
  %63 = getelementptr %dimension_descriptor, %dimension_descriptor* %59, i32 0, i32 0
  %64 = load i32, i32* %63, align 4
  %65 = mul i32 %64, %62
  %66 = add i32 %58, %65
  %67 = getelementptr %array, %array* %40, i32 0, i32 1
  %68 = load i32, i32* %67, align 4
  %69 = add i32 %66, %68
  %70 = getelementptr %array, %array* %40, i32 0, i32 0
  %71 = load i32*, i32** %70, align 8
  %72 = getelementptr inbounds i32, i32* %71, i32 %69
  store i32 3, i32* %72, align 4
  %73 = load %array*, %array** %c, align 8
  %74 = getelementptr %array, %array* %73, i32 0, i32 0
  %75 = load i32*, i32** %74, align 8
  %76 = ptrtoint i32* %75 to i64
  %77 = icmp ne i64 %76, 0
  br i1 %77, label %then6, label %else7

then6:                                            ; preds = %ifcont5
  %78 = getelementptr %array, %array* %73, i32 0, i32 0
  %79 = load i32*, i32** %78, align 8
  %80 = alloca i8*, align 8
  %81 = bitcast i32* %79 to i8*
  store i8* %81, i8** %80, align 8
  %82 = load i8*, i8** %80, align 8
  call void @_lfortran_free(i8* %82)
  %83 = getelementptr %array, %array* %73, i32 0, i32 0
  store i32* null, i32** %83, align 8
  br label %ifcont8

else7:                                            ; preds = %ifcont5
  br label %ifcont8

ifcont8:                                          ; preds = %else7, %then6
  call void @h(%array** %c)
  %84 = call i32 @g(%array** %c)
  store i32 %84, i32* %r1, align 4
  %85 = load %array*, %array** %c, align 8
  %86 = getelementptr %array, %array* %85, i32 0, i32 2
  %87 = load %dimension_descriptor*, %dimension_descriptor** %86, align 8
  %88 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %87, i32 0
  %89 = getelementptr %dimension_descriptor, %dimension_descriptor* %88, i32 0, i32 1
  %90 = load i32, i32* %89, align 4
  %91 = sub i32 1, %90
  %92 = getelementptr %dimension_descriptor, %dimension_descriptor* %88, i32 0, i32 0
  %93 = load i32, i32* %92, align 4
  %94 = mul i32 %93, %91
  %95 = add i32 0, %94
  %96 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %87, i32 1
  %97 = getelementptr %dimension_descriptor, %dimension_descriptor* %96, i32 0, i32 1
  %98 = load i32, i32* %97, align 4
  %99 = sub i32 1, %98
  %100 = getelementptr %dimension_descriptor, %dimension_descriptor* %96, i32 0, i32 0
  %101 = load i32, i32* %100, align 4
  %102 = mul i32 %101, %99
  %103 = add i32 %95, %102
  %104 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %87, i32 2
  %105 = getelementptr %dimension_descriptor, %dimension_descriptor* %104, i32 0, i32 1
  %106 = load i32, i32* %105, align 4
  %107 = sub i32 1, %106
  %108 = getelementptr %dimension_descriptor, %dimension_descriptor* %104, i32 0, i32 0
  %109 = load i32, i32* %108, align 4
  %110 = mul i32 %109, %107
  %111 = add i32 %103, %110
  %112 = getelementptr %array, %array* %85, i32 0, i32 1
  %113 = load i32, i32* %112, align 4
  %114 = add i32 %111, %113
  %115 = getelementptr %array, %array* %85, i32 0, i32 0
  %116 = load i32*, i32** %115, align 8
  %117 = getelementptr inbounds i32, i32* %116, i32 %114
  %118 = load i32, i32* %117, align 4
  %119 = icmp ne i32 %118, 8
  br i1 %119, label %then9, label %else10

then9:                                            ; preds = %ifcont8
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @23, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @21, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @22, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont11

else10:                                           ; preds = %ifcont8
  br label %ifcont11

ifcont11:                                         ; preds = %else10, %then9
  %120 = load %array*, %array** %c, align 8
  %121 = getelementptr %array, %array* %120, i32 0, i32 2
  %122 = load %dimension_descriptor*, %dimension_descriptor** %121, align 8
  %123 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %122, i32 0
  %124 = getelementptr %dimension_descriptor, %dimension_descriptor* %123, i32 0, i32 1
  %125 = load i32, i32* %124, align 4
  %126 = sub i32 1, %125
  %127 = getelementptr %dimension_descriptor, %dimension_descriptor* %123, i32 0, i32 0
  %128 = load i32, i32* %127, align 4
  %129 = mul i32 %128, %126
  %130 = add i32 0, %129
  %131 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %122, i32 1
  %132 = getelementptr %dimension_descriptor, %dimension_descriptor* %131, i32 0, i32 1
  %133 = load i32, i32* %132, align 4
  %134 = sub i32 1, %133
  %135 = getelementptr %dimension_descriptor, %dimension_descriptor* %131, i32 0, i32 0
  %136 = load i32, i32* %135, align 4
  %137 = mul i32 %136, %134
  %138 = add i32 %130, %137
  %139 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %122, i32 2
  %140 = getelementptr %dimension_descriptor, %dimension_descriptor* %139, i32 0, i32 1
  %141 = load i32, i32* %140, align 4
  %142 = sub i32 1, %141
  %143 = getelementptr %dimension_descriptor, %dimension_descriptor* %139, i32 0, i32 0
  %144 = load i32, i32* %143, align 4
  %145 = mul i32 %144, %142
  %146 = add i32 %138, %145
  %147 = getelementptr %array, %array* %120, i32 0, i32 1
  %148 = load i32, i32* %147, align 4
  %149 = add i32 %146, %148
  %150 = getelementptr %array, %array* %120, i32 0, i32 0
  %151 = load i32*, i32** %150, align 8
  %152 = getelementptr inbounds i32, i32* %151, i32 %149
  %153 = load i32, i32* %152, align 4
  %154 = sext i32 %153 to i64
  %155 = call i8* (i32, i8*, ...) @_lcompilers_string_format_fortran(i32 2, i8* null, i32 2, i64 %154)
  call void (i8*, ...) @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @25, i32 0, i32 0), i8* %155, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @24, i32 0, i32 0))
  %156 = load %array*, %array** %c, align 8
  %157 = getelementptr %array, %array* %156, i32 0, i32 0
  %158 = load i32*, i32** %157, align 8
  %159 = ptrtoint i32* %158 to i64
  %160 = icmp ne i64 %159, 0
  br i1 %160, label %then12, label %else13

then12:                                           ; preds = %ifcont11
  %161 = getelementptr %array, %array* %156, i32 0, i32 0
  %162 = load i32*, i32** %161, align 8
  %163 = alloca i8*, align 8
  %164 = bitcast i32* %162 to i8*
  store i8* %164, i8** %163, align 8
  %165 = load i8*, i8** %163, align 8
  call void @_lfortran_free(i8* %165)
  %166 = getelementptr %array, %array* %156, i32 0, i32 0
  store i32* null, i32** %166, align 8
  br label %ifcont14

else13:                                           ; preds = %ifcont11
  br label %ifcont14

ifcont14:                                         ; preds = %else13, %then12
  call void @_lpython_free_argv()
  br label %return

return:                                           ; preds = %ifcont14
  ret i32 0
}

define void @f(%array** %c) {
.entry:
  %0 = load %array*, %array** %c, align 8
  %1 = ptrtoint %array* %0 to i32
  %2 = icmp eq i32 %1, 0
  br i1 %2, label %then, label %else

then:                                             ; preds = %.entry
  %3 = alloca %array, align 8
  %4 = getelementptr %array, %array* %3, i32 0, i32 2
  %5 = alloca i32, align 4
  store i32 3, i32* %5, align 4
  %6 = load i32, i32* %5, align 4
  %7 = alloca %dimension_descriptor, i32 %6, align 8
  store %dimension_descriptor* %7, %dimension_descriptor** %4, align 8
  %8 = getelementptr %array, %array* %3, i32 0, i32 4
  store i32 3, i32* %8, align 4
  store %array* %3, %array** %c, align 8
  br label %ifcont

else:                                             ; preds = %.entry
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  %9 = load %array*, %array** %c, align 8
  %10 = getelementptr %array, %array* %9, i32 0, i32 1
  store i32 0, i32* %10, align 4
  %11 = getelementptr %array, %array* %9, i32 0, i32 2
  %12 = load %dimension_descriptor*, %dimension_descriptor** %11, align 8
  %13 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %12, i32 0
  %14 = getelementptr %dimension_descriptor, %dimension_descriptor* %13, i32 0, i32 0
  %15 = getelementptr %dimension_descriptor, %dimension_descriptor* %13, i32 0, i32 1
  %16 = getelementptr %dimension_descriptor, %dimension_descriptor* %13, i32 0, i32 2
  store i32 1, i32* %14, align 4
  store i32 1, i32* %15, align 4
  store i32 3, i32* %16, align 4
  %17 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %12, i32 1
  %18 = getelementptr %dimension_descriptor, %dimension_descriptor* %17, i32 0, i32 0
  %19 = getelementptr %dimension_descriptor, %dimension_descriptor* %17, i32 0, i32 1
  %20 = getelementptr %dimension_descriptor, %dimension_descriptor* %17, i32 0, i32 2
  store i32 3, i32* %18, align 4
  store i32 1, i32* %19, align 4
  store i32 3, i32* %20, align 4
  %21 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %12, i32 2
  %22 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 0
  %23 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 1
  %24 = getelementptr %dimension_descriptor, %dimension_descriptor* %21, i32 0, i32 2
  store i32 9, i32* %22, align 4
  store i32 1, i32* %23, align 4
  store i32 3, i32* %24, align 4
  %25 = getelementptr %array, %array* %9, i32 0, i32 0
  %26 = alloca i32, align 4
  store i32 108, i32* %26, align 4
  %27 = load i32, i32* %26, align 4
  %28 = call i8* @_lfortran_malloc(i32 %27)
  %29 = bitcast i8* %28 to i32*
  store i32* %29, i32** %25, align 8
  %30 = load %array*, %array** %c, align 8
  %31 = getelementptr %array, %array* %30, i32 0, i32 2
  %32 = load %dimension_descriptor*, %dimension_descriptor** %31, align 8
  %33 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %32, i32 0
  %34 = getelementptr %dimension_descriptor, %dimension_descriptor* %33, i32 0, i32 1
  %35 = load i32, i32* %34, align 4
  %36 = sub i32 1, %35
  %37 = getelementptr %dimension_descriptor, %dimension_descriptor* %33, i32 0, i32 0
  %38 = load i32, i32* %37, align 4
  %39 = mul i32 %38, %36
  %40 = add i32 0, %39
  %41 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %32, i32 1
  %42 = getelementptr %dimension_descriptor, %dimension_descriptor* %41, i32 0, i32 1
  %43 = load i32, i32* %42, align 4
  %44 = sub i32 1, %43
  %45 = getelementptr %dimension_descriptor, %dimension_descriptor* %41, i32 0, i32 0
  %46 = load i32, i32* %45, align 4
  %47 = mul i32 %46, %44
  %48 = add i32 %40, %47
  %49 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %32, i32 2
  %50 = getelementptr %dimension_descriptor, %dimension_descriptor* %49, i32 0, i32 1
  %51 = load i32, i32* %50, align 4
  %52 = sub i32 1, %51
  %53 = getelementptr %dimension_descriptor, %dimension_descriptor* %49, i32 0, i32 0
  %54 = load i32, i32* %53, align 4
  %55 = mul i32 %54, %52
  %56 = add i32 %48, %55
  %57 = getelementptr %array, %array* %30, i32 0, i32 1
  %58 = load i32, i32* %57, align 4
  %59 = add i32 %56, %58
  %60 = getelementptr %array, %array* %30, i32 0, i32 0
  %61 = load i32*, i32** %60, align 8
  %62 = getelementptr inbounds i32, i32* %61, i32 %59
  store i32 99, i32* %62, align 4
  br label %return

return:                                           ; preds = %ifcont
  ret void
}

define i32 @g(%array** %x) {
.entry:
  %r = alloca i32, align 4
  %0 = load %array*, %array** %x, align 8
  %1 = getelementptr %array, %array* %0, i32 0, i32 2
  %2 = load %dimension_descriptor*, %dimension_descriptor** %1, align 8
  %3 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %2, i32 0
  %4 = getelementptr %dimension_descriptor, %dimension_descriptor* %3, i32 0, i32 1
  %5 = load i32, i32* %4, align 4
  %6 = sub i32 1, %5
  %7 = getelementptr %dimension_descriptor, %dimension_descriptor* %3, i32 0, i32 0
  %8 = load i32, i32* %7, align 4
  %9 = mul i32 %8, %6
  %10 = add i32 0, %9
  %11 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %2, i32 1
  %12 = getelementptr %dimension_descriptor, %dimension_descriptor* %11, i32 0, i32 1
  %13 = load i32, i32* %12, align 4
  %14 = sub i32 1, %13
  %15 = getelementptr %dimension_descriptor, %dimension_descriptor* %11, i32 0, i32 0
  %16 = load i32, i32* %15, align 4
  %17 = mul i32 %16, %14
  %18 = add i32 %10, %17
  %19 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %2, i32 2
  %20 = getelementptr %dimension_descriptor, %dimension_descriptor* %19, i32 0, i32 1
  %21 = load i32, i32* %20, align 4
  %22 = sub i32 1, %21
  %23 = getelementptr %dimension_descriptor, %dimension_descriptor* %19, i32 0, i32 0
  %24 = load i32, i32* %23, align 4
  %25 = mul i32 %24, %22
  %26 = add i32 %18, %25
  %27 = getelementptr %array, %array* %0, i32 0, i32 1
  %28 = load i32, i32* %27, align 4
  %29 = add i32 %26, %28
  %30 = getelementptr %array, %array* %0, i32 0, i32 0
  %31 = load i32*, i32** %30, align 8
  %32 = getelementptr inbounds i32, i32* %31, i32 %29
  %33 = load i32, i32* %32, align 4
  %34 = sext i32 %33 to i64
  %35 = call i8* (i32, i8*, ...) @_lcompilers_string_format_fortran(i32 2, i8* null, i32 2, i64 %34)
  call void (i8*, ...) @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @1, i32 0, i32 0), i8* %35, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0))
  %36 = load %array*, %array** %x, align 8
  %37 = getelementptr %array, %array* %36, i32 0, i32 2
  %38 = load %dimension_descriptor*, %dimension_descriptor** %37, align 8
  %39 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %38, i32 0
  %40 = getelementptr %dimension_descriptor, %dimension_descriptor* %39, i32 0, i32 1
  %41 = load i32, i32* %40, align 4
  %42 = sub i32 1, %41
  %43 = getelementptr %dimension_descriptor, %dimension_descriptor* %39, i32 0, i32 0
  %44 = load i32, i32* %43, align 4
  %45 = mul i32 %44, %42
  %46 = add i32 0, %45
  %47 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %38, i32 1
  %48 = getelementptr %dimension_descriptor, %dimension_descriptor* %47, i32 0, i32 1
  %49 = load i32, i32* %48, align 4
  %50 = sub i32 1, %49
  %51 = getelementptr %dimension_descriptor, %dimension_descriptor* %47, i32 0, i32 0
  %52 = load i32, i32* %51, align 4
  %53 = mul i32 %52, %50
  %54 = add i32 %46, %53
  %55 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %38, i32 2
  %56 = getelementptr %dimension_descriptor, %dimension_descriptor* %55, i32 0, i32 1
  %57 = load i32, i32* %56, align 4
  %58 = sub i32 1, %57
  %59 = getelementptr %dimension_descriptor, %dimension_descriptor* %55, i32 0, i32 0
  %60 = load i32, i32* %59, align 4
  %61 = mul i32 %60, %58
  %62 = add i32 %54, %61
  %63 = getelementptr %array, %array* %36, i32 0, i32 1
  %64 = load i32, i32* %63, align 4
  %65 = add i32 %62, %64
  %66 = getelementptr %array, %array* %36, i32 0, i32 0
  %67 = load i32*, i32** %66, align 8
  %68 = getelementptr inbounds i32, i32* %67, i32 %65
  %69 = load i32, i32* %68, align 4
  %70 = icmp ne i32 %69, 8
  br i1 %70, label %then, label %else

then:                                             ; preds = %.entry
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @4, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @2, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @3, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont

else:                                             ; preds = %.entry
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  %71 = load %array*, %array** %x, align 8
  %72 = getelementptr %array, %array* %71, i32 0, i32 0
  %73 = load i32*, i32** %72, align 8
  %74 = ptrtoint i32* %73 to i64
  %75 = icmp ne i64 %74, 0
  br i1 %75, label %then1, label %else2

then1:                                            ; preds = %ifcont
  %76 = getelementptr %array, %array* %71, i32 0, i32 0
  %77 = load i32*, i32** %76, align 8
  %78 = alloca i8*, align 8
  %79 = bitcast i32* %77 to i8*
  store i8* %79, i8** %78, align 8
  %80 = load i8*, i8** %78, align 8
  call void @_lfortran_free(i8* %80)
  %81 = getelementptr %array, %array* %71, i32 0, i32 0
  store i32* null, i32** %81, align 8
  br label %ifcont3

else2:                                            ; preds = %ifcont
  br label %ifcont3

ifcont3:                                          ; preds = %else2, %then1
  call void @f(%array** %x)
  %82 = load %array*, %array** %x, align 8
  %83 = getelementptr %array, %array* %82, i32 0, i32 2
  %84 = load %dimension_descriptor*, %dimension_descriptor** %83, align 8
  %85 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %84, i32 0
  %86 = getelementptr %dimension_descriptor, %dimension_descriptor* %85, i32 0, i32 1
  %87 = load i32, i32* %86, align 4
  %88 = sub i32 1, %87
  %89 = getelementptr %dimension_descriptor, %dimension_descriptor* %85, i32 0, i32 0
  %90 = load i32, i32* %89, align 4
  %91 = mul i32 %90, %88
  %92 = add i32 0, %91
  %93 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %84, i32 1
  %94 = getelementptr %dimension_descriptor, %dimension_descriptor* %93, i32 0, i32 1
  %95 = load i32, i32* %94, align 4
  %96 = sub i32 1, %95
  %97 = getelementptr %dimension_descriptor, %dimension_descriptor* %93, i32 0, i32 0
  %98 = load i32, i32* %97, align 4
  %99 = mul i32 %98, %96
  %100 = add i32 %92, %99
  %101 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %84, i32 2
  %102 = getelementptr %dimension_descriptor, %dimension_descriptor* %101, i32 0, i32 1
  %103 = load i32, i32* %102, align 4
  %104 = sub i32 1, %103
  %105 = getelementptr %dimension_descriptor, %dimension_descriptor* %101, i32 0, i32 0
  %106 = load i32, i32* %105, align 4
  %107 = mul i32 %106, %104
  %108 = add i32 %100, %107
  %109 = getelementptr %array, %array* %82, i32 0, i32 1
  %110 = load i32, i32* %109, align 4
  %111 = add i32 %108, %110
  %112 = getelementptr %array, %array* %82, i32 0, i32 0
  %113 = load i32*, i32** %112, align 8
  %114 = getelementptr inbounds i32, i32* %113, i32 %111
  %115 = load i32, i32* %114, align 4
  %116 = sext i32 %115 to i64
  %117 = call i8* (i32, i8*, ...) @_lcompilers_string_format_fortran(i32 2, i8* null, i32 2, i64 %116)
  call void (i8*, ...) @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @6, i32 0, i32 0), i8* %117, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @5, i32 0, i32 0))
  %118 = load %array*, %array** %x, align 8
  %119 = getelementptr %array, %array* %118, i32 0, i32 2
  %120 = load %dimension_descriptor*, %dimension_descriptor** %119, align 8
  %121 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %120, i32 0
  %122 = getelementptr %dimension_descriptor, %dimension_descriptor* %121, i32 0, i32 1
  %123 = load i32, i32* %122, align 4
  %124 = sub i32 1, %123
  %125 = getelementptr %dimension_descriptor, %dimension_descriptor* %121, i32 0, i32 0
  %126 = load i32, i32* %125, align 4
  %127 = mul i32 %126, %124
  %128 = add i32 0, %127
  %129 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %120, i32 1
  %130 = getelementptr %dimension_descriptor, %dimension_descriptor* %129, i32 0, i32 1
  %131 = load i32, i32* %130, align 4
  %132 = sub i32 1, %131
  %133 = getelementptr %dimension_descriptor, %dimension_descriptor* %129, i32 0, i32 0
  %134 = load i32, i32* %133, align 4
  %135 = mul i32 %134, %132
  %136 = add i32 %128, %135
  %137 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %120, i32 2
  %138 = getelementptr %dimension_descriptor, %dimension_descriptor* %137, i32 0, i32 1
  %139 = load i32, i32* %138, align 4
  %140 = sub i32 1, %139
  %141 = getelementptr %dimension_descriptor, %dimension_descriptor* %137, i32 0, i32 0
  %142 = load i32, i32* %141, align 4
  %143 = mul i32 %142, %140
  %144 = add i32 %136, %143
  %145 = getelementptr %array, %array* %118, i32 0, i32 1
  %146 = load i32, i32* %145, align 4
  %147 = add i32 %144, %146
  %148 = getelementptr %array, %array* %118, i32 0, i32 0
  %149 = load i32*, i32** %148, align 8
  %150 = getelementptr inbounds i32, i32* %149, i32 %147
  %151 = load i32, i32* %150, align 4
  %152 = icmp ne i32 %151, 99
  br i1 %152, label %then4, label %else5

then4:                                            ; preds = %ifcont3
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @9, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @7, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @8, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont6

else5:                                            ; preds = %ifcont3
  br label %ifcont6

ifcont6:                                          ; preds = %else5, %then4
  %153 = load %array*, %array** %x, align 8
  %154 = getelementptr %array, %array* %153, i32 0, i32 2
  %155 = load %dimension_descriptor*, %dimension_descriptor** %154, align 8
  %156 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %155, i32 0
  %157 = getelementptr %dimension_descriptor, %dimension_descriptor* %156, i32 0, i32 1
  %158 = load i32, i32* %157, align 4
  %159 = sub i32 1, %158
  %160 = getelementptr %dimension_descriptor, %dimension_descriptor* %156, i32 0, i32 0
  %161 = load i32, i32* %160, align 4
  %162 = mul i32 %161, %159
  %163 = add i32 0, %162
  %164 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %155, i32 1
  %165 = getelementptr %dimension_descriptor, %dimension_descriptor* %164, i32 0, i32 1
  %166 = load i32, i32* %165, align 4
  %167 = sub i32 1, %166
  %168 = getelementptr %dimension_descriptor, %dimension_descriptor* %164, i32 0, i32 0
  %169 = load i32, i32* %168, align 4
  %170 = mul i32 %169, %167
  %171 = add i32 %163, %170
  %172 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %155, i32 2
  %173 = getelementptr %dimension_descriptor, %dimension_descriptor* %172, i32 0, i32 1
  %174 = load i32, i32* %173, align 4
  %175 = sub i32 1, %174
  %176 = getelementptr %dimension_descriptor, %dimension_descriptor* %172, i32 0, i32 0
  %177 = load i32, i32* %176, align 4
  %178 = mul i32 %177, %175
  %179 = add i32 %171, %178
  %180 = getelementptr %array, %array* %153, i32 0, i32 1
  %181 = load i32, i32* %180, align 4
  %182 = add i32 %179, %181
  %183 = getelementptr %array, %array* %153, i32 0, i32 0
  %184 = load i32*, i32** %183, align 8
  %185 = getelementptr inbounds i32, i32* %184, i32 %182
  store i32 8, i32* %185, align 4
  store i32 0, i32* %r, align 4
  br label %return

return:                                           ; preds = %ifcont6
  %186 = load i32, i32* %r, align 4
  ret i32 %186
}

define void @h(%array** %c) {
.entry:
  %0 = load %array*, %array** %c, align 8
  %1 = getelementptr %array, %array* %0, i32 0, i32 0
  %2 = load i32*, i32** %1, align 8
  %3 = ptrtoint i32* %2 to i64
  %4 = icmp ne i64 %3, 0
  br i1 %4, label %then, label %else

then:                                             ; preds = %.entry
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @12, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @10, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @11, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont

else:                                             ; preds = %.entry
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  %5 = load %array*, %array** %c, align 8
  %6 = getelementptr %array, %array* %5, i32 0, i32 0
  %7 = load i32*, i32** %6, align 8
  %8 = ptrtoint i32* %7 to i64
  %9 = icmp ne i64 %8, 0
  br i1 %9, label %then1, label %else2

then1:                                            ; preds = %ifcont
  %10 = getelementptr %array, %array* %5, i32 0, i32 0
  %11 = load i32*, i32** %10, align 8
  %12 = alloca i8*, align 8
  %13 = bitcast i32* %11 to i8*
  store i8* %13, i8** %12, align 8
  %14 = load i8*, i8** %12, align 8
  call void @_lfortran_free(i8* %14)
  %15 = getelementptr %array, %array* %5, i32 0, i32 0
  store i32* null, i32** %15, align 8
  br label %ifcont3

else2:                                            ; preds = %ifcont
  br label %ifcont3

ifcont3:                                          ; preds = %else2, %then1
  call void @f(%array** %c)
  %16 = load %array*, %array** %c, align 8
  %17 = getelementptr %array, %array* %16, i32 0, i32 2
  %18 = load %dimension_descriptor*, %dimension_descriptor** %17, align 8
  %19 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %18, i32 0
  %20 = getelementptr %dimension_descriptor, %dimension_descriptor* %19, i32 0, i32 1
  %21 = load i32, i32* %20, align 4
  %22 = sub i32 1, %21
  %23 = getelementptr %dimension_descriptor, %dimension_descriptor* %19, i32 0, i32 0
  %24 = load i32, i32* %23, align 4
  %25 = mul i32 %24, %22
  %26 = add i32 0, %25
  %27 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %18, i32 1
  %28 = getelementptr %dimension_descriptor, %dimension_descriptor* %27, i32 0, i32 1
  %29 = load i32, i32* %28, align 4
  %30 = sub i32 1, %29
  %31 = getelementptr %dimension_descriptor, %dimension_descriptor* %27, i32 0, i32 0
  %32 = load i32, i32* %31, align 4
  %33 = mul i32 %32, %30
  %34 = add i32 %26, %33
  %35 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %18, i32 2
  %36 = getelementptr %dimension_descriptor, %dimension_descriptor* %35, i32 0, i32 1
  %37 = load i32, i32* %36, align 4
  %38 = sub i32 1, %37
  %39 = getelementptr %dimension_descriptor, %dimension_descriptor* %35, i32 0, i32 0
  %40 = load i32, i32* %39, align 4
  %41 = mul i32 %40, %38
  %42 = add i32 %34, %41
  %43 = getelementptr %array, %array* %16, i32 0, i32 1
  %44 = load i32, i32* %43, align 4
  %45 = add i32 %42, %44
  %46 = getelementptr %array, %array* %16, i32 0, i32 0
  %47 = load i32*, i32** %46, align 8
  %48 = getelementptr inbounds i32, i32* %47, i32 %45
  %49 = load i32, i32* %48, align 4
  %50 = sext i32 %49 to i64
  %51 = call i8* (i32, i8*, ...) @_lcompilers_string_format_fortran(i32 2, i8* null, i32 2, i64 %50)
  call void (i8*, ...) @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @14, i32 0, i32 0), i8* %51, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @13, i32 0, i32 0))
  %52 = load %array*, %array** %c, align 8
  %53 = getelementptr %array, %array* %52, i32 0, i32 2
  %54 = load %dimension_descriptor*, %dimension_descriptor** %53, align 8
  %55 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %54, i32 0
  %56 = getelementptr %dimension_descriptor, %dimension_descriptor* %55, i32 0, i32 1
  %57 = load i32, i32* %56, align 4
  %58 = sub i32 1, %57
  %59 = getelementptr %dimension_descriptor, %dimension_descriptor* %55, i32 0, i32 0
  %60 = load i32, i32* %59, align 4
  %61 = mul i32 %60, %58
  %62 = add i32 0, %61
  %63 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %54, i32 1
  %64 = getelementptr %dimension_descriptor, %dimension_descriptor* %63, i32 0, i32 1
  %65 = load i32, i32* %64, align 4
  %66 = sub i32 1, %65
  %67 = getelementptr %dimension_descriptor, %dimension_descriptor* %63, i32 0, i32 0
  %68 = load i32, i32* %67, align 4
  %69 = mul i32 %68, %66
  %70 = add i32 %62, %69
  %71 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %54, i32 2
  %72 = getelementptr %dimension_descriptor, %dimension_descriptor* %71, i32 0, i32 1
  %73 = load i32, i32* %72, align 4
  %74 = sub i32 1, %73
  %75 = getelementptr %dimension_descriptor, %dimension_descriptor* %71, i32 0, i32 0
  %76 = load i32, i32* %75, align 4
  %77 = mul i32 %76, %74
  %78 = add i32 %70, %77
  %79 = getelementptr %array, %array* %52, i32 0, i32 1
  %80 = load i32, i32* %79, align 4
  %81 = add i32 %78, %80
  %82 = getelementptr %array, %array* %52, i32 0, i32 0
  %83 = load i32*, i32** %82, align 8
  %84 = getelementptr inbounds i32, i32* %83, i32 %81
  %85 = load i32, i32* %84, align 4
  %86 = icmp ne i32 %85, 99
  br i1 %86, label %then4, label %else5

then4:                                            ; preds = %ifcont3
  call void (i8*, ...) @_lcompilers_print_error(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @17, i32 0, i32 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @15, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @16, i32 0, i32 0))
  call void @exit(i32 1)
  br label %ifcont6

else5:                                            ; preds = %ifcont3
  br label %ifcont6

ifcont6:                                          ; preds = %else5, %then4
  %87 = load %array*, %array** %c, align 8
  %88 = getelementptr %array, %array* %87, i32 0, i32 2
  %89 = load %dimension_descriptor*, %dimension_descriptor** %88, align 8
  %90 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %89, i32 0
  %91 = getelementptr %dimension_descriptor, %dimension_descriptor* %90, i32 0, i32 1
  %92 = load i32, i32* %91, align 4
  %93 = sub i32 1, %92
  %94 = getelementptr %dimension_descriptor, %dimension_descriptor* %90, i32 0, i32 0
  %95 = load i32, i32* %94, align 4
  %96 = mul i32 %95, %93
  %97 = add i32 0, %96
  %98 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %89, i32 1
  %99 = getelementptr %dimension_descriptor, %dimension_descriptor* %98, i32 0, i32 1
  %100 = load i32, i32* %99, align 4
  %101 = sub i32 1, %100
  %102 = getelementptr %dimension_descriptor, %dimension_descriptor* %98, i32 0, i32 0
  %103 = load i32, i32* %102, align 4
  %104 = mul i32 %103, %101
  %105 = add i32 %97, %104
  %106 = getelementptr inbounds %dimension_descriptor, %dimension_descriptor* %89, i32 2
  %107 = getelementptr %dimension_descriptor, %dimension_descriptor* %106, i32 0, i32 1
  %108 = load i32, i32* %107, align 4
  %109 = sub i32 1, %108
  %110 = getelementptr %dimension_descriptor, %dimension_descriptor* %106, i32 0, i32 0
  %111 = load i32, i32* %110, align 4
  %112 = mul i32 %111, %109
  %113 = add i32 %105, %112
  %114 = getelementptr %array, %array* %87, i32 0, i32 1
  %115 = load i32, i32* %114, align 4
  %116 = add i32 %113, %115
  %117 = getelementptr %array, %array* %87, i32 0, i32 0
  %118 = load i32*, i32** %117, align 8
  %119 = getelementptr inbounds i32, i32* %118, i32 %116
  store i32 8, i32* %119, align 4
  br label %return

return:                                           ; preds = %ifcont6
  ret void
}

declare i8* @_lfortran_malloc(i32)

declare i8* @_lcompilers_string_format_fortran(i32, i8*, ...)

declare void @_lfortran_printf(i8*, ...)

declare void @_lcompilers_print_error(i8*, ...)

declare void @exit(i32)

declare void @_lfortran_free(i8*)

declare void @_lpython_call_initial_functions(i32, i8**)

declare void @_lpython_free_argv()
