--- /dev/null
+%Bool = type i1
+%Int = type i64
+%Real = type double
+%String = type { i64, i8* }
+declare void @A()
+declare %Int @A_Foo()
+declare %Int @A_Bar()
+%struct.0x703000000150 = type { %Int }
+%struct.0x7030000000c0 = type { %Int, %struct.0x703000000150, [5 x %Int] }
+%FooRec = type %struct.0x7030000000c0
+@Module_vBool = global %Bool 0
+
+@Module_vInt = global %Int 0
+
+@Module_vReal = global %Real 0.0
+
+@Module_vIntArray = global [42 x %Int] zeroinitializer
+
+@Module_vIntArray2 = global [5 x [5 x %Int]] zeroinitializer
+
+@Module_vRec1 = global %struct.0x7030000000c0 zeroinitializer
+
+@Module_vRec2 = global { %Int, [5 x %Int] } zeroinitializer
+
+define void @Module_TestReturnVoid()
+{
+L3:
+ ret void
+}
+
+define %Int @Module_TestReturnIntLiteral()
+{
+L6:
+ ret %Int 0
+}
+
+define %Real @Module_TestReturnRealLiteral()
+{
+L9:
+ ret %Real 0.000000
+}
+
+define %Bool @Module_TestReturnBoolLiteral()
+{
+L12:
+ ret %Bool 0
+}
+
+define void @Module_TestStoreLiterals()
+{
+L15:
+ store %Bool 1, %Bool* @Module_vBool
+ store %Int 42, %Int* @Module_vInt
+ store %Real 42.000000, %Real* @Module_vReal
+ ret void
+}
+
+define void @Module_TestIntArithOps()
+{
+L18:
+ %.6 = load %Int, %Int* @Module_vInt
+ %.7 = add %Int %.6, 1
+ store %Int %.7, %Int* @Module_vInt
+ %.8 = load %Int, %Int* @Module_vInt
+ %.9 = add %Int 1, %.8
+ store %Int %.9, %Int* @Module_vInt
+ %.10 = load %Int, %Int* @Module_vInt
+ %.11 = load %Int, %Int* @Module_vInt
+ %.12 = add %Int %.10, %.11
+ store %Int %.12, %Int* @Module_vInt
+ %.13 = load %Int, %Int* @Module_vInt
+ %.14 = sub %Int %.13, 1
+ store %Int %.14, %Int* @Module_vInt
+ %.15 = load %Int, %Int* @Module_vInt
+ %.16 = sub %Int 1, %.15
+ store %Int %.16, %Int* @Module_vInt
+ %.17 = load %Int, %Int* @Module_vInt
+ %.18 = load %Int, %Int* @Module_vInt
+ %.19 = sub %Int %.17, %.18
+ store %Int %.19, %Int* @Module_vInt
+ %.20 = load %Int, %Int* @Module_vInt
+ %.21 = mul %Int %.20, 1
+ store %Int %.21, %Int* @Module_vInt
+ %.22 = load %Int, %Int* @Module_vInt
+ %.23 = mul %Int 1, %.22
+ store %Int %.23, %Int* @Module_vInt
+ %.24 = load %Int, %Int* @Module_vInt
+ %.25 = load %Int, %Int* @Module_vInt
+ %.26 = mul %Int %.24, %.25
+ store %Int %.26, %Int* @Module_vInt
+ %.27 = load %Int, %Int* @Module_vInt
+ %.28 = sdiv %Int %.27, 1
+ store %Int %.28, %Int* @Module_vInt
+ %.29 = load %Int, %Int* @Module_vInt
+ %.30 = sdiv %Int 1, %.29
+ store %Int %.30, %Int* @Module_vInt
+ %.31 = load %Int, %Int* @Module_vInt
+ %.32 = load %Int, %Int* @Module_vInt
+ %.33 = sdiv %Int %.31, %.32
+ store %Int %.33, %Int* @Module_vInt
+ %.34 = load %Int, %Int* @Module_vInt
+ %.35 = srem %Int %.34, 1
+ store %Int %.35, %Int* @Module_vInt
+ %.36 = load %Int, %Int* @Module_vInt
+ %.37 = srem %Int 1, %.36
+ store %Int %.37, %Int* @Module_vInt
+ %.38 = load %Int, %Int* @Module_vInt
+ %.39 = load %Int, %Int* @Module_vInt
+ %.40 = srem %Int %.38, %.39
+ store %Int %.40, %Int* @Module_vInt
+ ret void
+}
+
+define void @Module_TestIntCompOps()
+{
+L21:
+ %.42 = load %Int, %Int* @Module_vInt
+ %.43 = icmp eq %Int %.42, 1
+ store %Bool %.43, %Bool* @Module_vBool
+ %.44 = load %Int, %Int* @Module_vInt
+ %.45 = icmp eq %Int 1, %.44
+ store %Bool %.45, %Bool* @Module_vBool
+ %.46 = load %Int, %Int* @Module_vInt
+ %.47 = load %Int, %Int* @Module_vInt
+ %.48 = icmp eq %Int %.46, %.47
+ store %Bool %.48, %Bool* @Module_vBool
+ %.49 = load %Int, %Int* @Module_vInt
+ %.50 = icmp ne %Int %.49, 1
+ store %Bool %.50, %Bool* @Module_vBool
+ %.51 = load %Int, %Int* @Module_vInt
+ %.52 = icmp ne %Int 1, %.51
+ store %Bool %.52, %Bool* @Module_vBool
+ %.53 = load %Int, %Int* @Module_vInt
+ %.54 = load %Int, %Int* @Module_vInt
+ %.55 = icmp ne %Int %.53, %.54
+ store %Bool %.55, %Bool* @Module_vBool
+ %.56 = load %Int, %Int* @Module_vInt
+ %.57 = icmp slt %Int %.56, 1
+ store %Bool %.57, %Bool* @Module_vBool
+ %.58 = load %Int, %Int* @Module_vInt
+ %.59 = icmp slt %Int 1, %.58
+ store %Bool %.59, %Bool* @Module_vBool
+ %.60 = load %Int, %Int* @Module_vInt
+ %.61 = load %Int, %Int* @Module_vInt
+ %.62 = icmp slt %Int %.60, %.61
+ store %Bool %.62, %Bool* @Module_vBool
+ %.63 = load %Int, %Int* @Module_vInt
+ %.64 = icmp sgt %Int %.63, 1
+ store %Bool %.64, %Bool* @Module_vBool
+ %.65 = load %Int, %Int* @Module_vInt
+ %.66 = icmp sgt %Int 1, %.65
+ store %Bool %.66, %Bool* @Module_vBool
+ %.67 = load %Int, %Int* @Module_vInt
+ %.68 = load %Int, %Int* @Module_vInt
+ %.69 = icmp sgt %Int %.67, %.68
+ store %Bool %.69, %Bool* @Module_vBool
+ %.70 = load %Int, %Int* @Module_vInt
+ %.71 = icmp sle %Int %.70, 1
+ store %Bool %.71, %Bool* @Module_vBool
+ %.72 = load %Int, %Int* @Module_vInt
+ %.73 = icmp sle %Int 1, %.72
+ store %Bool %.73, %Bool* @Module_vBool
+ %.74 = load %Int, %Int* @Module_vInt
+ %.75 = load %Int, %Int* @Module_vInt
+ %.76 = icmp sle %Int %.74, %.75
+ store %Bool %.76, %Bool* @Module_vBool
+ %.77 = load %Int, %Int* @Module_vInt
+ %.78 = icmp sge %Int %.77, 1
+ store %Bool %.78, %Bool* @Module_vBool
+ %.79 = load %Int, %Int* @Module_vInt
+ %.80 = icmp sge %Int 1, %.79
+ store %Bool %.80, %Bool* @Module_vBool
+ %.81 = load %Int, %Int* @Module_vInt
+ %.82 = load %Int, %Int* @Module_vInt
+ %.83 = icmp sge %Int %.81, %.82
+ store %Bool %.83, %Bool* @Module_vBool
+ ret void
+}
+
+define void @Module_TestRealArithOps()
+{
+L24:
+ %.85 = load %Real, %Real* @Module_vReal
+ %.86 = fadd %Real %.85, 1.000000
+ store %Real %.86, %Real* @Module_vReal
+ %.87 = load %Real, %Real* @Module_vReal
+ %.88 = fadd %Real 1.000000, %.87
+ store %Real %.88, %Real* @Module_vReal
+ %.89 = load %Real, %Real* @Module_vReal
+ %.90 = load %Real, %Real* @Module_vReal
+ %.91 = fadd %Real %.89, %.90
+ store %Real %.91, %Real* @Module_vReal
+ %.92 = load %Real, %Real* @Module_vReal
+ %.93 = fsub %Real %.92, 1.000000
+ store %Real %.93, %Real* @Module_vReal
+ %.94 = load %Real, %Real* @Module_vReal
+ %.95 = fsub %Real 1.000000, %.94
+ store %Real %.95, %Real* @Module_vReal
+ %.96 = load %Real, %Real* @Module_vReal
+ %.97 = load %Real, %Real* @Module_vReal
+ %.98 = fsub %Real %.96, %.97
+ store %Real %.98, %Real* @Module_vReal
+ %.99 = load %Real, %Real* @Module_vReal
+ %.100 = fmul %Real %.99, 1.000000
+ store %Real %.100, %Real* @Module_vReal
+ %.101 = load %Real, %Real* @Module_vReal
+ %.102 = fmul %Real 1.000000, %.101
+ store %Real %.102, %Real* @Module_vReal
+ %.103 = load %Real, %Real* @Module_vReal
+ %.104 = load %Real, %Real* @Module_vReal
+ %.105 = fmul %Real %.103, %.104
+ store %Real %.105, %Real* @Module_vReal
+ %.106 = load %Real, %Real* @Module_vReal
+ %.107 = fdiv %Real %.106, 1.000000
+ store %Real %.107, %Real* @Module_vReal
+ %.108 = load %Real, %Real* @Module_vReal
+ %.109 = fdiv %Real 1.000000, %.108
+ store %Real %.109, %Real* @Module_vReal
+ %.110 = load %Real, %Real* @Module_vReal
+ %.111 = load %Real, %Real* @Module_vReal
+ %.112 = fdiv %Real %.110, %.111
+ store %Real %.112, %Real* @Module_vReal
+ %.113 = load %Real, %Real* @Module_vReal
+ %.114 = frem %Real %.113, 1.000000
+ store %Real %.114, %Real* @Module_vReal
+ %.115 = load %Real, %Real* @Module_vReal
+ %.116 = frem %Real 1.000000, %.115
+ store %Real %.116, %Real* @Module_vReal
+ %.117 = load %Real, %Real* @Module_vReal
+ %.118 = load %Real, %Real* @Module_vReal
+ %.119 = frem %Real %.117, %.118
+ store %Real %.119, %Real* @Module_vReal
+ ret void
+}
+
+define void @Module_TestRealCompOps()
+{
+L27:
+ %.121 = load %Real, %Real* @Module_vReal
+ %.122 = fcmp oeq %Real %.121, 1.000000
+ store %Bool %.122, %Bool* @Module_vBool
+ %.123 = load %Real, %Real* @Module_vReal
+ %.124 = fcmp oeq %Real 1.000000, %.123
+ store %Bool %.124, %Bool* @Module_vBool
+ %.125 = load %Real, %Real* @Module_vReal
+ %.126 = load %Real, %Real* @Module_vReal
+ %.127 = fcmp oeq %Real %.125, %.126
+ store %Bool %.127, %Bool* @Module_vBool
+ %.128 = load %Real, %Real* @Module_vReal
+ %.129 = fcmp une %Real %.128, 1.000000
+ store %Bool %.129, %Bool* @Module_vBool
+ %.130 = load %Real, %Real* @Module_vReal
+ %.131 = fcmp une %Real 1.000000, %.130
+ store %Bool %.131, %Bool* @Module_vBool
+ %.132 = load %Real, %Real* @Module_vReal
+ %.133 = load %Real, %Real* @Module_vReal
+ %.134 = fcmp une %Real %.132, %.133
+ store %Bool %.134, %Bool* @Module_vBool
+ %.135 = load %Real, %Real* @Module_vReal
+ %.136 = fcmp olt %Real %.135, 1.000000
+ store %Bool %.136, %Bool* @Module_vBool
+ %.137 = load %Real, %Real* @Module_vReal
+ %.138 = fcmp olt %Real 1.000000, %.137
+ store %Bool %.138, %Bool* @Module_vBool
+ %.139 = load %Real, %Real* @Module_vReal
+ %.140 = load %Real, %Real* @Module_vReal
+ %.141 = fcmp olt %Real %.139, %.140
+ store %Bool %.141, %Bool* @Module_vBool
+ %.142 = load %Real, %Real* @Module_vReal
+ %.143 = fcmp ogt %Real %.142, 1.000000
+ store %Bool %.143, %Bool* @Module_vBool
+ %.144 = load %Real, %Real* @Module_vReal
+ %.145 = fcmp ogt %Real 1.000000, %.144
+ store %Bool %.145, %Bool* @Module_vBool
+ %.146 = load %Real, %Real* @Module_vReal
+ %.147 = load %Real, %Real* @Module_vReal
+ %.148 = fcmp ogt %Real %.146, %.147
+ store %Bool %.148, %Bool* @Module_vBool
+ %.149 = load %Real, %Real* @Module_vReal
+ %.150 = fcmp ole %Real %.149, 1.000000
+ store %Bool %.150, %Bool* @Module_vBool
+ %.151 = load %Real, %Real* @Module_vReal
+ %.152 = fcmp ole %Real 1.000000, %.151
+ store %Bool %.152, %Bool* @Module_vBool
+ %.153 = load %Real, %Real* @Module_vReal
+ %.154 = load %Real, %Real* @Module_vReal
+ %.155 = fcmp ole %Real %.153, %.154
+ store %Bool %.155, %Bool* @Module_vBool
+ %.156 = load %Real, %Real* @Module_vReal
+ %.157 = fcmp oge %Real %.156, 1.000000
+ store %Bool %.157, %Bool* @Module_vBool
+ %.158 = load %Real, %Real* @Module_vReal
+ %.159 = fcmp oge %Real 1.000000, %.158
+ store %Bool %.159, %Bool* @Module_vBool
+ %.160 = load %Real, %Real* @Module_vReal
+ %.161 = load %Real, %Real* @Module_vReal
+ %.162 = fcmp oge %Real %.160, %.161
+ store %Bool %.162, %Bool* @Module_vBool
+ ret void
+}
+
+define void @Module_TestIfStatements()
+{
+L30:
+ %.164 = load %Int, %Int* @Module_vInt
+ %.165 = icmp eq %Int %.164, 1
+ br %Bool %.165, label %L32, label %L31
+L32:
+ store %Int 42, %Int* @Module_vInt
+ br label %L31
+L31:
+ %.167 = load %Int, %Int* @Module_vInt
+ %.168 = icmp eq %Int %.167, 1
+ br %Bool %.168, label %L34, label %L35
+L34:
+ store %Int 42, %Int* @Module_vInt
+ br label %L33
+L35:
+ store %Int 24, %Int* @Module_vInt
+ br label %L33
+L33:
+ ret void
+}
+
+define void @Module_TestFlatArrayAccess()
+{
+L38:
+ %.171 = getelementptr [42 x %Int], [42 x %Int]* @Module_vIntArray, %Int 0, %Int 1
+ %.172 = load %Int, %Int* %.171
+ %.173 = getelementptr [42 x %Int], [42 x %Int]* @Module_vIntArray, %Int 0, %Int 2
+ %.174 = load %Int, %Int* %.173
+ %.175 = add %Int %.172, %.174
+ %.176 = getelementptr [42 x %Int], [42 x %Int]* @Module_vIntArray, %Int 0, %Int 0
+ store %Int %.175, %Int* %.176
+ %.178 = getelementptr [42 x %Int], [42 x %Int]* @Module_vIntArray, %Int 0, %Int 1
+ %.179 = load %Int, %Int* %.178
+ %.180 = getelementptr [42 x %Int], [42 x %Int]* @Module_vIntArray, %Int 0, %Int 2
+ %.181 = load %Int, %Int* %.180
+ %.182 = add %Int %.179, %.181
+ store %Int %.182, %Int* @Module_vInt
+ ret void
+}
+
+define void @Module_TestNestedArrayAccess()
+{
+L41:
+ %.184 = getelementptr [5 x [5 x %Int]], [5 x [5 x %Int]]* @Module_vIntArray2, %Int 0, %Int 0
+ %.185 = getelementptr [5 x [5 x %Int]], [5 x [5 x %Int]]* @Module_vIntArray2, %Int 0, %Int 1
+ %.186 = getelementptr [5 x [5 x %Int]], [5 x [5 x %Int]]* @Module_vIntArray2, %Int 0, %Int 2
+ %.187 = getelementptr [5 x %Int], [5 x %Int]* %.185, %Int 0, %Int 1
+ %.188 = load %Int, %Int* %.187
+ %.189 = getelementptr [5 x %Int], [5 x %Int]* %.186, %Int 0, %Int 1
+ %.190 = load %Int, %Int* %.189
+ %.191 = add %Int %.188, %.190
+ %.192 = getelementptr [5 x %Int], [5 x %Int]* %.184, %Int 0, %Int 1
+ store %Int %.191, %Int* %.192
+ ret void
+}
+
+define void @Module_TestRecordAccess()
+{
+L44:
+ %.195 = getelementptr { %Int, [5 x %Int] }, { %Int, [5 x %Int] }* @Module_vRec2, i64 0, i32 0
+ %.196 = load %Int, %Int* %.195
+ %.197 = getelementptr { %Int, [5 x %Int] }, { %Int, [5 x %Int] }* @Module_vRec2, i64 0, i32 0
+ %.198 = load %Int, %Int* %.197
+ %.199 = add %Int %.196, %.198
+ %.200 = getelementptr { %Int, [5 x %Int] }, { %Int, [5 x %Int] }* @Module_vRec2, i64 0, i32 0
+ store %Int %.199, %Int* %.200
+ %.202 = getelementptr { %Int, [5 x %Int] }, { %Int, [5 x %Int] }* @Module_vRec2, i64 0, i32 0
+ %.203 = load %Int, %Int* %.202
+ store %Int %.203, %Int* @Module_vInt
+ ret void
+}
+
+define void @Module_TestNestedRecordAccess()
+{
+L47:
+ %.205 = getelementptr %struct.0x7030000000c0, %struct.0x7030000000c0* @Module_vRec1, i64 0, i32 1
+ %.206 = getelementptr %struct.0x7030000000c0, %struct.0x7030000000c0* @Module_vRec1, i64 0, i32 1
+ %.207 = getelementptr %struct.0x7030000000c0, %struct.0x7030000000c0* @Module_vRec1, i64 0, i32 1
+ %.208 = getelementptr %struct.0x703000000150, %struct.0x703000000150* %.206, i64 0, i32 0
+ %.209 = load %Int, %Int* %.208
+ %.210 = getelementptr %struct.0x703000000150, %struct.0x703000000150* %.207, i64 0, i32 0
+ %.211 = load %Int, %Int* %.210
+ %.212 = add %Int %.209, %.211
+ %.213 = getelementptr %struct.0x703000000150, %struct.0x703000000150* %.205, i64 0, i32 0
+ store %Int %.212, %Int* %.213
+ ret void
+}
+
+define %Int @Module_Sum(%Int %a.0, %Int %b.0)
+{
+L50:
+ %.216 = add %Int %a.0, %b.0
+ ret %Int %.216
+}
+
+define void @Module_TestFunctionCalls()
+{
+L53:
+ call void @Module_TestReturnVoid()
+ %.218 = call %Int @Module_TestReturnIntLiteral()
+ store %Int %.218, %Int* @Module_vInt
+ %.219 = call %Int @Module_Sum(%Int 1, %Int 2)
+ store %Int %.219, %Int* @Module_vInt
+ ret void
+}
+
+define void @Module()
+{
+L56:
+ ret void
+}
+
+define i32 @main(i32 %0, i8* %1)
+{
+ call void @A()
+ call void @Module()
+ ret i32 0
+}