Skip to content

Commit 5959688

Browse files
Add $ParentTrait pattern to verify macro + Add SameTypeOperands as a explicit dependency
Signed-off-by: Tomas Fabrizio Orsi <[email protected]>
1 parent 2176c41 commit 5959688

File tree

5 files changed

+99
-11
lines changed

5 files changed

+99
-11
lines changed

dialects/arith/src/ops/unary.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ macro_rules! infer_return_ty_for_unary_op {
2828
/// Increment
2929
#[operation (
3030
dialect = ArithDialect,
31-
traits(UnaryOp, SameOperandsAndResultType),
31+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
3232
implements(InferTypeOpInterface, MemoryEffectOpInterface)
3333
)]
3434
pub struct Incr {
@@ -44,7 +44,7 @@ has_no_effects!(Incr);
4444
/// Negation
4545
#[operation (
4646
dialect = ArithDialect,
47-
traits(UnaryOp, SameOperandsAndResultType),
47+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
4848
implements(InferTypeOpInterface, MemoryEffectOpInterface)
4949
)]
5050
pub struct Neg {
@@ -60,7 +60,7 @@ has_no_effects!(Neg);
6060
/// Modular inverse
6161
#[operation (
6262
dialect = ArithDialect,
63-
traits(UnaryOp, SameOperandsAndResultType),
63+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
6464
implements(InferTypeOpInterface, MemoryEffectOpInterface)
6565
)]
6666
pub struct Inv {
@@ -76,7 +76,7 @@ has_no_effects!(Inv);
7676
/// log2(operand)
7777
#[operation (
7878
dialect = ArithDialect,
79-
traits(UnaryOp, SameOperandsAndResultType),
79+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
8080
implements(InferTypeOpInterface, MemoryEffectOpInterface)
8181
)]
8282
pub struct Ilog2 {
@@ -92,7 +92,7 @@ has_no_effects!(Ilog2);
9292
/// pow2(operand)
9393
#[operation (
9494
dialect = ArithDialect,
95-
traits(UnaryOp, SameOperandsAndResultType),
95+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
9696
implements(InferTypeOpInterface, MemoryEffectOpInterface)
9797
)]
9898
pub struct Pow2 {
@@ -108,7 +108,7 @@ has_no_effects!(Pow2);
108108
/// Logical NOT
109109
#[operation (
110110
dialect = ArithDialect,
111-
traits(UnaryOp, SameOperandsAndResultType),
111+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
112112
implements(InferTypeOpInterface, MemoryEffectOpInterface)
113113
114114
)]
@@ -125,7 +125,7 @@ has_no_effects!(Not);
125125
/// Bitwise NOT
126126
#[operation (
127127
dialect = ArithDialect,
128-
traits(UnaryOp, SameOperandsAndResultType),
128+
traits(UnaryOp, SameTypeOperands, SameOperandsAndResultType),
129129
implements(InferTypeOpInterface, MemoryEffectOpInterface)
130130
)]
131131
pub struct Bnot {

dialects/hir/src/ops/primop.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::HirDialect;
44

55
#[operation(
66
dialect = HirDialect,
7-
traits(SameOperandsAndResultType),
7+
traits(SameTypeOperands, SameOperandsAndResultType),
88
implements(InferTypeOpInterface, MemoryEffectOpInterface)
99
)]
1010
pub struct MemGrow {

dialects/hir/src/ops/spills.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::HirDialect;
55

66
#[operation(
77
dialect = HirDialect,
8-
traits(SameOperandsAndResultType),
8+
traits(SameTypeOperands, SameOperandsAndResultType),
99
implements(MemoryEffectOpInterface, SpillLike)
1010
)]
1111
pub struct Spill {
@@ -34,7 +34,7 @@ impl EffectOpInterface<MemoryEffect> for Spill {
3434

3535
#[operation(
3636
dialect = HirDialect,
37-
traits(SameOperandsAndResultType),
37+
traits(SameTypeOperands, SameOperandsAndResultType),
3838
implements(InferTypeOpInterface, MemoryEffectOpInterface, ReloadLike)
3939
)]
4040
pub struct Reload {

hir/src/derive.rs

+88
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,46 @@ macro_rules! derive {
3737
$($t)*
3838
};
3939

40+
(
41+
$(#[$outer:meta])*
42+
$vis:vis trait $OpTrait:ident : $ParentTrait:ident {
43+
$(
44+
$OpTraitItem:item
45+
)*
46+
}
47+
48+
verify {
49+
$(
50+
fn $verify_fn:ident($op:ident: &$OperationPath:path, $ctx:ident: &$ContextPath:path) -> $VerifyResult:ty $verify:block
51+
)+
52+
}
53+
54+
$($t:tt)*
55+
) => {
56+
$crate::__derive_op_trait! {
57+
$(#[$outer])*
58+
$vis trait $OpTrait : $ParentTrait {
59+
$(
60+
$OpTraitItem:item
61+
)*
62+
}
63+
64+
verify {
65+
$(
66+
fn $verify_fn($op: &$OperationPath, $ctx: &$ContextPath) -> $VerifyResult $verify
67+
)*
68+
}
69+
}
70+
71+
$($t)*
72+
};
73+
74+
75+
76+
77+
78+
79+
4080
(
4181
$(#[$outer:meta])*
4282
$vis:vis trait $OpTrait:ident {
@@ -111,6 +151,54 @@ macro_rules! __derive_op_trait {
111151
}
112152
};
113153

154+
(
155+
$(#[$outer:meta])*
156+
$vis:vis trait $OpTrait:ident : $ParentTrait:ident {
157+
$(
158+
$OpTraitItem:item
159+
)*
160+
}
161+
162+
verify {
163+
$(
164+
fn $verify_fn:ident($op:ident: &$OperationPath:path, $ctx:ident: &$ContextPath:path) -> $VerifyResult:ty $verify:block
165+
)+
166+
}
167+
) => {
168+
$(#[$outer])*
169+
$vis trait $OpTrait : $ParentTrait {
170+
$(
171+
$OpTraitItem
172+
)*
173+
}
174+
175+
impl<T: $crate::Op + $OpTrait> $crate::Verify<dyn $OpTrait> for T {
176+
#[inline]
177+
fn verify(&self, context: &$crate::Context) -> Result<(), $crate::Report> {
178+
<$crate::Operation as $crate::Verify<dyn $OpTrait>>::verify(self.as_operation(), context)
179+
}
180+
}
181+
182+
impl $crate::Verify<dyn $OpTrait> for $crate::Operation {
183+
fn should_verify(&self, _context: &$crate::Context) -> bool {
184+
self.implements::<dyn $OpTrait>()
185+
}
186+
187+
fn verify(&self, context: &$crate::Context) -> Result<(), $crate::Report> {
188+
$(
189+
#[inline]
190+
fn $verify_fn($op: &$OperationPath, $ctx: &$ContextPath) -> $VerifyResult $verify
191+
)*
192+
193+
$(
194+
$verify_fn(self, context)?;
195+
)*
196+
197+
Ok(())
198+
}
199+
}
200+
};
201+
114202
(
115203
$(#[$outer:meta])*
116204
$vis:vis trait $OpTrait:ident {

hir/src/ir/traits/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ derive! {
7373
/// TODO(pauls): Implement verification for this. Ideally we could require `SameTypeOperands`
7474
/// as a super trait, check the operands using its implementation, and then check the results
7575
/// separately
76-
pub trait SameOperandsAndResultType {}
76+
pub trait SameOperandsAndResultType: SameTypeOperands {}
7777

7878
verify {
7979
fn operands_and_result_are_the_same_type(op: &Operation, context: &Context) -> Result<(), Report> {

0 commit comments

Comments
 (0)