(I'm copying this thread back to the main GCC list, to document the problem that we ran into, RG's suggestion and the fix that we made.)
While merging our GCC/UPC implementation with the GCC trunk, we ran into a situation where some tests failed on the check shown below in verify_gimple_assign_single(). This failed because our representation of a UPC pointer-to-shared has an internal struct representation but in other respects is a pointer type (and appears to be register type). For some temps that UPC creates, they have to be marked as addressable, which causes them to no longer qualify as is_gimple_reg(), but the type still asserts is_gimple_reg_type(). The trees that were being created failed on this test: if (!is_gimple_reg (lhs) && is_gimple_reg_type (TREE_TYPE (lhs))) { error ("invalid rhs for gimple memory store"); debug_generic_stmt (lhs); debug_generic_stmt (rhs1); return true; } At first, I wondered if the checks above might be overly inclusive? On 01/11/10 11:03:46, Richard Guenther wrote: > You need a temporary for register type but non-register copy. Thus > it needs to be > > tmp_2 = A; > B = tmp_2; > > with tmp_2 being an SSA name, not > > B = A; Looking at some of the code in gimplify.c, we determined that calling prepare_gimple_addressable() is all that is needed: if (!is_gimple_addressable (src) || is_gimple_non_addressable (src)) { /* We can't address the object - we have to copy to a local (non-shared) temporary. */ - src = get_initialized_tmp_var (src, pre_p, NULL); + prepare_gimple_addressable (&src, pre_p); mark_addressable (src); is_shared_copy = 0; is_src_shared = 0; } } To make this work, prepare_gimple_addressable() needed to be changed so that it is exported from gimplify.c: -static void +void prepare_gimple_addressable (tree *expr_p, gimple_seq *seq_p) { while (handled_component_p (*expr_p)) expr_p = &TREE_OPERAND (*expr_p, 0); if (is_gimple_reg (*expr_p)) *expr_p = get_initialized_tmp_var (*expr_p, seq_p, NULL); } With this fix in place, we were able pass the various checks in tree-cfg.c, and to generate the expected code.