When adding an op to the worklist, also add its ancestors to the worklist. This allows for RewritePatterns to match an op a based on what is inside of the body of a.
This change fixes a problem that became apparent with vector.warp_execute_on_lane_0, but could probably be triggered with similar patterns. On a high level, the pattern extracts an op b with eligible = true from the body of an op a:
test.a { %0 = test.b() {eligible = true} yield %0 }
Afterwards:
%0 = test.b() {eligible = true} test.a { yield %0 }
The pattern is an OpRewritePattern<OpA>. For some reason, test.a is not on the GreedyPatternRewriter's worklist. E.g., because no pattern could be applied and it was removed. Now, another pattern updates test.b, so that eligible is changed from false to true. The OpRewritePattern<OpA> could now be applied, but (without this revision) test.a is still not on the worklist.
Note: In the above example, an OpRewritePattern<OpB> could have been used instead of an OpRewritePattern<OpA>. With such a design, we can run into the same problem (when the eligible attr is on test.a and test.b is removed from the worklist because no patterns could be applied).
Note: This change uncovered an unrelated bug in TestSCFUtils.cpp that was triggered due to a change in the order in which ops are processed. A TODO is added to the broken code and test cases are adapted so that the bug is no longer triggered.
Depends On: D141365
Can you remove this and make it an argument of the addToWorklist method? Seems to me this is only every local to the simplify method and adding "global" mutable state like does not seem ideal to me.
(also should be an ArrayRef I believe)