On Fri, 19 Jul 2013, Jeff Law wrote:

It's also worth noting that fold-const.c also does some type hoisting/sinking.

fold-const.c does everything ;-)

Ideally that code should just be going away.

Like most of the code from fold-const.c that isn't about folding constants, I guess, once it has a replacement at the gimple level.

If I understand, the main reason is because you want to go through the
statements in reverse order, since this is the way the casts are being
propagated (would forwprop also work, just more slowly, or would it miss
opportunities across basic blocks?).
It would miss some opportunities,

Could you explain in what case? I guess my trouble understanding this is
the same as in the next question, and I am missing a fundamental point...
Anytime you hoist/sink a cast, you're moving it across an operation -- which can expose it as a redundant cast.

Let's say you start with

A = (T) x1;
B = (T) x2;
R = A & B;


And sink the cast after the operation like this:

C = x1 & x2;
R = (T) C;

We may find that that cast of C to type T is redundant. Similar cases can be found when we hoist the cast across the operation. I saw this kind of situation occur regularly when I was looking at Kai's hoisting/sinking patches.

IIRC the question here was how forwprop could miss opportunities that a backward (reverse dominance) walk finds, and I don't see that in this example. If the cast is redundant, forwprop is just as likely to detect it.

Now I believe one of Kai's goals is to allow our various pattern based folders to work better by not having to account for casting operations as often in sequences of statements we want to fold.

Ah. I thought it was mostly so operations would be performed in a smaller, hopefully cheaper mode. Simplifying combiner patterns would be nice if that worked.

That's a real good question; I find myself looking a lot at the bits
in forwprop and I'm getting worried it's on its way to being an
unmaintainable mess.  Sadly, I'm making things worse rather than
better with my recent changes.  I'm still hoping more structure will
become evident as I continue to work through various improvements.

It looks to me like a gimple version of fold, except that since it is
gimple, basic operations are an order of magnitude more complicated. But
I don't really see why that would make it an unmaintainable mess, giant
switches are not that bad.
It's certainly moving towards a gimple version of fold and special casing everything as we convert from fold and to gimple_fold (or whatever we call it) is going to result in a horrid mess.

I find myself thinking that at a high level we need to split out the forward and backward propagation bits into distinct passes.

They are already mostly split (2 separate loops in ssa_forward_propagate_and_combine), so that wouldn't be hard.

The backward propagation bits are just a tree combiner and the idioms used to follow the backward chains to create more complex trees and fold them need to be reusable components. It's totally silly (and ultimately unmaintainable) that each transformation is open-coding the walking of the use-def chain and simplification step.

It isn't completely open-coded. get_prop_source_stmt, can_propagate_from, defcodefor_name, etc make walking the use-def chain not so bad.

Usually at this point Richard refers to Andrew's work on a gimple combiner...

--
Marc Glisse

Reply via email to