Consider an IR::SwitchStatement that has two unique IR::SwitchCases (let's call them "case 1 and 2"), that each point to the same IR::BlockStatement*.
When traversing from preorder(const IR::SwitchStatement *statement) down to preorder(const IR::BlockStatement *statement), the callingContext is not updated, so when we are setting the IR::BlockStatement*'s definitions, the ProgramPoint for the IR::BlockStatement* pointed by both case 1 and case 2 will be equivalent.
This is just one example of the problem, but there are also at least several other (and possibly many other) places in ComputeWriteSet where this is a problem.
Solving this problem should allow us to disable the Cloner and RemoveHidden passes, as suggested by @mihaibudiu in #4797.
See https://github.com/p4lang/p4c/pull/4810 and related discussions for context.
Consider an
IR::SwitchStatement
that has two uniqueIR::SwitchCase
s (let's call them "case 1 and 2"), that each point to the sameIR::BlockStatement*
.When traversing from
preorder(const IR::SwitchStatement *statement)
down topreorder(const IR::BlockStatement *statement)
, thecallingContext
is not updated, so when we are setting theIR::BlockStatement*
's definitions, theProgramPoint
for theIR::BlockStatement*
pointed by both case 1 and case 2 will be equivalent.This is just one example of the problem, but there are also at least several other (and possibly many other) places in
ComputeWriteSet
where this is a problem.Solving this problem should allow us to disable the
Cloner
andRemoveHidden
passes, as suggested by @mihaibudiu in #4797.https://github.com/p4lang/p4c/pull/4810#issue-2409982045 mentions two possible solutions for the problem.
To better understand the problem:
Cloner
andRemoveHidden
passes, run unit tests, and analyze the failures