Skip to content

Commit d94369f

Browse files
committed
Collect op inlinability information and allow it to be queried.
1 parent 127288f commit d94369f

File tree

1 file changed

+35
-4
lines changed

1 file changed

+35
-4
lines changed

src/QAST/Operations.nqp

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ class QAST::Operations {
1313
my %hll_box;
1414
my %hll_unbox;
1515

16+
# What we know about inlinability.
17+
my %core_inlinability;
18+
my %hll_inlinability;
19+
1620
# Compiles an operation to POST.
1721
method compile_op($qastcomp, $hll, $op) {
1822
my $name := $op.op;
@@ -27,6 +31,7 @@ class QAST::Operations {
2731
pir::die("No registered operation handler for '$name'");
2832
}
2933

34+
# Compiles a PIR operation.
3035
method compile_pirop($qastcomp, $op_name, @op_args) {
3136
if nqp::index($op_name, ' ') {
3237
$op_name := nqp::join('__', nqp::split(' ', $op_name));
@@ -39,31 +44,57 @@ class QAST::Operations {
3944
}
4045

4146
# Adds a core op handler.
42-
method add_core_op($op, $handler, :$inlinable) {
47+
method add_core_op($op, $handler, :$inlinable = 0) {
4348
%core_ops{$op} := $handler;
49+
self.set_core_op_inlinability($op, $inlinable);
4450
}
4551

4652
# Adds a HLL op handler.
47-
method add_hll_op($hll, $op, $handler, :$inlinable) {
53+
method add_hll_op($hll, $op, $handler, :$inlinable = 0) {
4854
%hll_ops{$hll} := {} unless %hll_ops{$hll};
4955
%hll_ops{$hll}{$op} := $handler;
56+
self.set_hll_op_inlinability($hll, $op, $inlinable);
5057
}
5158

5259
# Adds a core op that maps to a PIR op.
53-
method add_core_pirop_mapping($op, $pirop, $sig, :$inlinable) {
60+
method add_core_pirop_mapping($op, $pirop, $sig, :$inlinable = 0) {
5461
my $pirop_mapper := pirop_mapper($pirop, $sig);
5562
%core_ops{$op} := -> $qastcomp, $op {
5663
$pirop_mapper($qastcomp, $op.op, $op.list)
5764
};
65+
self.set_core_op_inlinability($op, $inlinable);
5866
}
5967

6068
# Adds a HLL op that maps to a PIR op.
61-
method add_hll_pirop_mapping($hll, $op, $pirop, $sig, :$inlinable) {
69+
method add_hll_pirop_mapping($hll, $op, $pirop, $sig, :$inlinable = 0) {
6270
my $pirop_mapper := pirop_mapper($pirop, $sig);
6371
%hll_ops{$hll} := {} unless %hll_ops{$hll};
6472
%hll_ops{$hll}{$op} := -> $qastcomp, $op {
6573
$pirop_mapper($qastcomp, $op.op, $op.list)
6674
};
75+
self.set_hll_op_inlinability($hll, $op, $inlinable);
76+
}
77+
78+
# Sets op inlinability at a core level.
79+
method set_core_op_inlinability($op, $inlinable) {
80+
%core_inlinability{$op} := $inlinable;
81+
}
82+
83+
# Sets op inlinability at a HLL level. (Can override at HLL level whether
84+
# or not the HLL overrides the op itself.)
85+
method set_hll_op_inlinability($hll, $op, $inlinable) {
86+
%hll_inlinability{$hll} := {} unless %hll_inlinability{$hll};
87+
%hll_inlinability{$hll}{$op} := $inlinable;
88+
}
89+
90+
# Checks if an op is consdiered inlinable.
91+
method is_inlinable($hll, $op) {
92+
if nqp::existskey(%hll_inlinability, $hll) {
93+
if nqp::existskey(%hll_inlinability{$hll}, $op) {
94+
return %hll_inlinability{$hll}{$op};
95+
}
96+
}
97+
return %core_inlinability{$op} // 0;
6798
}
6899

69100
# Adds a HLL box handler.

0 commit comments

Comments
 (0)