Skip to content

Instantly share code, notes, and snippets.

@dpzmick
Last active August 12, 2016 02:24
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 dpzmick/a55851a9dd5ef87dd925c7f69151c0d0 to your computer and use it in GitHub Desktop.
Save dpzmick/a55851a9dd5ef87dd925c7f69151c0d0 to your computer and use it in GitHub Desktop.
; ModuleID = './core.bc'
source_filename = "src/core.c"
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
%struct.image = type { i8*, i64, i64 }
; Function Attrs: alwaysinline nounwind uwtable
define i8* @at(i8*, i64, i64, i64) #0 {
%5 = alloca i8*, align 8
%6 = alloca i64, align 8
%7 = alloca i64, align 8
%8 = alloca i64, align 8
store i8* %0, i8** %5, align 8
store i64 %1, i64* %6, align 8
store i64 %2, i64* %7, align 8
store i64 %3, i64* %8, align 8
%9 = load i64, i64* %8, align 8
%10 = load i64, i64* %6, align 8
%11 = mul nsw i64 %9, %10
%12 = load i64, i64* %7, align 8
%13 = add nsw i64 %11, %12
%14 = load i8*, i8** %5, align 8
%15 = getelementptr inbounds i8, i8* %14, i64 %13
ret i8* %15
}
; Function Attrs: alwaysinline nounwind uwtable
define i64 @core_isqrt(i64) #0 {
%2 = alloca i64, align 8
store i64 %0, i64* %2, align 8
%3 = load i64, i64* %2, align 8
%4 = sitofp i64 %3 to double
%5 = call double @sqrt(double %4) #7
%6 = fptosi double %5 to i64
ret i64 %6
}
; Function Attrs: alwaysinline nounwind
declare double @sqrt(double) #1
; Function Attrs: alwaysinline inlinehint nounwind uwtable
define i64 @core_input_at(i64, i64, %struct.image*, i64, i64) #2 {
%6 = alloca i64, align 8
%7 = alloca i64, align 8
%8 = alloca i64, align 8
%9 = alloca %struct.image*, align 8
%10 = alloca i64, align 8
%11 = alloca i64, align 8
%12 = alloca %struct.image, align 8
store i64 %0, i64* %7, align 8
store i64 %1, i64* %8, align 8
store %struct.image* %2, %struct.image** %9, align 8
store i64 %3, i64* %10, align 8
store i64 %4, i64* %11, align 8
%13 = load i64, i64* %10, align 8
%14 = load i64, i64* %7, align 8
%15 = load i64, i64* %11, align 8
%16 = load %struct.image*, %struct.image** %9, align 8
%17 = getelementptr inbounds %struct.image, %struct.image* %16, i64 %15
%18 = getelementptr inbounds %struct.image, %struct.image* %17, i32 0, i32 1
%19 = load i64, i64* %18, align 8
%20 = icmp sge i64 %14, %19
br i1 %20, label %24, label %21
; <label>:21: ; preds = %5
%22 = load i64, i64* %7, align 8
%23 = icmp slt i64 %22, 0
br i1 %23, label %24, label %25
; <label>:24: ; preds = %21, %5
store i64 0, i64* %6, align 8
br label %54
; <label>:25: ; preds = %21
%26 = load i64, i64* %8, align 8
%27 = load i64, i64* %11, align 8
%28 = load %struct.image*, %struct.image** %9, align 8
%29 = getelementptr inbounds %struct.image, %struct.image* %28, i64 %27
%30 = getelementptr inbounds %struct.image, %struct.image* %29, i32 0, i32 2
%31 = load i64, i64* %30, align 8
%32 = icmp sge i64 %26, %31
br i1 %32, label %36, label %33
; <label>:33: ; preds = %25
%34 = load i64, i64* %8, align 8
%35 = icmp slt i64 %34, 0
br i1 %35, label %36, label %37
; <label>:36: ; preds = %33, %25
store i64 0, i64* %6, align 8
br label %54
; <label>:37: ; preds = %33
%38 = load i64, i64* %11, align 8
%39 = load %struct.image*, %struct.image** %9, align 8
%40 = getelementptr inbounds %struct.image, %struct.image* %39, i64 %38
%41 = bitcast %struct.image* %12 to i8*
%42 = bitcast %struct.image* %40 to i8*
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %41, i8* %42, i64 24, i32 8, i1 false)
%43 = load i64, i64* %8, align 8
%44 = getelementptr inbounds %struct.image, %struct.image* %12, i32 0, i32 1
%45 = load i64, i64* %44, align 8
%46 = mul nsw i64 %43, %45
%47 = load i64, i64* %7, align 8
%48 = add nsw i64 %46, %47
%49 = getelementptr inbounds %struct.image, %struct.image* %12, i32 0, i32 0
%50 = load i8*, i8** %49, align 8
%51 = getelementptr inbounds i8, i8* %50, i64 %48
%52 = load i8, i8* %51, align 1
%53 = zext i8 %52 to i64
store i64 %53, i64* %6, align 8
br label %54
; <label>:54: ; preds = %37, %36, %24
%55 = load i64, i64* %6, align 8
ret i64 %55
}
; Function Attrs: alwaysinline argmemonly nounwind
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1) #3
; Function Attrs: alwaysinline nounwind uwtable
define void @jitfunction(i64, i64, i8*, i8**, i64) #0 {
%6 = alloca i64, align 8
%7 = alloca i64, align 8
%8 = alloca i8*, align 8
%9 = alloca i8**, align 8
%10 = alloca i64, align 8
%11 = alloca %struct.image, align 8
%12 = alloca i8*, align 8
%13 = alloca i64, align 8
%14 = alloca i32, align 4
%15 = alloca i32, align 4
%16 = alloca i64, align 8
store i64 %0, i64* %6, align 8
store i64 %1, i64* %7, align 8
store i8* %2, i8** %8, align 8
store i8** %3, i8*** %9, align 8
store i64 %4, i64* %10, align 8
%17 = load i8*, i8** %8, align 8
%18 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 0
store i8* %17, i8** %18, align 8
%19 = load i64, i64* %6, align 8
%20 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 1
store i64 %19, i64* %20, align 8
%21 = load i64, i64* %7, align 8
%22 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 2
store i64 %21, i64* %22, align 8
%23 = load i64, i64* %10, align 8
%24 = call i8* @llvm.stacksave()
store i8* %24, i8** %12, align 8
%25 = alloca %struct.image, i64 %23, align 16
store i64 0, i64* %13, align 8
br label %26
; <label>:26: ; preds = %46, %5
%27 = load i64, i64* %13, align 8
%28 = load i64, i64* %10, align 8
%29 = icmp ult i64 %27, %28
br i1 %29, label %30, label %49
; <label>:30: ; preds = %26
%31 = load i64, i64* %13, align 8
%32 = load i8**, i8*** %9, align 8
%33 = getelementptr inbounds i8*, i8** %32, i64 %31
%34 = load i8*, i8** %33, align 8
%35 = load i64, i64* %13, align 8
%36 = getelementptr inbounds %struct.image, %struct.image* %25, i64 %35
%37 = getelementptr inbounds %struct.image, %struct.image* %36, i32 0, i32 0
store i8* %34, i8** %37, align 8
%38 = load i64, i64* %6, align 8
%39 = load i64, i64* %13, align 8
%40 = getelementptr inbounds %struct.image, %struct.image* %25, i64 %39
%41 = getelementptr inbounds %struct.image, %struct.image* %40, i32 0, i32 1
store i64 %38, i64* %41, align 8
%42 = load i64, i64* %7, align 8
%43 = load i64, i64* %13, align 8
%44 = getelementptr inbounds %struct.image, %struct.image* %25, i64 %43
%45 = getelementptr inbounds %struct.image, %struct.image* %44, i32 0, i32 2
store i64 %42, i64* %45, align 8
br label %46
; <label>:46: ; preds = %30
%47 = load i64, i64* %13, align 8
%48 = add i64 %47, 1
store i64 %48, i64* %13, align 8
br label %26
; <label>:49: ; preds = %26
store i32 0, i32* %14, align 4
br label %50
; <label>:50: ; preds = %85, %49
%51 = load i32, i32* %14, align 4
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 1
%54 = load i64, i64* %53, align 8
%55 = icmp slt i64 %52, %54
br i1 %55, label %56, label %88
; <label>:56: ; preds = %50
store i32 0, i32* %15, align 4
br label %57
; <label>:57: ; preds = %81, %56
%58 = load i32, i32* %15, align 4
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 2
%61 = load i64, i64* %60, align 8
%62 = icmp slt i64 %59, %61
br i1 %62, label %63, label %84
; <label>:63: ; preds = %57
%64 = load i32, i32* %14, align 4
%65 = sext i32 %64 to i64
%66 = load i32, i32* %15, align 4
%67 = sext i32 %66 to i64
%68 = load i64, i64* %10, align 8
%69 = call i64 @function(i64 %65, i64 %67, %struct.image* %25, i64 %68)
store i64 %69, i64* %16, align 8
%70 = load i64, i64* %16, align 8
%71 = trunc i64 %70 to i8
%72 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 0
%73 = load i8*, i8** %72, align 8
%74 = getelementptr inbounds %struct.image, %struct.image* %11, i32 0, i32 1
%75 = load i64, i64* %74, align 8
%76 = load i32, i32* %14, align 4
%77 = sext i32 %76 to i64
%78 = load i32, i32* %15, align 4
%79 = sext i32 %78 to i64
%80 = call i8* @at(i8* %73, i64 %75, i64 %77, i64 %79)
store i8 %71, i8* %80, align 1
br label %81
; <label>:81: ; preds = %63
%82 = load i32, i32* %15, align 4
%83 = add nsw i32 %82, 1
store i32 %83, i32* %15, align 4
br label %57
; <label>:84: ; preds = %57
br label %85
; <label>:85: ; preds = %84
%86 = load i32, i32* %14, align 4
%87 = add nsw i32 %86, 1
store i32 %87, i32* %14, align 4
br label %50
; <label>:88: ; preds = %50
%89 = load i8*, i8** %12, align 8
call void @llvm.stackrestore(i8* %89)
ret void
}
; Function Attrs: alwaysinline nounwind
declare i8* @llvm.stacksave() #4
; Function Attrs: alwaysinline
define i64 @function(i64, i64, %struct.image*, i64) #5 {
entry:
%call = call i64 @compiled_fn.3(i64 %0, i64 %1, %struct.image* %2, i64 %3)
ret i64 %call
}
; Function Attrs: alwaysinline nounwind
declare void @llvm.stackrestore(i8*) #4
; Function Attrs: alwaysinline
define i64 @image_source(i64, i64, %struct.image*, i64) #6 {
entry:
%call = call i64 @core_input_at(i64 %0, i64 %1, %struct.image* %2, i64 %3, i64 0)
ret i64 %call
}
; Function Attrs: alwaysinline
define i64 @compiled_fn(i64, i64, %struct.image*, i64) #6 {
entry:
%add = add i64 %0, -1
%add1 = add i64 %1, -1
%call = call i64 @image_source(i64 %add, i64 %add1, %struct.image* %2, i64 %3)
%mul = mul i64 %call, -1
%add2 = add i64 %0, -1
%call3 = call i64 @image_source(i64 %add2, i64 %1, %struct.image* %2, i64 %3)
%mul4 = mul i64 %call3, -2
%add5 = add i64 %mul, %mul4
%add6 = add i64 %0, -1
%add7 = add i64 %1, 1
%call8 = call i64 @image_source(i64 %add6, i64 %add7, %struct.image* %2, i64 %3)
%mul9 = mul i64 %call8, -1
%add10 = add i64 %add5, %mul9
%add11 = add i64 %1, -1
%call12 = call i64 @image_source(i64 %0, i64 %add11, %struct.image* %2, i64 %3)
%mul13 = mul i64 %call12, 0
%add14 = add i64 %add10, %mul13
%call15 = call i64 @image_source(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%mul16 = mul i64 %call15, 0
%add17 = add i64 %add14, %mul16
%add18 = add i64 %1, 1
%call19 = call i64 @image_source(i64 %0, i64 %add18, %struct.image* %2, i64 %3)
%mul20 = mul i64 %call19, 0
%add21 = add i64 %add17, %mul20
%add22 = add i64 %0, 1
%add23 = add i64 %1, -1
%call24 = call i64 @image_source(i64 %add22, i64 %add23, %struct.image* %2, i64 %3)
%mul25 = mul i64 %call24, 1
%add26 = add i64 %add21, %mul25
%add27 = add i64 %0, 1
%call28 = call i64 @image_source(i64 %add27, i64 %1, %struct.image* %2, i64 %3)
%mul29 = mul i64 %call28, 2
%add30 = add i64 %add26, %mul29
%add31 = add i64 %0, 1
%add32 = add i64 %1, 1
%call33 = call i64 @image_source(i64 %add31, i64 %add32, %struct.image* %2, i64 %3)
%mul34 = mul i64 %call33, 1
%add35 = add i64 %add30, %mul34
ret i64 %add35
}
; Function Attrs: alwaysinline
define i64 @image_source.1(i64, i64, %struct.image*, i64) #6 {
entry:
%call = call i64 @core_input_at(i64 %0, i64 %1, %struct.image* %2, i64 %3, i64 0)
ret i64 %call
}
; Function Attrs: alwaysinline
define i64 @compiled_fn.2(i64, i64, %struct.image*, i64) #6 {
entry:
%add = add i64 %0, -1
%add1 = add i64 %1, -1
%call = call i64 @image_source.1(i64 %add, i64 %add1, %struct.image* %2, i64 %3)
%mul = mul i64 %call, -1
%add2 = add i64 %0, -1
%call3 = call i64 @image_source.1(i64 %add2, i64 %1, %struct.image* %2, i64 %3)
%mul4 = mul i64 %call3, 0
%add5 = add i64 %mul, %mul4
%add6 = add i64 %0, -1
%add7 = add i64 %1, 1
%call8 = call i64 @image_source.1(i64 %add6, i64 %add7, %struct.image* %2, i64 %3)
%mul9 = mul i64 %call8, 1
%add10 = add i64 %add5, %mul9
%add11 = add i64 %1, -1
%call12 = call i64 @image_source.1(i64 %0, i64 %add11, %struct.image* %2, i64 %3)
%mul13 = mul i64 %call12, -2
%add14 = add i64 %add10, %mul13
%call15 = call i64 @image_source.1(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%mul16 = mul i64 %call15, 0
%add17 = add i64 %add14, %mul16
%add18 = add i64 %1, 1
%call19 = call i64 @image_source.1(i64 %0, i64 %add18, %struct.image* %2, i64 %3)
%mul20 = mul i64 %call19, 2
%add21 = add i64 %add17, %mul20
%add22 = add i64 %0, 1
%add23 = add i64 %1, -1
%call24 = call i64 @image_source.1(i64 %add22, i64 %add23, %struct.image* %2, i64 %3)
%mul25 = mul i64 %call24, -1
%add26 = add i64 %add21, %mul25
%add27 = add i64 %0, 1
%call28 = call i64 @image_source.1(i64 %add27, i64 %1, %struct.image* %2, i64 %3)
%mul29 = mul i64 %call28, 0
%add30 = add i64 %add26, %mul29
%add31 = add i64 %0, 1
%add32 = add i64 %1, 1
%call33 = call i64 @image_source.1(i64 %add31, i64 %add32, %struct.image* %2, i64 %3)
%mul34 = mul i64 %call33, 1
%add35 = add i64 %add30, %mul34
ret i64 %add35
}
; Function Attrs: alwaysinline
define i64 @compiled_fn.3(i64, i64, %struct.image*, i64) #6 {
entry:
%call = call i64 @compiled_fn(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%call1 = call i64 @compiled_fn(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%mul = mul i64 %call, %call1
%call2 = call i64 @compiled_fn.2(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%call3 = call i64 @compiled_fn.2(i64 %0, i64 %1, %struct.image* %2, i64 %3)
%mul4 = mul i64 %call2, %call3
%add = add i64 %mul, %mul4
%call5 = call i64 @core_isqrt(i64 %add)
ret i64 %call5
}
attributes #0 = { alwaysinline nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { alwaysinline nounwind "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #2 = { alwaysinline inlinehint nounwind uwtable "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #3 = { alwaysinline argmemonly nounwind }
attributes #4 = { alwaysinline nounwind }
attributes #5 = { alwaysinline "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #6 = { alwaysinline }
attributes #7 = { nounwind }
!llvm.ident = !{!0}
!0 = !{!"clang version 3.9.0 (https://github.com/llvm-mirror/clang.git 4d2d3547c6bcc274ef94482d7899f57d0a8e0967) (https://github.com/llvm-mirror/llvm.git 2605c1b13c0b3b5dafd6af8dd38c29a441e7be74)"}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment