On 7/9/2026 12:21 PM, Andrea Pinski wrote:
On Thu, Jul 9, 2026 at 8:23 AM Jeffrey Law <[email protected]> wrote:


On 7/8/2026 2:19 AM, Andrew Pinski wrote:
Since match and simplify can add unused statements to the sequence
in some cases, we should remove them before call phiopt_early_allow.
This is needed for 2 future patches. One is to allowing of comparisons,
optionally with a cast and optional with a negative expression.
The other is about supporting a way to handling
cond_removal_in_builtin_zero_pattern in match and also adding a new match
pattern to fix PR 126035 (ctz split back into one).

Bootstrapped and tested on x86_64-linux-gnu.

gcc/ChangeLog:

       * tree-ssa-phiopt.cc (remove_unused_stmts): New function.
       (gimple_simplify_phiopt): Call remove_unused_stmts before
       phiopt_early_allow.
I'm torn.  Not particularly happy with what appears to be a mini DCE
pass on the sequence.  Presumably the motivation is to clean things up
in a way that makes phiopt_early_allow more likely to return true by
removing statements that are going to be zapped by DCE later and thus
shouldn't participate in phiopt_early_allow?
Yes. While working on a different patch I noticed this. Let me find
the testcase again.

The testcase is:
```
bool f1(bool a, bool b)
{
     bool c = !a;
     bool d = c & b;
     if (d) return 0;
     bool e = c | b;
     return e;
}
```

This will also be rejected by the current version of
phiopt_early_allow. But we (Kyrylo and I) are looking to change that.
With the above patch what we get back is:
```
phiopt match-simplify back:
_12 = ~b_11(D);
_7 = a_9(D) | _12;
_6 = a_9(D) ^ b_11(D);
_5 = a_9(D) == b_11(D);
result: _5
rejected because early
```
But  this change we get:
```
phiopt match-simplify back:
_5 = a_9(D) == b_11(D);
result: _5
rejected because early
```
which should then be accepted with the other change we are working on.

This was just one testcase I noticed the issue but I have seen in others.
The other reason  to remove the dead statements from the sequence is
dealing with my next patch (which is not related to early). Which
extends phiopt match connection to handle (semi) arbitrary middle bbs
which allows the removal of cond_removal_in_builtin_zero_pattern and
allow for some of the patches that Daniel has been working on and also
allow for matching things like the 2 halved version of ctz into one
ctz with just a match pattern rather than some manual matching code.
Basically removing the dead statements makes sure we are no longer
referencing the middle-bb in some/many cases.
Understood.  And presumably the dead statements are unavoidable when we're going through the simplification steps.  I can see why it's appealing even though I don't like what we have to do to get there. We may be in a limited-enough environment where a trivial mini-DCE implementation works sensibly -- things like volatiles, calls, loops and such shouldn't be a concern here.

Presumably the ggc_free is meant to recycle the relevant nodes more quickly since this is expected to happen reasonably often?

The LLM review was concerned about the unchecked call to gimple_get_lhs.  But in this context I think every statement we generate is going to have an LHS.  SO that's probably a non-issue. Do we have any scenario where the LHS isn't going to be an SSA_NAME?  I think we largely filter out memory references to avoid vop updates and such.

I'm inclined to conditionally ACK on the assumption the LLM issues with gimple_get_lhs and the assumption it always returns an SSA_NAME are non-issues in this context, but I'd consider this somewhat controversial, so let's give folks until COB Monday to object to the basic idea.

jeff

Reply via email to