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

Fix issue where reify would do the same lookup twice #3392

Merged
merged 1 commit into from
Jun 29, 2023

Conversation

jackkoenig
Copy link
Contributor

This is not a functional bug. The recursive form of reify for Element would use the .topBinding from the wrong argument, so it would recurse an extra time, but it would ultimately converge to the right value.

This is really subtle and I don't think it's even possible to write a test for it (other than by adding a side effect to reify but that would be insane).

It is a very slight, probably unmeasurable, performance improvement.

The way I convinced myself that the problem happened and was fixed was with the following example code:

import chisel3._
import chisel3.experimental.dataview._
import circt.stage.ChiselStage

class Foo(val foo: UInt) extends Bundle
class Bar(val bar: UInt) extends Bundle

object Views {
  implicit val foo2bar = DataView[Foo, Bar](f => new Bar(f.foo.cloneType), _.foo -> _.bar)
}
import Views._

class MyModule extends Module {
  val a = IO(Input(new Foo(UInt(8.W))))
  val z = IO(Output(new Bar(UInt(8.W))))
  z := a.viewAs[Bar]
}

object Main extends App {
  val chirrtl = ChiselStage.emitCHIRRTL(new MyModule)
  println(chirrtl)
}

then add println(s"reify on $elt") as the first statement in the fixed function you'll see:

[info] reify on MyModule.z.bar: IO[UInt<8>]
[info] reify on _$$View$$_.z_view.bar: [UInt<8>]
[info] reify on MyModule.a.foo: IO[UInt<8>]
[info] reify on MyModule.a.foo: IO[UInt<8>]

You can see a little double reify there, with this fix you get:

[info] reify on MyModule.z.bar: IO[UInt<8>]
[info] reify on _$$View$$_.z_view.bar: [UInt<8>]
[info] reify on MyModule.a.foo: IO[UInt<8>]

Contributor Checklist

  • Did you add Scaladoc to every public function/method?
  • Did you add at least one test demonstrating the PR?
  • Did you delete any extraneous printlns/debugging code?
  • Did you specify the type of improvement?
  • Did you add appropriate documentation in docs/src?
  • Did you request a desired merge strategy?
  • Did you add text to be included in the Release Notes for this change?

Type of Improvement

  • Performance improvement

Desired Merge Strategy

  • Squash

Release Notes

Reviewer Checklist (only modified by reviewer)

  • Did you add the appropriate labels? (Select the most appropriate one based on the "Type of Improvement")
  • Did you mark the proper milestone (Bug fix: 3.5.x or 3.6.x depending on impact, API modification or big change: 5.0.0)?
  • Did you review?
  • Did you check whether all relevant Contributor checkboxes have been checked?
  • Did you do one of the following when ready to merge:
    • Squash: You/ the contributor Enable auto-merge (squash), clean up the commit message, and label with Please Merge.
    • Merge: Ensure that contributor has cleaned up their commit history, then merge with Create a merge commit.

This is not a functional bug. The recursive form of reify for Element
would use the .topBinding from the wrong argument, so it would recurse
an extra time, but it would ultimately converge to the right value.
@jackkoenig jackkoenig added the Performance Improves performance, will be included in release notes label Jun 28, 2023
@jackkoenig jackkoenig added this to the 3.6.x milestone Jun 28, 2023
Copy link
Member

@seldridge seldridge left a comment

Choose a reason for hiding this comment

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

I don't 💯 follow this, but the difference in the test case LGTM. Nice find.

@jackkoenig jackkoenig merged commit 374b45b into main Jun 29, 2023
@jackkoenig jackkoenig deleted the fix-reify-perf-bug branch June 29, 2023 21:02
@mergify mergify bot added the Backported This PR has been backported label Jun 29, 2023
mergify bot pushed a commit that referenced this pull request Jun 29, 2023
This is not a functional bug. The recursive form of reify for Element
would use the .topBinding from the wrong argument, so it would recurse
an extra time, but it would ultimately converge to the right value.

(cherry picked from commit 374b45b)
mergify bot pushed a commit that referenced this pull request Jun 29, 2023
This is not a functional bug. The recursive form of reify for Element
would use the .topBinding from the wrong argument, so it would recurse
an extra time, but it would ultimately converge to the right value.

(cherry picked from commit 374b45b)
mergify bot added a commit that referenced this pull request Jun 29, 2023
This is not a functional bug. The recursive form of reify for Element
would use the .topBinding from the wrong argument, so it would recurse
an extra time, but it would ultimately converge to the right value.

(cherry picked from commit 374b45b)

Co-authored-by: Jack Koenig <koenig@sifive.com>
mergify bot added a commit that referenced this pull request Jun 29, 2023
This is not a functional bug. The recursive form of reify for Element
would use the .topBinding from the wrong argument, so it would recurse
an extra time, but it would ultimately converge to the right value.

(cherry picked from commit 374b45b)

Co-authored-by: Jack Koenig <koenig@sifive.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Backported This PR has been backported Performance Improves performance, will be included in release notes
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants