Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: merge basic blocks algorithm #956

Merged
merged 26 commits into from
May 10, 2024
Merged

feat: merge basic blocks algorithm #956

merged 26 commits into from
May 10, 2024

Conversation

acl-cqc
Copy link
Contributor

@acl-cqc acl-cqc commented Apr 19, 2024

Any basic block with a single successor that has no other predecessors can be merged. (So long as the successor is not the exit block; nor the entry block, as that implicitly has another predecessor).

Implement via Replace (2 BBs - > one BB containing 2 DFGs, which adopt the original BB's children) and 2*InlineDFG.

Closes #561.

}
#[test]
fn in_loop() -> Result<(), Box<dyn std::error::Error>> {
/* -> Noop1 -----> Test -> Exit -> Noop1AndTest --> Exit
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel this shape is a reasonable test, so am not tooo worried about adding more control-flow structures. However it'd definitely be good to add more differently-typed blocks e.g. with different numbers of inputs/outputs, values in the branch-control predicate or not, etc.

@Cobord
Copy link
Contributor

Cobord commented Apr 22, 2024

Is there anything that would want prevention of making basic blocks too big? I had this where if the merged would be too big (option input for what that limit is) for a pass to do quickly enough (because only had smaller basic blocks in mind when doing that one) it would just leave them as they were.

@acl-cqc acl-cqc marked this pull request as draft April 30, 2024 16:55
@acl-cqc
Copy link
Contributor Author

acl-cqc commented Apr 30, 2024

Is there anything that would want prevention of making basic blocks too big? I had this where if the merged would be too big (option input for what that limit is) for a pass to do quickly enough (because only had smaller basic blocks in mind when doing that one) it would just leave them as they were.

Hi @Cobord, thanks for the interest! :)

Hmmm, well, that's quite a complex question. So in general, we favour bringing more code together into fewer basic blocks as this will make it easier to find more opportunities for other optimisations. If a particular pass is inefficient (supralinear or quadratic in BB-size, say) then that could be an issue. However, firstly note that the existing basic block boundaries are not necessarily the best boundaries - blocks are dataflow graph with parallelism, so we could break the block on any cut across. So, it'd be better for optimizations to pick their own arbitrary divisions. The argument for not merging, thus, would be if we wanted to keep the divisions between BBs that existed, presumably because we thought those were good divisions - suggesting that we've already done some deliberate partitioning; and we would only want to do such deliberate partitioning ahead of the pass needing it, if there were multiple passes (or repeat instances of the same pass) that want this partitioning.

I think we are a long way from that being a problem!

A second reason for merging basic blocks is that it'll simplify the step of detecting structured control flow (conditionals and tail loops) i.e. these passes will not need to deal with single-pred-single-succ chains. Hence, the solution I'd prefer (if we do want to avoid blocks getting too big) would be to skip the InlineDFGs step, rather than leave BBs unmerged. One could pass in a filter-function should_inline_DFGs: impl Fn<BasicBlockID> -> bool, say, that defaults to always-true. I think that's something we could add (straightforwardly) in a follow-up PR if needed, though.

@doug-q
Copy link
Collaborator

doug-q commented May 1, 2024

I think we should put this into a new hugr-passes crate. This doesn't need any private access into hugr; putting passes into another crate ensures it stays clean and ensures we don't do anything naughty.

Copy link

codecov bot commented May 3, 2024

Codecov Report

Attention: Patch coverage is 91.84549% with 19 lines in your changes are missing coverage. Please review.

Project coverage is 85.90%. Comparing base (529f553) to head (7819211).
Report is 24 commits behind head on main.

❗ Current head 7819211 differs from pull request most recent head 6e4a3fe. Consider uploading reports for the commit 6e4a3fe to get more accurate results

Files Patch % Lines
hugr/src/algorithm/merge_bbs.rs 91.84% 2 Missing and 17 partials ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #956      +/-   ##
==========================================
+ Coverage   85.88%   85.90%   +0.01%     
==========================================
  Files          78       80       +2     
  Lines       14407    14765     +358     
  Branches    14407    14765     +358     
==========================================
+ Hits        12374    12684     +310     
- Misses       1397     1418      +21     
- Partials      636      663      +27     
Flag Coverage Δ
rust 85.90% <91.84%> (+0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

@acl-cqc
Copy link
Contributor Author

acl-cqc commented May 3, 2024

I think we should put this into a new hugr-passes crate. This doesn't need any private access into hugr; putting passes into another crate ensures it stays clean and ensures we don't do anything naughty.

I am generally for this, but it's not quite as straightforward as it sounds - for starters, we should take as much of the algorithm module as we can into hugr_passes as well, including nest_cfgs in particular (we might not want to move const_fold as the standard extensions in the main Hugr crate needs to depend upon that and we can't have cyclic dependencies). However the test code for nest_cfgs is also used by the OutlineCfg rewrite and that's not easily separated (and its a lot to duplicate). Secondly we would need to make trait HugrMut pub, and while moving this stuff out is exactly the kind of reason why we should make HugrMut pub, this is definitely something to do in a separate refactoring PR. I'm having a go at this now, but I think there is enough "meat" in this merge-bbs PR to start looking at it
as it stands (regardless of the order in which merging and moving happens).....

@acl-cqc acl-cqc marked this pull request as ready for review May 3, 2024 13:25
@acl-cqc acl-cqc requested a review from cqc-alec May 3, 2024 13:25
@cqc-alec
Copy link
Collaborator

cqc-alec commented May 3, 2024

I think we should put this into a new hugr-passes crate. This doesn't need any private access into hugr; putting passes into another crate ensures it stays clean and ensures we don't do anything naughty.

I am generally for this, but it's not quite as straightforward as it sounds - for starters, we should take as much of the algorithm module as we can into hugr_passes as well, including nest_cfgs in particular (we might not want to move const_fold as the standard extensions in the main Hugr crate needs to depend upon that and we can't have cyclic dependencies). However the test code for nest_cfgs is also used by the OutlineCfg rewrite and that's not easily separated (and its a lot to duplicate). Secondly we would need to make trait HugrMut pub, and while moving this stuff out is exactly the kind of reason why we should make HugrMut pub, this is definitely something to do in a separate refactoring PR. I'm having a go at this now, but I think there is enough "meat" in this merge-bbs PR to start looking at it as it stands (regardless of the order in which merging and moving happens).....

The main issue seems to be that a lot of test code for non-pass functionality depends on passes that are currently implemented in HUGR. While this is convenient, we could probably organize things differently. Some of that test code (including the tests that use constant_fold_pass) could just as well live in the hugr-passes crate.

But I agree that this needn't wait for that refactor.

@doug-q
Copy link
Collaborator

doug-q commented May 3, 2024

The main issue seems to be that a lot of test code for non-pass functionality depends on passes that are currently implemented in HUGR. While this is convenient, we could probably organize things differently. Some of that test code (including the tests that use constant_fold_pass) could just as well live in the hugr-passes crate.

But I agree that this needn't wait for that refactor.

My understanding is that we could put the passes into hugr-crate, add hugr-crate as a dev-dependency to hugr and it would work. i.e. circular dependencies are allowed in that case.

let Ok(succ) = cfg.output_neighbours(n).exactly_one() else {
continue;
};
if cfg.input_neighbours(succ).take(2).collect::<Vec<_>>() != vec![n] {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could just check the size here.

let tst = bb3.add_dataflow_op(tst_op, [q, u])?;
let pred = lifted_unary_unit_sum(&mut bb3);
let bb3 = bb3.finish_with_outputs(pred, tst.outputs())?;
println!("ALAN bb1 {bb1:?} bb2 {bb2:?} bb3 {bb3:?}");
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like a debug line left in by mistake?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oops, thanks!

@acl-cqc acl-cqc enabled auto-merge May 10, 2024 09:15
@acl-cqc acl-cqc added this pull request to the merge queue May 10, 2024
Merged via the queue into main with commit 33ab50d May 10, 2024
16 checks passed
@acl-cqc acl-cqc deleted the feat/merge_bbs branch May 10, 2024 09:18
github-merge-queue bot pushed a commit that referenced this pull request May 13, 2024
## 🤖 New release
* `hugr`: 0.3.1 -> 0.4.0-alpha.1 (⚠️ API breaking changes)

### ⚠️ `hugr` breaking changes

```
--- failure enum_marked_non_exhaustive: enum marked #[non_exhaustive] ---

Description:
A public enum has been marked #[non_exhaustive]. Pattern-matching on it outside of its crate must now include a wildcard pattern like `_`, or it will fail to compile.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#attr-adding-non-exhaustive
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/enum_marked_non_exhaustive.ron

Failed in:
  enum RegionBlocksError in /tmp/.tmpleGpag/hugr/hugr/src/algorithm/nest_cfgs.rs:282
  enum EdgeValidationError in /tmp/.tmpleGpag/hugr/hugr/src/ops/validate.rs:213
  enum ExtensionDeclarationError in /tmp/.tmpleGpag/hugr/hugr/src/extension/declarative.rs:179
  enum InterGraphEdgeError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/validate.rs:748
  enum ValidationError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/validate.rs:632
  enum ValidationError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/validate.rs:632
  enum HUGRSerializationError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/serialize.rs:107
  enum InlineDFGError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/inline_dfg.rs:15
  enum ExtensionError in /tmp/.tmpleGpag/hugr/hugr/src/extension/validate.rs:163
  enum IntOpDef in /tmp/.tmpleGpag/hugr/hugr/src/std_extensions/arithmetic/int_ops.rs:51
  enum ChildrenValidationError in /tmp/.tmpleGpag/hugr/hugr/src/ops/validate.rs:163
  enum SumTypeError in /tmp/.tmpleGpag/hugr/hugr/src/types/check.rs:11
  enum ReplaceError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/replace.rs:388
  enum ConvertOpDef in /tmp/.tmpleGpag/hugr/hugr/src/std_extensions/arithmetic/conversions.rs:30
  enum InvalidSubgraph in /tmp/.tmpleGpag/hugr/hugr/src/hugr/views/sibling_subgraph.rs:647
  enum TypeArgError in /tmp/.tmpleGpag/hugr/hugr/src/types/type_param.rs:376
  enum SumType in /tmp/.tmpleGpag/hugr/hugr/src/types.rs:124
  enum ListOp in /tmp/.tmpleGpag/hugr/hugr/src/std_extensions/collections.rs:209
  enum SimpleReplacementError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/simple_replace.rs:185
  enum SimpleReplacementError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/simple_replace.rs:185
  enum SimpleReplacementError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/simple_replace.rs:185
  enum CustomCheckFailure in /tmp/.tmpleGpag/hugr/hugr/src/ops/constant.rs:227
  enum CustomCheckFailure in /tmp/.tmpleGpag/hugr/hugr/src/ops/constant.rs:227
  enum IdentityInsertionError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/insert_identity.rs:36
  enum RemoveError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/consts.rs:18
  enum OutlineCfgError in /tmp/.tmpleGpag/hugr/hugr/src/hugr/rewrite/outline_cfg.rs:223
  enum NaryLogic in /tmp/.tmpleGpag/hugr/hugr/src/std_extensions/logic.rs:56
  enum OpLoadError in /tmp/.tmpleGpag/hugr/hugr/src/extension/simple_op.rs:24
  enum ConstTypeError in /tmp/.tmpleGpag/hugr/hugr/src/ops/constant.rs:244
  enum ConstTypeError in /tmp/.tmpleGpag/hugr/hugr/src/ops/constant.rs:244
  enum InvalidReplacement in /tmp/.tmpleGpag/hugr/hugr/src/hugr/views/sibling_subgraph.rs:629
  enum InvalidSubgraphBoundary in /tmp/.tmpleGpag/hugr/hugr/src/hugr/views/sibling_subgraph.rs:665
  enum InferExtensionError in /tmp/.tmpleGpag/hugr/hugr/src/extension/infer.rs:68
  enum FloatOps in /tmp/.tmpleGpag/hugr/hugr/src/std_extensions/arithmetic/float_ops.rs:25
  enum CustomOpError in /tmp/.tmpleGpag/hugr/hugr/src/ops/custom.rs:400

--- failure enum_missing: pub enum removed or renamed ---

Description:
A publicly-visible enum cannot be imported by its prior path. A `pub use` may have been removed, or the enum itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/enum_missing.ron

Failed in:
  enum hugr::ops::constant::Const, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:22
  enum hugr::ops::Const, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:22

--- failure enum_struct_variant_field_added: pub enum struct variant field added ---

Description:
An enum's exhaustive struct variant has a new field, which has to be included when constructing or matching on this variant.
        ref: https://doc.rust-lang.org/reference/attributes/type_system.html#the-non_exhaustive-attribute
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/enum_struct_variant_field_added.ron

Failed in:
  field dir of variant HUGRSerializationError::MissingPortOffset in /tmp/.tmpleGpag/hugr/hugr/src/hugr/serialize.rs:120

--- failure enum_variant_added: enum variant added on exhaustive enum ---

Description:
A publicly-visible enum without #[non_exhaustive] has a new variant.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#enum-variant-new
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/enum_variant_added.ron

Failed in:
  variant SignatureError:LoadFunctionIncorrectlyAppliesType in /tmp/.tmpleGpag/hugr/hugr/src/extension.rs:182
  variant ExtensionBuildError:ValueExists in /tmp/.tmpleGpag/hugr/hugr/src/extension.rs:405

--- failure inherent_method_missing: pub method removed or renamed ---

Description:
A publicly-visible method or associated fn is no longer available under its prior name. It may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/inherent_method_missing.ron

Failed in:
  ConvertOpDef::with_width, previously in file /tmp/.tmppKREXC/hugr/src/std_extensions/arithmetic/conversions.rs:78
  IntOpDef::with_width, previously in file /tmp/.tmppKREXC/hugr/src/std_extensions/arithmetic/int_ops.rs:314
  IntOpDef::with_two_widths, previously in file /tmp/.tmppKREXC/hugr/src/std_extensions/arithmetic/int_ops.rs:323
  Const::const_type, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:124
  Const::sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:138
  Const::tuple, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:153
  Const::function, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:164
  Const::unit, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:173
  Const::unit_sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:178
  Const::unary_unit_sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:183
  Const::true_val, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:188
  Const::false_val, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:193
  Const::from_bool, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:199
  Const::extension, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:208
  Const::get_custom_value, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:215
  Const::const_type, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:124
  Const::sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:138
  Const::tuple, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:153
  Const::function, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:164
  Const::unit, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:173
  Const::unit_sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:178
  Const::unary_unit_sum, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:183
  Const::true_val, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:188
  Const::false_val, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:193
  Const::from_bool, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:199
  Const::extension, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:208
  Const::get_custom_value, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:215

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/struct_missing.ron

Failed in:
  struct hugr::std_extensions::arithmetic::int_types::ConstIntS, previously in file /tmp/.tmppKREXC/hugr/src/std_extensions/arithmetic/int_types.rs:83
  struct hugr::std_extensions::arithmetic::int_types::ConstIntU, previously in file /tmp/.tmppKREXC/hugr/src/std_extensions/arithmetic/int_types.rs:76
  struct hugr::ops::constant::ExtensionConst, previously in file /tmp/.tmppKREXC/hugr/src/ops/constant.rs:64

--- failure trait_missing: pub trait removed or renamed ---

Description:
A publicly-visible trait cannot be imported by its prior path. A `pub use` may have been removed, or the trait itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/trait_missing.ron

Failed in:
  trait hugr::ops::OpName, previously in file /tmp/.tmppKREXC/hugr/src/ops.rs:307

--- failure trait_removed_supertrait: supertrait removed or renamed ---

Description:
A supertrait was removed from a trait. Users of the trait can no longer assume it can also be used like its supertrait.
        ref: https://doc.rust-lang.org/reference/items/traits.html#supertraits
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/trait_removed_supertrait.ron

Failed in:
  supertrait hugr::ops::OpName of trait MakeExtensionOp in file /tmp/.tmpleGpag/hugr/hugr/src/extension/simple_op.rs:87
  supertrait hugr::ops::OpName of trait MakeOpDef in file /tmp/.tmpleGpag/hugr/hugr/src/extension/simple_op.rs:45
```

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

## 0.4.0 (2024-05-13)

### Bug Fixes

- Serialization round-trips
([#948](#948))
- [**breaking**] Combine `ConstIntU` and `ConstIntS`
([#974](#974))
- Disable serialisation tests when miri is active
([#977](#977))
- [**breaking**] Serialisation schema
([#968](#968))
- Correct constant fold for `fne`.
([#995](#995))
- [**breaking**] Serialisation fixes
([#997](#997))
- [**breaking**] OpDef serialisation
([#1013](#1013))
- NaryLogicOp constant folding
([#1026](#1026))

### Features

- 'Replace' rewrite returns node map
([#929](#929))
- `new` methods for leaf ops
([#940](#940))
- Add `string` type and `print` function to `prelude`
([#942](#942))
- `CustomOp::extension` utility function
([#951](#951))
- [**breaking**] Add `non_exhaustive` to various enums
([#952](#952))
- Encoder metadata in serialized hugr
([#955](#955))
- [**breaking**] Bring back Value
([#967](#967))
- Add LoadFunction node ([#947](#947))
- Add From impls for TypeArg
([#1002](#1002))
- Constant-folding of integer and logic operations
([#1009](#1009))
- [**breaking**] Update serialisation schema, implement `CustomConst`
serialisation ([#1005](#1005))
- Merge basic blocks algorithm
([#956](#956))
- [**breaking**] Allow panic operation to have any input and output
wires ([#1024](#1024))

### Refactor

- Outline hugr::serialize::test
([#976](#976))
- [**breaking**] Replace SmolStr identifiers with wrapper types.
([#959](#959))
- Separate extension validation from the rest
([#1011](#1011))
- Remove "trait TypeParametrised"
([#1019](#1019))

### Testing

- Add a test of instantiating an extension set
([#939](#939))
- Ignore serialisation tests when using miri
([#975](#975))
- [**breaking**] Test roundtrip serialisation against strict + lax
schema ([#982](#982))
- Fix some bad assert_matches
([#1006](#1006))
- Expand test of instantiating extension sets
([#1003](#1003))
- Fix unconnected ports in extension test
([#1010](#1010))
</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/MarcoIeni/release-plz/).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Douglas Wilson <[email protected]>
@doug-q doug-q mentioned this pull request May 20, 2024
github-merge-queue bot pushed a commit that referenced this pull request May 20, 2024
## 🤖 New release
* `hugr`: 0.3.1 -> 0.4.0 (⚠️ API breaking changes)

### ⚠️ `hugr` breaking changes

```
--- failure inherent_method_const_removed: pub method is no longer const ---

Description:
A publicly-visible method or associated fn is no longer `const` and can no longer be used in a `const` context.
        ref: https://doc.rust-lang.org/reference/const_eval.html
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/inherent_method_const_removed.ron

Failed in:
  ConstF64::new in /tmp/.tmpwo5blB/hugr/hugr/src/std_extensions/arithmetic/float_types.rs:43

--- failure struct_missing: pub struct removed or renamed ---

Description:
A publicly-visible struct cannot be imported by its prior path. A `pub use` may have been removed, or the struct itself may have been renamed or removed entirely.
        ref: https://doc.rust-lang.org/cargo/reference/semver.html#item-remove
       impl: https://github.com/obi1kenobi/cargo-semver-checks/tree/v0.31.0/src/lints/struct_missing.ron

Failed in:
  struct hugr::ops::constant::ExtensionValue, previously in file /tmp/.tmpq1W6bC/hugr/src/ops/constant.rs:184
```

<details><summary><i><b>Changelog</b></i></summary><p>

<blockquote>

## 0.4.0 (2024-05-20)

### Bug Fixes

- Disallow non-finite values for `ConstF64`
([#1075](#1075))
- Serialization round-trips
([#948](#948))
- [**breaking**] Combine `ConstIntU` and `ConstIntS`
([#974](#974))
- Disable serialisation tests when miri is active
([#977](#977))
- [**breaking**] Serialisation schema
([#968](#968))
- Correct constant fold for `fne`.
([#995](#995))
- [**breaking**] Serialisation fixes
([#997](#997))
- [**breaking**] OpDef serialisation
([#1013](#1013))
- NaryLogicOp constant folding
([#1026](#1026))

### Features

- Add verification to constant folding
([#1030](#1030))
- Add `Const::get_custom_value`
([#1037](#1037))
- Add serialization schema for metadata
([#1038](#1038))
- 'Replace' rewrite returns node map
([#929](#929))
- `new` methods for leaf ops
([#940](#940))
- Add `string` type and `print` function to `prelude`
([#942](#942))
- `CustomOp::extension` utility function
([#951](#951))
- [**breaking**] Add `non_exhaustive` to various enums
([#952](#952))
- Encoder metadata in serialized hugr
([#955](#955))
- [**breaking**] Bring back Value
([#967](#967))
- Add LoadFunction node ([#947](#947))
- Add From impls for TypeArg
([#1002](#1002))
- Constant-folding of integer and logic operations
([#1009](#1009))
- [**breaking**] Update serialisation schema, implement `CustomConst`
serialisation ([#1005](#1005))
- Merge basic blocks algorithm
([#956](#956))
- [**breaking**] Allow panic operation to have any input and output
wires ([#1024](#1024))

### Refactor

- [**breaking**] Rename `crate::ops::constant::ExtensionValue` =>
`OpaqueValue` ([#1036](#1036))
- Outline hugr::serialize::test
([#976](#976))
- [**breaking**] Replace SmolStr identifiers with wrapper types.
([#959](#959))
- Separate extension validation from the rest
([#1011](#1011))
- Remove "trait TypeParametrised"
([#1019](#1019))

### Testing

- Reorg OutlineCfg/nest_cfgs tests so hugr doesn't depend on algorithm
([#1007](#1007))
- Ignore tests which depend on typetag when cfg(miri)
([#1051](#1051))
- Really ignore tests which depend on typetag when cfg(miri)
([#1058](#1058))
- Proptests for round trip serialisation of `Type`s and `Op`s.
([#981](#981))
- Add a test of instantiating an extension set
([#939](#939))
- Ignore serialisation tests when using miri
([#975](#975))
- [**breaking**] Test roundtrip serialisation against strict + lax
schema ([#982](#982))
- Fix some bad assert_matches
([#1006](#1006))
- Expand test of instantiating extension sets
([#1003](#1003))
- Fix unconnected ports in extension test
([#1010](#1010))

</blockquote>


</p></details>

---
This PR was generated with
[release-plz](https://github.com/MarcoIeni/release-plz/).

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Douglas Wilson <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Merge basic blocks
4 participants