On Wed, Jan 4, 2012 at 7:20 PM, Aldy Hernandez <aldy...@gmail.com> wrote:
> I fixed this PR, and then it got reopened because the testcase triggered a
> different problem on Alpha, Mips, and other architectures.  The problem is
> actually totally different than the previous fix for 51472, and has nothing
> to do with --param tm-max-aggregate-size.
>
> This problem here is that a load is transformed into a transactional memmove
> in such a way that the subsequent SSA uses are pointing to the wrong thing.
>  For example, originally we have:
>
>    global_var_ssa_999 = global_var;
>    *p = global_var_ssa_999;
>
> Through expand_assign_tm -> gimplify_addr -> force_gimple_operand_gsi, the
> above gets transformed into this:
>
>    D.1234 = global_var_ssa_999; <-- BOO HISS! Uninitialized.
>    __builtin__ITM_memmoveRtWt (&D.1234, &global_var, 16);
>    *p = global_var_ssa_999; <-- Wuuuut?
>
> We should either propagate D.1234 to the uses of global_var_ssa_999, or copy
> D.1234 into global_var_ssa_999 and happily proceed.
>  Option B is pretty straightforward, and with the attached patch we end up
> with:
>
> __builtin__ITM_memmoveRtWt (&D.1234, &global_var, 16);
>    global_var_ssa_999 = D.1234;
>
> The attached patch fixes the ICE on alpha-linux-gnu as tested with a
> cross-cc1 build.  Fully bootregtested on x86-64 Linux.
>
> OK?

You want is_gimple_reg () instead of is_gimple_non_addressable () as you
can't simply make something addressable at this point.
is_gimple_non_addressable
looks like a weird redundant predicate to me - it's only used once and its use
should be replaced (and the predicate removed).

Richard.

Reply via email to