Skip to content

Instantly share code, notes, and snippets.

@danielsnider
Created March 21, 2023 00:21
Show Gist options
  • Save danielsnider/3d04cc2fa1ec5746b72467a81d31cb75 to your computer and use it in GitHub Desktop.
Save danielsnider/3d04cc2fa1ec5746b72467a81d31cb75 to your computer and use it in GitHub Desktop.
========
; ModuleID = 'output.bc'
source_filename = "output.bc"
target triple = "x86_64-pc-linux-gnu"
@N = common global i32 0
@a = common global i32 zeroinitializer
@c = common global i32 zeroinitializer
declare i32 @getint()
define i32 @main() {
main:
%i = alloca i32, align 4
%0 = call i32 @getint()
store i32 %0, ptr @N, align 4
store i32 0, ptr %i, align 4
br label %for_cond
for_cond: ; preds = %for_body, %main
%1 = load i32, ptr %i, align 4
%2 = load i32, ptr @N, align 4
%3 = load i32, ptr @N, align 4
%multmp = mul i32 %2, %3
%lesstmp = icmp slt i32 %1, %multmp
br i1 %lesstmp, label %for_body, label %for_exit
for_body: ; preds = %for_cond
%4 = load i32, ptr %i, align 4
%5 = getelementptr i32, ptr @c, i32 %4
store i32 0, ptr %5, align 4
%6 = load i32, ptr %i, align 4
%addtmp = add i32 %6, 1
store i32 %addtmp, ptr %i, align 4
br label %for_cond
for_exit: ; preds = %for_cond
call void @search(i32 0)
ret i32 0
}
define void @markcolumn(i32 %0, i32 %1, i32 %2) {
markcolumn:
%x = alloca i32, align 4
store i32 %0, ptr %x, align 4
%y = alloca i32, align 4
store i32 %1, ptr %y, align 4
%mark = alloca i32, align 4
store i32 %2, ptr %mark, align 4
%i = alloca i32, align 4
store i32 0, ptr %i, align 4
br label %for_cond
for_cond: ; preds = %for_body, %markcolumn
%3 = load i32, ptr %i, align 4
%4 = load i32, ptr @N, align 4
%lesstmp = icmp slt i32 %3, %4
br i1 %lesstmp, label %for_body, label %for_exit
for_body: ; preds = %for_cond
%5 = load i32, ptr %i, align 4
%6 = load i32, ptr @N, align 4
%multmp = mul i32 %5, %6
%7 = load i32, ptr %y, align 4
%addtmp = add i32 %multmp, %7
%8 = load i32, ptr %i, align 4
%9 = load i32, ptr @N, align 4
%multmp1 = mul i32 %8, %9
%10 = load i32, ptr %y, align 4
%addtmp2 = add i32 %multmp1, %10
%11 = getelementptr i32, ptr @c, i32 %addtmp2
%12 = load i32, ptr %11, align 4
%13 = load i32, ptr %mark, align 4
%addtmp3 = add i32 %12, %13
%14 = getelementptr i32, ptr @c, i32 %addtmp
store i32 %addtmp3, ptr %14, align 4
%15 = load i32, ptr %i, align 4
%addtmp4 = add i32 %15, 1
store i32 %addtmp4, ptr %i, align 4
br label %for_cond
for_exit: ; preds = %for_cond
ret void
}
define void @markdiag(i32 %0, i32 %1, i32 %2) {
markdiag:
%x = alloca i32, align 4
store i32 %0, ptr %x, align 4
%y = alloca i32, align 4
store i32 %1, ptr %y, align 4
%mark = alloca i32, align 4
store i32 %2, ptr %mark, align 4
%i = alloca i32, align 4
store i32 0, ptr %i, align 4
br label %for_cond
for_cond: ; preds = %markdiag
%3 = load i32, ptr %i, align 4
%4 = load i32, ptr @N, align 4
%lesstmp = icmp slt i32 %3, %4
br i1 %lesstmp, label %for_body, label %for_exit
for_body: ; preds = %for_cond
%x1 = alloca i32, align 4
%y1 = alloca i32, align 4
%5 = load i32, ptr %i, align 4
store i32 %5, ptr %x1, align 4
%6 = load i32, ptr %y, align 4
%7 = load i32, ptr %i, align 4
%8 = load i32, ptr %x, align 4
%subtmp = sub i32 %7, %8
%addtmp = add i32 %6, %subtmp
store i32 %addtmp, ptr %y1, align 4
%9 = load i32, ptr %y1, align 4
%greatereqtmp = icmp sge i32 %9, 0
br label %bin_curr_bb
for_exit: ; preds = %if_out_bb14, %for_cond
ret void
bin_curr_bb: ; preds = %for_body
br i1 %greatereqtmp, label %bin_slow_bb, label %bin_out_bb
bin_slow_bb: ; preds = %bin_curr_bb
%10 = load i32, ptr %y1, align 4
%11 = load i32, ptr @N, align 4
%lesstmp1 = icmp slt i32 %10, %11
br label %bin_out_bb
bin_out_bb: ; preds = %bin_slow_bb, %bin_curr_bb
%12 = phi i1 [ %greatereqtmp, %bin_curr_bb ], [ %lesstmp1, %bin_slow_bb ]
br i1 %12, label %if_then_bb, label %if_out_bb
if_then_bb: ; preds = %bin_out_bb
%13 = load i32, ptr %x1, align 4
%14 = load i32, ptr @N, align 4
%multmp = mul i32 %13, %14
%15 = load i32, ptr %y1, align 4
%addtmp2 = add i32 %multmp, %15
%16 = load i32, ptr %x1, align 4
%17 = load i32, ptr @N, align 4
%multmp3 = mul i32 %16, %17
%18 = load i32, ptr %y1, align 4
%addtmp4 = add i32 %multmp3, %18
%19 = getelementptr i32, ptr @c, i32 %addtmp4
%20 = load i32, ptr %19, align 4
%21 = load i32, ptr %mark, align 4
%addtmp5 = add i32 %20, %21
%22 = getelementptr i32, ptr @c, i32 %addtmp2
store i32 %addtmp5, ptr %22, align 4
br label %if_out_bb
if_out_bb: ; preds = %if_then_bb, %bin_out_bb
%23 = load i32, ptr %y, align 4
%24 = load i32, ptr %i, align 4
%25 = load i32, ptr %x, align 4
%subtmp6 = sub i32 %24, %25
%subtmp7 = sub i32 %23, %subtmp6
store i32 %subtmp7, ptr %y1, align 4
%26 = load i32, ptr %y1, align 4
%greatereqtmp8 = icmp sge i32 %26, 0
br label %bin_curr_bb9
bin_curr_bb9: ; preds = %if_out_bb
br i1 %greatereqtmp8, label %bin_slow_bb10, label %bin_out_bb11
bin_slow_bb10: ; preds = %bin_curr_bb9
%27 = load i32, ptr %y1, align 4
%28 = load i32, ptr @N, align 4
%lesstmp12 = icmp slt i32 %27, %28
br label %bin_out_bb11
bin_out_bb11: ; preds = %bin_slow_bb10, %bin_curr_bb9
%29 = phi i1 [ %greatereqtmp8, %bin_curr_bb9 ], [ %lesstmp12, %bin_slow_bb10 ]
br i1 %29, label %if_then_bb13, label %if_out_bb14
if_then_bb13: ; preds = %bin_out_bb11
%30 = load i32, ptr %x1, align 4
%31 = load i32, ptr @N, align 4
%multmp15 = mul i32 %30, %31
%32 = load i32, ptr %y1, align 4
%addtmp16 = add i32 %multmp15, %32
%33 = load i32, ptr %x1, align 4
%34 = load i32, ptr @N, align 4
%multmp17 = mul i32 %33, %34
%35 = load i32, ptr %y1, align 4
%addtmp18 = add i32 %multmp17, %35
%36 = getelementptr i32, ptr @c, i32 %addtmp18
%37 = load i32, ptr %36, align 4
%38 = load i32, ptr %mark, align 4
%addtmp19 = add i32 %37, %38
%39 = getelementptr i32, ptr @c, i32 %addtmp16
store i32 %addtmp19, ptr %39, align 4
br label %if_out_bb14
if_out_bb14: ; preds = %if_then_bb13, %bin_out_bb11
br label %for_exit
}
declare void @putint(i32)
declare void @putnewline()
define void @search(i32 %0) {
search:
%k = alloca i32, align 4
store i32 %0, ptr %k, align 4
%i = alloca i32, align 4
%1 = load i32, ptr %k, align 4
%2 = load i32, ptr @N, align 4
%eqtmp = icmp eq i32 %1, %2
br i1 %eqtmp, label %if_then_bb, label %if_out_bb
if_then_bb: ; preds = %search
store i32 0, ptr %i, align 4
br label %for_cond
if_out_bb: ; preds = %search
store i32 0, ptr %i, align 4
br label %for_cond1
for_cond: ; preds = %for_body, %if_then_bb
%3 = load i32, ptr %i, align 4
%4 = load i32, ptr @N, align 4
%lesstmp = icmp slt i32 %3, %4
br i1 %lesstmp, label %for_body, label %for_exit
for_body: ; preds = %for_cond
%5 = load i32, ptr %i, align 4
%6 = getelementptr i32, ptr @a, i32 %5
%7 = load i32, ptr %6, align 4
call void @putint(i32 %7)
%8 = load i32, ptr %i, align 4
%addtmp = add i32 %8, 1
store i32 %addtmp, ptr %i, align 4
br label %for_cond
for_exit: ; preds = %for_cond
call void @putnewline()
ret void
for_cond1: ; preds = %if_out_bb
%9 = load i32, ptr %i, align 4
%10 = load i32, ptr @N, align 4
%lesstmp4 = icmp slt i32 %9, %10
br i1 %lesstmp4, label %for_body2, label %for_exit3
for_body2: ; preds = %for_cond1
%11 = load i32, ptr %k, align 4
%12 = load i32, ptr @N, align 4
%multmp = mul i32 %11, %12
%13 = load i32, ptr %i, align 4
%addtmp5 = add i32 %multmp, %13
%14 = getelementptr i32, ptr @c, i32 %addtmp5
%15 = load i32, ptr %14, align 4
%eqtmp6 = icmp eq i32 %15, 0
br i1 %eqtmp6, label %if_then_bb7, label %if_out_bb8
for_exit3: ; preds = %if_out_bb8, %for_cond1
ret void
if_then_bb7: ; preds = %for_body2
%16 = load i32, ptr %k, align 4
%17 = load i32, ptr %i, align 4
call void @markcolumn(i32 %16, i32 %17, i32 1)
%18 = load i32, ptr %k, align 4
%19 = load i32, ptr %i, align 4
call void @markdiag(i32 %18, i32 %19, i32 1)
%20 = load i32, ptr %k, align 4
%21 = load i32, ptr %i, align 4
%22 = getelementptr i32, ptr @a, i32 %20
store i32 %21, ptr %22, align 4
%23 = load i32, ptr %k, align 4
%addtmp9 = add i32 %23, 1
call void @search(i32 %addtmp9)
%24 = load i32, ptr %k, align 4
%25 = load i32, ptr %i, align 4
call void @markdiag(i32 %24, i32 %25, i32 -1)
%26 = load i32, ptr %k, align 4
%27 = load i32, ptr %i, align 4
call void @markcolumn(i32 %26, i32 %27, i32 -1)
br label %if_out_bb8
if_out_bb8: ; preds = %if_then_bb7, %for_body2
br label %for_exit3
}
========
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment