Skip to content

Commit 6f4f899

Browse files
committed
complicated test case
1 parent 952287f commit 6f4f899

File tree

2 files changed

+147
-0
lines changed

2 files changed

+147
-0
lines changed

lit/autodiff/double_diff.thorin

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// RUN: rm -f %t.ll ; \
2+
// RUN: %thorin -d autodiff %s --output-ll %t.ll --output-thorin - | FileCheck %s
3+
4+
// a call to a autodiff style function
5+
// ./build/bin/thorin -d debug -d direct -d autodiff ./lit/autodiff/multiply_autodiff.thorin --output-thorin - -VVVV
6+
7+
// triple take
8+
/*
9+
eval_thorin () {
10+
./build/bin/thorin -d debug -d direct -d autodiff $1 --output-thorin $2 -VVVV
11+
}
12+
T0=./lit/autodiff/multiply_autodiff.thorin
13+
T1=$(mktemp)
14+
T2=$(mktemp)
15+
eval_thorin $T0 $T1 && \
16+
eval_thorin $T1 $T2 && \
17+
eval_thorin $T2 -
18+
19+
*/
20+
.import core;
21+
.import autodiff;
22+
.import mem;
23+
24+
.let I32 = %Int 4294967296;
25+
26+
.cn f [a:I32, ret: .Cn [I32]] = {
27+
.let b = %core.wrap.mul (0:.Nat, 4294967296:.Nat) (a, a);
28+
ret b
29+
};
30+
31+
.cn g [a:I32, ret: .Cn [I32]] = {
32+
.cn ret_cont [r:I32,pb:.Cn[I32,.Cn[I32]]] = {
33+
.cn pb_ret_cont [pr:I32] = {
34+
ret pr
35+
};
36+
pb((1:I32),pb_ret_cont)
37+
}
38+
.let f_diff = %autodiff.autodiff (.Cn [I32,.Cn[I32]]) f;
39+
f_diff (a, ret_cont)
40+
};
41+
42+
.cn .extern main [mem : %mem.M, argc : I32, argv : %mem.Ptr (%mem.Ptr (%Int 256, 0:.Nat), 0:.Nat), return : .Cn [%mem.M, I32]] = {
43+
44+
.cn ret_cont [r:I32,pb:.Cn[I32,.Cn[I32]]] = {
45+
.cn pb_ret_cont [pr:I32] = {
46+
.let c = %core.wrap.mul (0:.Nat, 4294967296:.Nat) (100:I32, r);
47+
.let d = %core.wrap.add (0:.Nat, 4294967296:.Nat) (c, pr);
48+
return (mem, d)
49+
};
50+
// return (mem, r)
51+
pb((1:I32),pb_ret_cont)
52+
};
53+
54+
.let f_diff = %autodiff.autodiff (.Cn [I32,.Cn[I32]]) f;
55+
.let f_diff_cast =
56+
// %core.bitcast
57+
// (
58+
// .Cn [I32, .Cn[I32, .Cn[I32, .Cn[I32]]]],
59+
// %autodiff.autodiff_type (.Cn [I32, .Cn[I32]])
60+
// )
61+
f_diff;
62+
63+
.let c = (42:I32);
64+
f_diff_cast (c,ret_cont)
65+
};
66+
67+
68+
// .let b = %Wrap_mul (0:.Nat, 4294967296:.Nat) (3:I32, a);
69+
70+
// .let c = f (42:I32);
71+
// return (mem, c)
72+
73+
// CHECK-DAG: .cn .extern main _{{[0-9_]+}}::[mem_[[memId:[_0-9]*]]: %mem.M, (%Int 4294967296), %mem.Ptr (%mem.Ptr ((%Int 256), 0:.Nat), 0:.Nat), return_[[returnId:[_0-9]*]]: .Cn [%mem.M, (%Int 4294967296)]] = {
74+
// CHECK-DAG: _[[appId:[_0-9]*]]: ⊥:★ = return_[[returnEtaId:[_0-9]*]] (mem_[[memId]], 42:(%Int 4294967296));
75+
// CHECK-DAG: _[[appId]]
76+
77+
// CHECK-DAG: return_[[returnEtaId]] _[[returnEtaVarId:[0-9_]+]]: [%mem.M, (%Int 4294967296)] = {
78+
// CHECK-DAG: return_[[retAppId:[_0-9]*]]: ⊥:★ = return_[[returnId]] _[[returnEtaVarId]];
79+
// CHECK-DAG: return_[[retAppId]]

lit/autodiff/square_autodiff.thorin

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// RUN: rm -f %t.ll ; \
2+
// RUN: %thorin -d autodiff %s --output-ll %t.ll --output-thorin - | FileCheck %s
3+
4+
// a call to a autodiff style function
5+
// ./build/bin/thorin -d debug -d direct -d autodiff ./lit/autodiff/multiply_autodiff.thorin --output-thorin - -VVVV
6+
7+
// triple take
8+
/*
9+
eval_thorin () {
10+
./build/bin/thorin -d debug -d direct -d autodiff $1 --output-thorin $2 -VVVV
11+
}
12+
T0=./lit/autodiff/multiply_autodiff.thorin
13+
T1=$(mktemp)
14+
T2=$(mktemp)
15+
eval_thorin $T0 $T1 && \
16+
eval_thorin $T1 $T2 && \
17+
eval_thorin $T2 -
18+
19+
*/
20+
.import core;
21+
.import autodiff;
22+
.import mem;
23+
24+
.let I32 = %Int 4294967296;
25+
26+
.cn f [a:I32, ret: .Cn [I32]] = {
27+
.let b = %core.wrap.mul (0:.Nat, 4294967296:.Nat) (a, a);
28+
ret b
29+
};
30+
31+
.cn .extern main [mem : %mem.M, argc : I32, argv : %mem.Ptr (%mem.Ptr (%Int 256, 0:.Nat), 0:.Nat), return : .Cn [%mem.M, I32]] = {
32+
33+
.cn ret_cont [r:I32,pb:.Cn[I32,.Cn[I32]]] = {
34+
.cn pb_ret_cont [pr:I32] = {
35+
.let c = %core.wrap.mul (0:.Nat, 4294967296:.Nat) (100:I32, r);
36+
.let d = %core.wrap.add (0:.Nat, 4294967296:.Nat) (c, pr);
37+
return (mem, d)
38+
};
39+
// return (mem, r)
40+
pb((1:I32),pb_ret_cont)
41+
};
42+
43+
.let f_diff = %autodiff.autodiff (.Cn [I32,.Cn[I32]]) f;
44+
.let f_diff_cast =
45+
// %core.bitcast
46+
// (
47+
// .Cn [I32, .Cn[I32, .Cn[I32, .Cn[I32]]]],
48+
// %autodiff.autodiff_type (.Cn [I32, .Cn[I32]])
49+
// )
50+
f_diff;
51+
52+
.let c = (42:I32);
53+
f_diff_cast (c,ret_cont)
54+
};
55+
56+
57+
// .let b = %Wrap_mul (0:.Nat, 4294967296:.Nat) (3:I32, a);
58+
59+
// .let c = f (42:I32);
60+
// return (mem, c)
61+
62+
// CHECK-DAG: .cn .extern main _{{[0-9_]+}}::[mem_[[memId:[_0-9]*]]: %mem.M, (%Int 4294967296), %mem.Ptr (%mem.Ptr ((%Int 256), 0:.Nat), 0:.Nat), return_[[returnId:[_0-9]*]]: .Cn [%mem.M, (%Int 4294967296)]] = {
63+
// CHECK-DAG: _[[appId:[_0-9]*]]: ⊥:★ = return_[[returnEtaId:[_0-9]*]] (mem_[[memId]], 42:(%Int 4294967296));
64+
// CHECK-DAG: _[[appId]]
65+
66+
// CHECK-DAG: return_[[returnEtaId]] _[[returnEtaVarId:[0-9_]+]]: [%mem.M, (%Int 4294967296)] = {
67+
// CHECK-DAG: return_[[retAppId:[_0-9]*]]: ⊥:★ = return_[[returnId]] _[[returnEtaVarId]];
68+
// CHECK-DAG: return_[[retAppId]]

0 commit comments

Comments
 (0)