Skip to content

Instantly share code, notes, and snippets.

@bollu
Last active May 4, 2021 11:40
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 bollu/1da616fb3cd13501f1fdb3c44d4370be to your computer and use it in GitHub Desktop.
Save bollu/1da616fb3cd13501f1fdb3c44d4370be to your computer and use it in GitHub Desktop.
/usr/bin/env python3
N = 10
def p(x): print(x, end="")
# forward decl
p("int even(")
for i in range(N):
if i > 0: p(", ")
p("int")
p(");\n");
p("int odd(")
for i in range(N):
if i > 0: p(", ")
p(f"n{i}")
p(") {\n")
p(" return n0 == 0 ? 0 : ")
p("5*even(");
for i in range(N):
if i > 0: p(", ")
p(f"n{i} - n{(i+1)%N}")
p (");");
p("\n}")
p("\n\n");
p("int even(")
for i in range(N):
if i > 0: p(", ")
p(f"n{i}")
p(") {\n")
p(" return n0 == 2 ? 0 : ")
p("3*odd(");
for i in range(N):
if i > 0: p(", ")
p(f"n{i} - n{(i+1)%N}")
p (");");
p("\n}")
int even(int, int, int, int, int, int, int, int, int, int);
int odd(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9) {
return n0 == 3 ? 0 : 5*even(n0 - n1, n1 - n2, n2 - n3, n3 - n4, n4 - n5, n5 - n6, n6 - n7, n7 - n8, n8 - n9, n9 - n0);
}
int even(n0, n1, n2, n3, n4, n5, n6, n7, n8, n9) {
return n0 == 5 ? 0 : 3*odd(n0 - n1, n1 - n2, n2 - n3, n3 - n4, n4 - n5, n5 - n6, n6 - n7, n7 - n8, n8 - n9, n9 - n0);
}
; ModuleID = 'main.c'
source_filename = "main.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: noinline nounwind optnone sspstrong uwtable
define dso_local i32 @odd(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9) #0 {
%11 = alloca i32, align 4
%12 = alloca i32, align 4
%13 = alloca i32, align 4
%14 = alloca i32, align 4
%15 = alloca i32, align 4
%16 = alloca i32, align 4
%17 = alloca i32, align 4
%18 = alloca i32, align 4
%19 = alloca i32, align 4
%20 = alloca i32, align 4
store i32 %0, i32* %11, align 4
store i32 %1, i32* %12, align 4
store i32 %2, i32* %13, align 4
store i32 %3, i32* %14, align 4
store i32 %4, i32* %15, align 4
store i32 %5, i32* %16, align 4
store i32 %6, i32* %17, align 4
store i32 %7, i32* %18, align 4
store i32 %8, i32* %19, align 4
store i32 %9, i32* %20, align 4
%21 = load i32, i32* %11, align 4
%22 = icmp eq i32 %21, 3
br i1 %22, label %23, label %24
23: ; preds = %10
br label %57
24: ; preds = %10
%25 = load i32, i32* %11, align 4
%26 = load i32, i32* %12, align 4
%27 = sub nsw i32 %25, %26
%28 = load i32, i32* %12, align 4
%29 = load i32, i32* %13, align 4
%30 = sub nsw i32 %28, %29
%31 = load i32, i32* %13, align 4
%32 = load i32, i32* %14, align 4
%33 = sub nsw i32 %31, %32
%34 = load i32, i32* %14, align 4
%35 = load i32, i32* %15, align 4
%36 = sub nsw i32 %34, %35
%37 = load i32, i32* %15, align 4
%38 = load i32, i32* %16, align 4
%39 = sub nsw i32 %37, %38
%40 = load i32, i32* %16, align 4
%41 = load i32, i32* %17, align 4
%42 = sub nsw i32 %40, %41
%43 = load i32, i32* %17, align 4
%44 = load i32, i32* %18, align 4
%45 = sub nsw i32 %43, %44
%46 = load i32, i32* %18, align 4
%47 = load i32, i32* %19, align 4
%48 = sub nsw i32 %46, %47
%49 = load i32, i32* %19, align 4
%50 = load i32, i32* %20, align 4
%51 = sub nsw i32 %49, %50
%52 = load i32, i32* %20, align 4
%53 = load i32, i32* %11, align 4
%54 = sub nsw i32 %52, %53
%55 = call i32 @even(i32 %27, i32 %30, i32 %33, i32 %36, i32 %39, i32 %42, i32 %45, i32 %48, i32 %51, i32 %54)
%56 = mul nsw i32 5, %55
br label %57
57: ; preds = %24, %23
%58 = phi i32 [ 0, %23 ], [ %56, %24 ]
ret i32 %58
}
; Function Attrs: noinline nounwind optnone sspstrong uwtable
define dso_local i32 @even(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9) #0 {
%11 = alloca i32, align 4
%12 = alloca i32, align 4
%13 = alloca i32, align 4
%14 = alloca i32, align 4
%15 = alloca i32, align 4
%16 = alloca i32, align 4
%17 = alloca i32, align 4
%18 = alloca i32, align 4
%19 = alloca i32, align 4
%20 = alloca i32, align 4
store i32 %0, i32* %11, align 4
store i32 %1, i32* %12, align 4
store i32 %2, i32* %13, align 4
store i32 %3, i32* %14, align 4
store i32 %4, i32* %15, align 4
store i32 %5, i32* %16, align 4
store i32 %6, i32* %17, align 4
store i32 %7, i32* %18, align 4
store i32 %8, i32* %19, align 4
store i32 %9, i32* %20, align 4
%21 = load i32, i32* %11, align 4
%22 = icmp eq i32 %21, 5
br i1 %22, label %23, label %24
23: ; preds = %10
br label %57
24: ; preds = %10
%25 = load i32, i32* %11, align 4
%26 = load i32, i32* %12, align 4
%27 = sub nsw i32 %25, %26
%28 = load i32, i32* %12, align 4
%29 = load i32, i32* %13, align 4
%30 = sub nsw i32 %28, %29
%31 = load i32, i32* %13, align 4
%32 = load i32, i32* %14, align 4
%33 = sub nsw i32 %31, %32
%34 = load i32, i32* %14, align 4
%35 = load i32, i32* %15, align 4
%36 = sub nsw i32 %34, %35
%37 = load i32, i32* %15, align 4
%38 = load i32, i32* %16, align 4
%39 = sub nsw i32 %37, %38
%40 = load i32, i32* %16, align 4
%41 = load i32, i32* %17, align 4
%42 = sub nsw i32 %40, %41
%43 = load i32, i32* %17, align 4
%44 = load i32, i32* %18, align 4
%45 = sub nsw i32 %43, %44
%46 = load i32, i32* %18, align 4
%47 = load i32, i32* %19, align 4
%48 = sub nsw i32 %46, %47
%49 = load i32, i32* %19, align 4
%50 = load i32, i32* %20, align 4
%51 = sub nsw i32 %49, %50
%52 = load i32, i32* %20, align 4
%53 = load i32, i32* %11, align 4
%54 = sub nsw i32 %52, %53
%55 = call i32 @odd(i32 %27, i32 %30, i32 %33, i32 %36, i32 %39, i32 %42, i32 %45, i32 %48, i32 %51, i32 %54)
%56 = mul nsw i32 3, %55
br label %57
57: ; preds = %24, %23
%58 = phi i32 [ 0, %23 ], [ %56, %24 ]
ret i32 %58
}
!llvm.module.flags = !{!0, !1, !2}
!llvm.ident = !{!3}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 7, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!"clang version 11.1.0"}
; ModuleID = 'main.ll'
source_filename = "main.c"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-pc-linux-gnu"
; Function Attrs: norecurse nounwind readnone
define dso_local i32 @odd(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9) local_unnamed_addr #0 {
%11 = icmp eq i32 %0, 3
br i1 %11, label %even.exit, label %.lr.ph
.lr.ph: ; preds = %10, %tailrecurse
%.tr2940 = phi i32 [ %32, %tailrecurse ], [ %9, %10 ]
%.tr2839 = phi i32 [ %31, %tailrecurse ], [ %8, %10 ]
%.tr2738 = phi i32 [ %30, %tailrecurse ], [ %7, %10 ]
%.tr2637 = phi i32 [ %29, %tailrecurse ], [ %6, %10 ]
%.tr2536 = phi i32 [ %28, %tailrecurse ], [ %5, %10 ]
%.tr2435 = phi i32 [ %27, %tailrecurse ], [ %4, %10 ]
%.tr2334 = phi i32 [ %26, %tailrecurse ], [ %3, %10 ]
%.tr2233 = phi i32 [ %25, %tailrecurse ], [ %2, %10 ]
%.tr2132 = phi i32 [ %24, %tailrecurse ], [ %1, %10 ]
%.tr31 = phi i32 [ %23, %tailrecurse ], [ %0, %10 ]
%12 = sub nsw i32 %.tr31, %.tr2132
%13 = sub nsw i32 %.tr2132, %.tr2233
%14 = sub nsw i32 %.tr2233, %.tr2334
%15 = sub nsw i32 %.tr2334, %.tr2435
%16 = sub nsw i32 %.tr2435, %.tr2536
%17 = sub nsw i32 %.tr2536, %.tr2637
%18 = sub nsw i32 %.tr2637, %.tr2738
%19 = sub nsw i32 %.tr2738, %.tr2839
%20 = sub nsw i32 %.tr2839, %.tr2940
%21 = sub nsw i32 %.tr2940, %.tr31
%22 = icmp eq i32 %12, 5
br i1 %22, label %even.exit, label %tailrecurse
tailrecurse: ; preds = %.lr.ph
%23 = sub nsw i32 %12, %13
%24 = sub nsw i32 %13, %14
%25 = sub nsw i32 %14, %15
%26 = sub nsw i32 %15, %16
%27 = sub nsw i32 %16, %17
%28 = sub nsw i32 %17, %18
%29 = sub nsw i32 %18, %19
%30 = sub nsw i32 %19, %20
%31 = sub nsw i32 %20, %21
%32 = sub nsw i32 %21, %12
%33 = icmp eq i32 %23, 3
br i1 %33, label %even.exit, label %.lr.ph
even.exit: ; preds = %tailrecurse, %.lr.ph, %10
ret i32 0
}
; Function Attrs: norecurse nounwind readnone
define dso_local i32 @even(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7, i32 %8, i32 %9) local_unnamed_addr #0 {
%11 = icmp eq i32 %0, 5
%12 = sub nsw i32 %0, %1
%13 = icmp eq i32 %12, 3
%or.cond = or i1 %11, %13
br i1 %or.cond, label %odd.exit, label %.lr.ph.i.preheader
.lr.ph.i.preheader: ; preds = %10
%14 = sub nsw i32 %9, %0
%15 = sub nsw i32 %8, %9
%16 = sub nsw i32 %7, %8
%17 = sub nsw i32 %6, %7
%18 = sub nsw i32 %5, %6
%19 = sub nsw i32 %4, %5
%20 = sub nsw i32 %3, %4
%21 = sub nsw i32 %2, %3
%22 = sub nsw i32 %1, %2
br label %.lr.ph.i
.lr.ph.i: ; preds = %.lr.ph.i.preheader, %tailrecurse.i
%.tr2940.i = phi i32 [ %43, %tailrecurse.i ], [ %14, %.lr.ph.i.preheader ]
%.tr2839.i = phi i32 [ %42, %tailrecurse.i ], [ %15, %.lr.ph.i.preheader ]
%.tr2738.i = phi i32 [ %41, %tailrecurse.i ], [ %16, %.lr.ph.i.preheader ]
%.tr2637.i = phi i32 [ %40, %tailrecurse.i ], [ %17, %.lr.ph.i.preheader ]
%.tr2536.i = phi i32 [ %39, %tailrecurse.i ], [ %18, %.lr.ph.i.preheader ]
%.tr2435.i = phi i32 [ %38, %tailrecurse.i ], [ %19, %.lr.ph.i.preheader ]
%.tr2334.i = phi i32 [ %37, %tailrecurse.i ], [ %20, %.lr.ph.i.preheader ]
%.tr2233.i = phi i32 [ %36, %tailrecurse.i ], [ %21, %.lr.ph.i.preheader ]
%.tr2132.i = phi i32 [ %35, %tailrecurse.i ], [ %22, %.lr.ph.i.preheader ]
%.tr31.i = phi i32 [ %34, %tailrecurse.i ], [ %12, %.lr.ph.i.preheader ]
%23 = sub nsw i32 %.tr31.i, %.tr2132.i
%24 = sub nsw i32 %.tr2132.i, %.tr2233.i
%25 = sub nsw i32 %.tr2233.i, %.tr2334.i
%26 = sub nsw i32 %.tr2334.i, %.tr2435.i
%27 = sub nsw i32 %.tr2435.i, %.tr2536.i
%28 = sub nsw i32 %.tr2536.i, %.tr2637.i
%29 = sub nsw i32 %.tr2637.i, %.tr2738.i
%30 = sub nsw i32 %.tr2738.i, %.tr2839.i
%31 = sub nsw i32 %.tr2839.i, %.tr2940.i
%32 = sub nsw i32 %.tr2940.i, %.tr31.i
%33 = icmp eq i32 %23, 5
br i1 %33, label %odd.exit, label %tailrecurse.i
tailrecurse.i: ; preds = %.lr.ph.i
%34 = sub nsw i32 %23, %24
%35 = sub nsw i32 %24, %25
%36 = sub nsw i32 %25, %26
%37 = sub nsw i32 %26, %27
%38 = sub nsw i32 %27, %28
%39 = sub nsw i32 %28, %29
%40 = sub nsw i32 %29, %30
%41 = sub nsw i32 %30, %31
%42 = sub nsw i32 %31, %32
%43 = sub nsw i32 %32, %23
%44 = icmp eq i32 %34, 3
br i1 %44, label %odd.exit, label %.lr.ph.i
odd.exit: ; preds = %tailrecurse.i, %.lr.ph.i, %10
ret i32 0
}
attributes #0 = { norecurse nounwind readnone }
!llvm.module.flags = !{!0, !1, !2}
!llvm.ident = !{!3}
!0 = !{i32 1, !"wchar_size", i32 4}
!1 = !{i32 7, !"PIC Level", i32 2}
!2 = !{i32 7, !"PIE Level", i32 2}
!3 = !{!"clang version 11.1.0"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment