On 05/11/2017 01:50 AM, Richard Biener wrote:


It actually seems to handle negation as well.  Which means it
handles disjunctive normal form.
Negation is "handled" by allowing an individual predicate to be negated. However, the predicate must still be is_neq_zero_form_p to really participate in expansion, normalization & simplification (and negated predicates do not fit that form). Furthermore, you can only negate an individual predicate, not a chain of predicates. Thus you can express !A, but you can not express !(A & B) AFAICT.

Thus I was left with just looking for simplifications where I could eliminate a common term and the result would fit in the forms supported by tree-ssa-uninit.c


The patch should "simply" transform the input into disjunctive normal form.
(X | Y) & (X | Z) happens to be conjunctive normal form (but I'm sure that
generally the input may be not in any of the two normal forms).
THe disjunctive normal form can't actually be expressed with the infrastructure in tree-ssa-uninit.c. Adding it seems like a huge amount of work with marginal benefit. Maybe I'm missing something.


Adding a single special-case doesn't look so useful to me.
It's certainly not something that brings us a huge benefit -- adding disjunctive normal form would would be a much larger change conceptually as well as significantly complicate the existing code and it's not clear it would actually be a larger benefit than just supporting the elimination of a common term.

Filtering of uninit warnings isn't all that interesting of a problem IMHO. When this code does something useful it really means that either an earlier pass (usually jump threading) missed an optimization or that the optimization was too expensive relative to the gain. The regression of uninit-pred-8 falls into both categories -- we can't detect the jump thread and even if we did, the cost (in terms of blocks copied) would be huge relative to the elimination of a single runtime branch.



Ugh, looking at the code it seems to be full of special cases (read:
it's quite ad-hoc) rather than building up a tree of |& conditions
and then normalizing it.
Right. It doesn't build a tree of operations, but it does build a chain of normalized predicates in conjunctive normal form. In theory, any transformation that works on conjunctive normal form should be supportable in this code.


Even if not pretty (vec<vec<pred_info> > ...) the data structure in uninit looks
sensible just it seems that while function sames suggest it should work the
way I'd like it to it doesn't (for some reason).  Can't we fix that
instead please?
That's probably a larger project than I can justify tackling at this time.

FWIW, I have asked folks in the past to look into pulling out the predicate building and analysis bits for re-use by other passes -- that code is probably the most interesting long term. That would seem to be the natural time to rethink some of the implementation decisions, particularly since improvements we made to the predicate analysis would likely help multiple passes rather than just filtering uninit warnings.

Jeff

Reply via email to