; ModuleID = 'LFortran'
source_filename = "LFortran"
target datalayout = "..."

%string_descriptor = type <{ i8*, i64 }>

@0 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data = private constant [4 x i8] c"T>T:"
@string_const = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data, i32 0, i32 0), i64 4 }>
@1 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@2 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.1 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.2 = private constant [4 x i8] c"T>F:"
@string_const.3 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.2, i32 0, i32 0), i64 4 }>
@3 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@4 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.4 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.5 = private constant [4 x i8] c"F>T:"
@string_const.6 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.5, i32 0, i32 0), i64 4 }>
@5 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@6 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.7 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.8 = private constant [4 x i8] c"F>F:"
@string_const.9 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.8, i32 0, i32 0), i64 4 }>
@7 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@8 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.10 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.11 = private constant [4 x i8] c"T<T:"
@string_const.12 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.11, i32 0, i32 0), i64 4 }>
@9 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@10 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.13 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.14 = private constant [4 x i8] c"T<F:"
@string_const.15 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.14, i32 0, i32 0), i64 4 }>
@11 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@12 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.16 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.17 = private constant [4 x i8] c"F<T:"
@string_const.18 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.17, i32 0, i32 0), i64 4 }>
@13 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1
@14 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@serialization_info.19 = private unnamed_addr constant [13 x i8] c"S-DESC-4,L32\00", align 1
@string_const_data.20 = private constant [4 x i8] c"F<F:"
@string_const.21 = private global %string_descriptor <{ i8* getelementptr inbounds ([4 x i8], [4 x i8]* @string_const_data.20, i32 0, i32 0), i64 4 }>
@15 = private unnamed_addr constant [5 x i8] c"%s%s\00", align 1

define i32 @__module_operator_overloading_01_overload_comp_m_greater_than_inverse(i32* %log1, i32* %log2) {
.entry:
  %greater_than_inverse = alloca i32, align 4
  %0 = load i32, i32* %log1, align 4
  %1 = load i32, i32* %log2, align 4
  %2 = and i32 1, %1
  %3 = xor i32 %0, %2
  %4 = xor i32 %3, 1
  %5 = xor i32 %4, 0
  %6 = xor i32 %5, 1
  %7 = icmp ne i32 %6, 0
  br i1 %7, label %then, label %else

then:                                             ; preds = %.entry
  store i32 1, i32* %greater_than_inverse, align 4
  br label %ifcont

else:                                             ; preds = %.entry
  store i32 0, i32* %greater_than_inverse, align 4
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  br label %return

return:                                           ; preds = %ifcont
  br label %FINALIZE_SYMTABLE_greater_than_inverse

FINALIZE_SYMTABLE_greater_than_inverse:           ; preds = %return
  %8 = load i32, i32* %greater_than_inverse, align 4
  ret i32 %8
}

define i32 @__module_operator_overloading_01_overload_comp_m_less_than_inverse(i32* %log1, i32* %log2) {
.entry:
  %less_than_inverse = alloca i32, align 4
  %0 = load i32, i32* %log1, align 4
  %1 = load i32, i32* %log2, align 4
  %2 = and i32 0, %1
  %3 = xor i32 %0, %2
  %4 = xor i32 %3, 1
  %5 = xor i32 %4, 1
  %6 = xor i32 %5, 1
  %7 = icmp ne i32 %6, 0
  br i1 %7, label %then, label %else

then:                                             ; preds = %.entry
  store i32 1, i32* %less_than_inverse, align 4
  br label %ifcont

else:                                             ; preds = %.entry
  store i32 0, i32* %less_than_inverse, align 4
  br label %ifcont

ifcont:                                           ; preds = %else, %then
  br label %return

return:                                           ; preds = %ifcont
  br label %FINALIZE_SYMTABLE_less_than_inverse

FINALIZE_SYMTABLE_less_than_inverse:              ; preds = %return
  %8 = load i32, i32* %less_than_inverse, align 4
  ret i32 %8
}

