Skip to content

Instantly share code, notes, and snippets.

@5HT
Created May 15, 2015 00:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 5HT/401a348636af9acd3a16 to your computer and use it in GitHub Desktop.
Save 5HT/401a348636af9acd3a16 to your computer and use it in GitHub Desktop.
heap.ll
declare void @print_char(i8)
declare void @print_int(i32)
declare void @print_long(i64)
declare void @print_float(float)
declare void @print_double(double)
declare void @print_atom(i32)
declare void @print_bool(i1)
declare void @rttype_check(i16)
declare void @heap_overflow(%proc_t*, i8*)
declare i8* @heap_allocate(%proc_t*, i8*)
declare void @heap_switch(%proc_t*, i8*)
%proc_t = type { i8*, i8* }
define void @start(i8* %.137, %proc_t* %proc) {
l134:
%.135 = tail call fastcc { i64, i8* } @main0(i8* %.137, %proc_t* %proc)
%.136 = extractvalue { i64, i8* } %.135, 0
call void @print131(i64 %.136)
ret void
}
define void @print131(i64 %arg) {
l132:
call void @print67(i64 %arg)
br label %l133
l133:
ret void
}
define void @print67(i64 %arg) {
l108:
%.130 = trunc i64 %arg to i16
switch i16 %.130, label %l129 [ i16 16, label %l110 i16 17, label %l115 ]
l110:
%.112 = lshr i64 %arg, 16
%.113 = inttoptr i64 %.112 to i64*
%.114 = load i64* %.113
br label %l111
l111:
call void @print_char(i8 91)
call void @print_char(i8 93)
br label %l109
l115:
%.117 = lshr i64 %arg, 16
%.118 = inttoptr i64 %.117 to { i32, i64 }*
br label %l116
l116:
call void @print_char(i8 91)
br label %l119
l119:
%.124 = getelementptr { i32, i64 }* %.118, i32 0, i32 0
%.125 = load i32* %.124
br label %l121
l121:
call void @print_int(i32 %.125)
br label %l122
l122:
%.126 = getelementptr { i32, i64 }* %.118, i32 0, i32 1
%.127 = load i64* %.126
br label %l123
l123:
call void @print_char(i8 124)
br label %l128
l128:
call void @print67(i64 %.127)
br label %l120
l120:
call void @print_char(i8 93)
br label %l109
l129:
call void @rttype_check(i16 %.130)
unreachable
l109:
ret void
}
define { i64, i8* } @copier67(i64 %arg, i8* %htop) {
entry:
%.141 = trunc i64 %arg to i16
%.142 = lshr i64 %arg, 16
switch i16 %.141, label %l145 [ i16 16, label %l139 i16 17, label %l140 ]
l139:
br label %l146
l140:
%.147 = inttoptr i64 %.142 to { i32, i64 }*
br label %l151
l151:
%.153 = bitcast i8* %htop to { i32, i64 }*
%.154 = getelementptr { i32, i64 }* %.153, i32 1
%.155 = bitcast { i32, i64 }* %.154 to i8*
%.156 = getelementptr { i32, i64 }* %.147, i32 0, i32 0
%.158 = load i32* %.156
br label %l162
l162:
br label %l163
l163:
%.157 = getelementptr { i32, i64 }* %.153, i32 0, i32 0
store i32 %.158, i32* %.157
%.160 = getelementptr { i32, i64 }* %.147, i32 0, i32 1
%.159 = load i64* %.160
br label %l164
l164:
%.166 = tail call fastcc { i64, i8* } @copier67(i64 %.159, i8* %.155)
%.167 = extractvalue { i64, i8* } %.166, 0
%.168 = extractvalue { i64, i8* } %.166, 1
br label %l165
l165:
%.161 = getelementptr { i32, i64 }* %.153, i32 0, i32 1
store i64 %.167, i64* %.161
br label %l152
l152:
%.148 = ptrtoint { i32, i64 }* %.153 to i64
%.149 = shl i64 %.148, 16
%.150 = or i64 %.149, 17
br label %l146
l146:
%.143 = phi i64 [ %arg, %l139 ], [ %.150, %l152 ]
%.144 = phi i8* [ %htop, %l139 ], [ %.168, %l152 ]
br label %l138
l145:
call void @rttype_check(i16 %.141)
unreachable
l138:
%.169 = insertvalue { i64, i8* } undef, i64 %.143, 0
%.170 = insertvalue { i64, i8* } %.169, i8* %.144, 1
ret { i64, i8* } %.170
}
define { i64, i8* } @main0(i8* %htop, %proc_t* %proc) {
entry:
br label %l173
l173:
br label %l174
l174:
br label %l177
l177:
br label %l178
l178:
br label %l176
l176:
%.179 = tail call fastcc { i64, i8* } @seq2(i8* %htop, %proc_t* %proc, i32 0, i32 1000)
%.180 = extractvalue { i64, i8* } %.179, 0
%.181 = extractvalue { i64, i8* } %.179, 1
br label %l175
l175:
br label %l172
l172:
%.182 = tail call fastcc { i64, i8* } @repeat3(i8* %.181, %proc_t* %proc, i32 0, i32 1000000, i64 %.180)
ret { i64, i8* } %.182
}
define { i64, i8* } @repeat3(i8* %htopr, %proc_t* %proc, i32 %r1, i32 %r2, i64 %r3) {
l185:
%.188 = getelementptr %proc_t* %proc, i32 0, i32 1
%.189 = load i8** %.188
%.190 = icmp ugt i8* %htopr, %.189
br i1 %.190, label %l186, label %l187
l186:
%h0 = tail call fastcc i8* @heap_allocate(%proc_t* %proc, i8* %htopr)
%.191 = tail call fastcc { i64, i8* } @copier67(i64 %r3, i8* %h0)
%c3 = extractvalue { i64, i8* } %.191, 0
%h3 = extractvalue { i64, i8* } %.191, 1
call void @heap_switch(%proc_t* %proc, i8* %h3)
br label %l187
l187:
%htop = phi i8* [ %htopr, %l185 ], [ %h3, %l186 ]
%m1 = phi i32 [ %r1, %l185 ], [ %r1, %l186 ]
%m2 = phi i32 [ %r2, %l185 ], [ %r2, %l186 ]
%m3 = phi i64 [ %r3, %l185 ], [ %c3, %l186 ]
br label %entry
entry:
br label %l194
l194:
br label %l195
l195:
br label %l196
l196:
br label %l193
l193:
%.197 = tail call fastcc { i64, i8* } @gf3_3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 %m3)
ret { i64, i8* } %.197
}
define { i64, i8* } @gf3_3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 %m3) {
entry:
br label %l204
l204:
br label %l205
l205:
%.206 = icmp eq i32 %m1, %m2
br label %l200
l200:
br i1 %.206, label %l201, label %l202
l201:
br label %l203
l203:
%.207 = insertvalue { i64, i8* } undef, i64 %m3, 0
%.208 = insertvalue { i64, i8* } %.207, i8* %htop, 1
ret { i64, i8* } %.208
l202:
br label %l212
l212:
br label %l213
l213:
%.214 = add i32 %m1, 1
br label %l211
l211:
br label %l215
l215:
br label %l218
l218:
br label %l217
l217:
%.219 = tail call fastcc { i64, i8* } @rev1(i8* %htop, %proc_t* %proc, i64 %m3)
%.220 = extractvalue { i64, i8* } %.219, 0
%.221 = extractvalue { i64, i8* } %.219, 1
br label %l216
l216:
br label %l210
l210:
%.222 = tail call fastcc { i64, i8* } @repeat3(i8* %.221, %proc_t* %proc, i32 %.214, i32 %m2, i64 %.220)
ret { i64, i8* } %.222
}
define { i64, i8* } @seq2(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2) {
entry:
br label %l225
l225:
br label %l226
l226:
br label %l227
l227:
br label %l224
l224:
%.228 = tail call fastcc { i64, i8* } @seq3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 16)
ret { i64, i8* } %.228
}
define { i64, i8* } @seq3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 %m3) {
entry:
br label %l233
l233:
br label %l234
l234:
br label %l235
l235:
br label %l232
l232:
%.236 = tail call fastcc { i64, i8* } @gf4_3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 %m3)
ret { i64, i8* } %.236
}
define { i64, i8* } @gf4_3(i8* %htop, %proc_t* %proc, i32 %m1, i32 %m2, i64 %m3) {
entry:
br label %l243
l243:
br label %l244
l244:
%.245 = icmp eq i32 %m1, %m2
br label %l239
l239:
br i1 %.245, label %l240, label %l241
l240:
br label %l242
l242:
%.246 = insertvalue { i64, i8* } undef, i64 %m3, 0
%.247 = insertvalue { i64, i8* } %.246, i8* %htop, 1
ret { i64, i8* } %.247
l241:
br label %l250
l250:
br label %l252
l252:
br label %l253
l253:
%.254 = sub i32 %m2, 1
br label %l251
l251:
%.256 = bitcast i8* %htop to { i32, i64 }*
%.257 = getelementptr { i32, i64 }* %.256, i32 1
%.258 = bitcast { i32, i64 }* %.257 to i8*
br label %l261
l261:
%.267 = ptrtoint i8* %htop to i64
%.268 = ptrtoint i8* %.258 to i64
%.269 = trunc i64 %.267 to i16
%.270 = trunc i64 %.268 to i16
%.271 = icmp uge i16 %.269, %.270
br i1 %.271, label %l272, label %l262
l272:
%.274 = getelementptr %proc_t* %proc, i32 0, i32 0
%.275 = load i8** %.274
%.276 = icmp ugt i8* %.258, %.275
br i1 %.276, label %l273, label %l262
l273:
call void @heap_overflow(%proc_t* %proc, i8* %.258)
unreachable
l262:
br label %l263
l263:
%.259 = getelementptr { i32, i64 }* %.256, i32 0, i32 0
store i32 %m2, i32* %.259
br label %l264
l264:
br label %l265
l265:
%.260 = getelementptr { i32, i64 }* %.256, i32 0, i32 1
store i64 %m3, i64* %.260
br label %l266
l266:
%.277 = ptrtoint { i32, i64 }* %.256 to i64
%.278 = shl i64 %.277, 16
%.279 = or i64 %.278, 17
br label %l255
l255:
br label %l249
l249:
%.280 = tail call fastcc { i64, i8* } @seq3(i8* %.258, %proc_t* %proc, i32 %m1, i32 %.254, i64 %.279)
ret { i64, i8* } %.280
}
define { i64, i8* } @rev1(i8* %htop, %proc_t* %proc, i64 %m1) {
entry:
br label %l283
l283:
br label %l284
l284:
br label %l282
l282:
%.285 = tail call fastcc { i64, i8* } @rev2(i8* %htop, %proc_t* %proc, i64 %m1, i64 16)
ret { i64, i8* } %.285
}
define { i64, i8* } @rev2(i8* %htop, %proc_t* %proc, i64 %m1, i64 %m2) {
entry:
br label %l290
l290:
br label %l291
l291:
br label %l289
l289:
%.292 = tail call fastcc { i64, i8* } @tf8_2(i8* %htop, %proc_t* %proc, i64 %m1, i64 %m2)
ret { i64, i8* } %.292
}
define { i64, i8* } @tf8_2(i8* %htop, %proc_t* %proc, i64 %m1, i64 %m2) {
entry:
%.312 = trunc i64 %m1 to i16
switch i16 %.312, label %l298 [ i16 17, label %l295 i16 16, label %l296 ]
l295:
br label %l300
l300:
%.302 = lshr i64 %m1, 16
%.304 = inttoptr i64 %.302 to { i32, i64 }*
%.305 = getelementptr { i32, i64 }* %.304, i32 0, i32 0
%.303 = load i32* %.305
br label %l301
l301:
%.307 = lshr i64 %m1, 16
%.309 = inttoptr i64 %.307 to { i32, i64 }*
%.310 = getelementptr { i32, i64 }* %.309, i32 0, i32 1
%.308 = load i64* %.310
br label %l306
l306:
br label %l299
l299:
%.311 = tail call fastcc { i64, i8* } @zf7_3(i8* %htop, %proc_t* %proc, i64 %m2, i32 %.303, i64 %.308)
ret { i64, i8* } %.311
l296:
br label %l297
l297:
%.313 = phi i64 [ %m2, %l296 ]
%.314 = phi i8* [ %htop, %l296 ]
%.315 = insertvalue { i64, i8* } undef, i64 %.313, 0
%.316 = insertvalue { i64, i8* } %.315, i8* %.314, 1
ret { i64, i8* } %.316
l298:
call void @rttype_check(i16 %.312)
unreachable
}
define { i64, i8* } @zf7_3(i8* %htop, %proc_t* %proc, i64 %m1, i32 %m2, i64 %m3) {
entry:
br label %l319
l319:
%.321 = bitcast i8* %htop to { i32, i64 }*
%.322 = getelementptr { i32, i64 }* %.321, i32 1
%.323 = bitcast { i32, i64 }* %.322 to i8*
br label %l326
l326:
%.332 = ptrtoint i8* %htop to i64
%.333 = ptrtoint i8* %.323 to i64
%.334 = trunc i64 %.332 to i16
%.335 = trunc i64 %.333 to i16
%.336 = icmp uge i16 %.334, %.335
br i1 %.336, label %l337, label %l327
l337:
%.339 = getelementptr %proc_t* %proc, i32 0, i32 0
%.340 = load i8** %.339
%.341 = icmp ugt i8* %.323, %.340
br i1 %.341, label %l338, label %l327
l338:
call void @heap_overflow(%proc_t* %proc, i8* %.323)
unreachable
l327:
br label %l328
l328:
%.324 = getelementptr { i32, i64 }* %.321, i32 0, i32 0
store i32 %m2, i32* %.324
br label %l329
l329:
br label %l330
l330:
%.325 = getelementptr { i32, i64 }* %.321, i32 0, i32 1
store i64 %m1, i64* %.325
br label %l331
l331:
%.342 = ptrtoint { i32, i64 }* %.321 to i64
%.343 = shl i64 %.342, 16
%.344 = or i64 %.343, 17
br label %l320
l320:
br label %l318
l318:
%.345 = tail call fastcc { i64, i8* } @rev2(i8* %.323, %proc_t* %proc, i64 %m3, i64 %.344)
ret { i64, i8* } %.345
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment