This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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