define i32 @main(i32 %0, i8** %1) {
.entry:
  %2 = call i8* @_lfortran_get_default_allocator()
  call void @_lpython_call_initial_functions(i32 %0, i8** %1)
  %f = alloca i32, align 4
  store i32 0, i32* %f, align 4
  %t = alloca i32, align 4
  store i32 1, i32* %t, align 4
  %3 = alloca i64, align 8
  %4 = call i32 @__module_operator_overloading_01_overload_comp_m_greater_than_inverse(i32* %t, i32* %t)
  %5 = alloca i32, align 4
  store i32 %4, i32* %5, align 4
  %6 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info, i32 0, i32 0), i64* %3, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const, i32* %5)
  %7 = load i64, i64* %3, align 8
  %stringFormat_desc = alloca %string_descriptor, align 8
  %8 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc, i32 0, i32 0
  store i8* %6, i8** %8, align 8
  %9 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc, i32 0, i32 1
  store i64 %7, i64* %9, align 8
  %10 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc, i32 0, i32 0
  %11 = load i8*, i8** %10, align 8
  %12 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc, i32 0, i32 1
  %13 = load i64, i64* %12, align 8
  %14 = trunc i64 %13 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @1, i32 0, i32 0), i8* %11, i32 %14, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @0, i32 0, i32 0), i32 1)
  %15 = icmp eq i8* %6, null
  br i1 %15, label %free_done, label %free_nonnull

free_nonnull:                                     ; preds = %.entry
  call void @_lfortran_free_alloc(i8* %2, i8* %6)
  br label %free_done

free_done:                                        ; preds = %free_nonnull, %.entry
  %16 = alloca i64, align 8
  %17 = call i32 @__module_operator_overloading_01_overload_comp_m_greater_than_inverse(i32* %t, i32* %f)
  %18 = alloca i32, align 4
  store i32 %17, i32* %18, align 4
  %19 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.1, i32 0, i32 0), i64* %16, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.3, i32* %18)
  %20 = load i64, i64* %16, align 8
  %stringFormat_desc1 = alloca %string_descriptor, align 8
  %21 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc1, i32 0, i32 0
  store i8* %19, i8** %21, align 8
  %22 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc1, i32 0, i32 1
  store i64 %20, i64* %22, align 8
  %23 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc1, i32 0, i32 0
  %24 = load i8*, i8** %23, align 8
  %25 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc1, i32 0, i32 1
  %26 = load i64, i64* %25, align 8
  %27 = trunc i64 %26 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @3, i32 0, i32 0), i8* %24, i32 %27, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @2, i32 0, i32 0), i32 1)
  %28 = icmp eq i8* %19, null
  br i1 %28, label %free_done3, label %free_nonnull2

free_nonnull2:                                    ; preds = %free_done
  call void @_lfortran_free_alloc(i8* %2, i8* %19)
  br label %free_done3

free_done3:                                       ; preds = %free_nonnull2, %free_done
  %29 = alloca i64, align 8
  %30 = call i32 @__module_operator_overloading_01_overload_comp_m_greater_than_inverse(i32* %f, i32* %t)
  %31 = alloca i32, align 4
  store i32 %30, i32* %31, align 4
  %32 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.4, i32 0, i32 0), i64* %29, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.6, i32* %31)
  %33 = load i64, i64* %29, align 8
  %stringFormat_desc4 = alloca %string_descriptor, align 8
  %34 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc4, i32 0, i32 0
  store i8* %32, i8** %34, align 8
  %35 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc4, i32 0, i32 1
  store i64 %33, i64* %35, align 8
  %36 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc4, i32 0, i32 0
  %37 = load i8*, i8** %36, align 8
  %38 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc4, i32 0, i32 1
  %39 = load i64, i64* %38, align 8
  %40 = trunc i64 %39 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @5, i32 0, i32 0), i8* %37, i32 %40, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @4, i32 0, i32 0), i32 1)
  %41 = icmp eq i8* %32, null
  br i1 %41, label %free_done6, label %free_nonnull5

free_nonnull5:                                    ; preds = %free_done3
  call void @_lfortran_free_alloc(i8* %2, i8* %32)
  br label %free_done6

free_done6:                                       ; preds = %free_nonnull5, %free_done3
  %42 = alloca i64, align 8
  %43 = call i32 @__module_operator_overloading_01_overload_comp_m_greater_than_inverse(i32* %f, i32* %f)
  %44 = alloca i32, align 4
  store i32 %43, i32* %44, align 4
  %45 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.7, i32 0, i32 0), i64* %42, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.9, i32* %44)
  %46 = load i64, i64* %42, align 8
  %stringFormat_desc7 = alloca %string_descriptor, align 8
  %47 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc7, i32 0, i32 0
  store i8* %45, i8** %47, align 8
  %48 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc7, i32 0, i32 1
  store i64 %46, i64* %48, align 8
  %49 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc7, i32 0, i32 0
  %50 = load i8*, i8** %49, align 8
  %51 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc7, i32 0, i32 1
  %52 = load i64, i64* %51, align 8
  %53 = trunc i64 %52 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @7, i32 0, i32 0), i8* %50, i32 %53, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @6, i32 0, i32 0), i32 1)
  %54 = icmp eq i8* %45, null
  br i1 %54, label %free_done9, label %free_nonnull8

free_nonnull8:                                    ; preds = %free_done6
  call void @_lfortran_free_alloc(i8* %2, i8* %45)
  br label %free_done9

free_done9:                                       ; preds = %free_nonnull8, %free_done6
  %55 = alloca i64, align 8
  %56 = call i32 @__module_operator_overloading_01_overload_comp_m_less_than_inverse(i32* %t, i32* %t)
  %57 = alloca i32, align 4
  store i32 %56, i32* %57, align 4
  %58 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.10, i32 0, i32 0), i64* %55, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.12, i32* %57)
  %59 = load i64, i64* %55, align 8
  %stringFormat_desc10 = alloca %string_descriptor, align 8
  %60 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc10, i32 0, i32 0
  store i8* %58, i8** %60, align 8
  %61 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc10, i32 0, i32 1
  store i64 %59, i64* %61, align 8
  %62 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc10, i32 0, i32 0
  %63 = load i8*, i8** %62, align 8
  %64 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc10, i32 0, i32 1
  %65 = load i64, i64* %64, align 8
  %66 = trunc i64 %65 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @9, i32 0, i32 0), i8* %63, i32 %66, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @8, i32 0, i32 0), i32 1)
  %67 = icmp eq i8* %58, null
  br i1 %67, label %free_done12, label %free_nonnull11

free_nonnull11:                                   ; preds = %free_done9
  call void @_lfortran_free_alloc(i8* %2, i8* %58)
  br label %free_done12

free_done12:                                      ; preds = %free_nonnull11, %free_done9
  %68 = alloca i64, align 8
  %69 = call i32 @__module_operator_overloading_01_overload_comp_m_less_than_inverse(i32* %t, i32* %f)
  %70 = alloca i32, align 4
  store i32 %69, i32* %70, align 4
  %71 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.13, i32 0, i32 0), i64* %68, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.15, i32* %70)
  %72 = load i64, i64* %68, align 8
  %stringFormat_desc13 = alloca %string_descriptor, align 8
  %73 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc13, i32 0, i32 0
  store i8* %71, i8** %73, align 8
  %74 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc13, i32 0, i32 1
  store i64 %72, i64* %74, align 8
  %75 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc13, i32 0, i32 0
  %76 = load i8*, i8** %75, align 8
  %77 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc13, i32 0, i32 1
  %78 = load i64, i64* %77, align 8
  %79 = trunc i64 %78 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @11, i32 0, i32 0), i8* %76, i32 %79, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @10, i32 0, i32 0), i32 1)
  %80 = icmp eq i8* %71, null
  br i1 %80, label %free_done15, label %free_nonnull14

