On Tue, 2012-03-06 at 21:18 +0100, Richard Guenther wrote: > On Tue, Mar 6, 2012 at 6:55 PM, Aldy Hernandez <al...@redhat.com> wrote: > > On 02/29/12 03:22, Richard Guenther wrote: > > > >> So fixing up individual passes is easier - I can only think of PRE being > >> problematic right now, I am not aware that any other pass moves loads > >> or stores. So I'd simply pre-compute the stmt bit in PRE and adjust > >> the > >> > >> if (gimple_has_volatile_ops (stmt) > >> || stmt_could_throw_p (stmt)) > >> continue; > >> > >> in compute_avail accordingly. > > > > > > Initially I thought PRE would be problematic for transactions, but perhaps > > it isn't. As I understand, for PRE we hoist loads/computations that are > > mostly redundant, but will be performed on every path: > > > > if (flag) > > a = b + c; > > else > > stuff; > > d = b + c; <-- [b + c] always computed > > > > Even if we hoist [b + c] before the flag, [b + c] will be computed on every > > path out of "if (flag)...". So... we can allow this transformation within > > transactions, right?
In this particular example, I agree. We can move [b + c] into the else branch, and then move it to before flag because it will happen on all paths to the exit anyway. > Note that partial PRE (enabled at -O3) can insert expressions into paths > that did _not_ execute the expression. For regular PRE you are right. I suppose if only loads will be moved around by PRE, then this could be fine, as long as those expressions do not have visible side effects or can crash if reading garbage. For examples, dereferencing pointers could lead to accessing unmapped memory and thus segfaults, speculative stores are not allowed (even if you undo them later on), etc. Also, if PRE inserts expressions into paths that did not execute the transactions, can it happen that then something like loop invariant motion comes around and optimizes based on that and moves the code to before "if (flag)..."? If so, PRE would break publication safety indirectly by pretending that the expression happened on every path to the exit, tricking subsequent passes to believe things that were not in place in the source code. Is this a realistic scenario?