free_nonnull14:                                   ; preds = %free_done12
  call void @_lfortran_free_alloc(i8* %2, i8* %71)
  br label %free_done15

free_done15:                                      ; preds = %free_nonnull14, %free_done12
  %81 = alloca i64, align 8
  %82 = call i32 @__module_operator_overloading_01_overload_comp_m_less_than_inverse(i32* %f, i32* %t)
  %83 = alloca i32, align 4
  store i32 %82, i32* %83, align 4
  %84 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.16, i32 0, i32 0), i64* %81, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.18, i32* %83)
  %85 = load i64, i64* %81, align 8
  %stringFormat_desc16 = alloca %string_descriptor, align 8
  %86 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc16, i32 0, i32 0
  store i8* %84, i8** %86, align 8
  %87 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc16, i32 0, i32 1
  store i64 %85, i64* %87, align 8
  %88 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc16, i32 0, i32 0
  %89 = load i8*, i8** %88, align 8
  %90 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc16, i32 0, i32 1
  %91 = load i64, i64* %90, align 8
  %92 = trunc i64 %91 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @13, i32 0, i32 0), i8* %89, i32 %92, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @12, i32 0, i32 0), i32 1)
  %93 = icmp eq i8* %84, null
  br i1 %93, label %free_done18, label %free_nonnull17

free_nonnull17:                                   ; preds = %free_done15
  call void @_lfortran_free_alloc(i8* %2, i8* %84)
  br label %free_done18

free_done18:                                      ; preds = %free_nonnull17, %free_done15
  %94 = alloca i64, align 8
  %95 = call i32 @__module_operator_overloading_01_overload_comp_m_less_than_inverse(i32* %f, i32* %f)
  %96 = alloca i32, align 4
  store i32 %95, i32* %96, align 4
  %97 = call i8* (i8*, i8*, i64, i8*, i64*, i32, i32, i32, i32, i32, ...) @_lcompilers_string_format_fortran(i8* %2, i8* null, i64 0, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @serialization_info.19, i32 0, i32 0), i64* %94, i32 0, i32 0, i32 0, i32 0, i32 0, %string_descriptor* @string_const.21, i32* %96)
  %98 = load i64, i64* %94, align 8
  %stringFormat_desc19 = alloca %string_descriptor, align 8
  %99 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc19, i32 0, i32 0
  store i8* %97, i8** %99, align 8
  %100 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc19, i32 0, i32 1
  store i64 %98, i64* %100, align 8
  %101 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc19, i32 0, i32 0
  %102 = load i8*, i8** %101, align 8
  %103 = getelementptr %string_descriptor, %string_descriptor* %stringFormat_desc19, i32 0, i32 1
  %104 = load i64, i64* %103, align 8
  %105 = trunc i64 %104 to i32
  call void @_lfortran_printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @15, i32 0, i32 0), i8* %102, i32 %105, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @14, i32 0, i32 0), i32 1)
  %106 = icmp eq i8* %97, null
  br i1 %106, label %free_done21, label %free_nonnull20

free_nonnull20:                                   ; preds = %free_done18
  call void @_lfortran_free_alloc(i8* %2, i8* %97)
  br label %free_done21

free_done21:                                      ; preds = %free_nonnull20, %free_done18
  br label %return

return:                                           ; preds = %free_done21
  br label %FINALIZE_SYMTABLE_operator_overloading_01

FINALIZE_SYMTABLE_operator_overloading_01:        ; preds = %return
  call void @_lfortran_internal_alloc_finalize()
  ret i32 0
}

declare void @_lpython_call_initial_functions(i32, i8**)

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

declare i8* @_lfortran_get_default_allocator()

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

declare void @_lfortran_free_alloc(i8*, i8*)

declare void @_lfortran_internal_alloc_finalize()
