static void update_cloned_parm (tree parm, tree cloned_parm, bool first) { DECL_ABSTRACT_ORIGIN (cloned_parm) = parm; /* We may have taken its address. */ TREE_ADDRESSABLE (cloned_parm) = TREE_ADDRESSABLE (parm); /* The definition might have different constness. */ TREE_READONLY (cloned_parm) = TREE_READONLY (parm); TREE_USED (cloned_parm) = !first || TREE_USED (parm); /* The name may have changed from the declaration. */ DECL_NAME (cloned_parm) = DECL_NAME (parm); DECL_SOURCE_LOCATION (cloned_parm) = DECL_SOURCE_LOCATION (parm); TREE_TYPE (cloned_parm) = TREE_TYPE (parm); DECL_COMPLEX_GIMPLE_REG_P (cloned_parm) = DECL_COMPLEX_GIMPLE_REG_P (parm); }
bool is_gimple_reg (tree t) { var_ann_t ann; if (TREE_CODE (t) == SSA_NAME) t = SSA_NAME_VAR (t); if (!is_gimple_variable (t)) return false; if (!is_gimple_reg_type (TREE_TYPE (t))) return false; /* A volatile decl is not acceptable because we can't reuse it as needed. We need to copy it into a temp first. */ if (TREE_THIS_VOLATILE (t)) return false; /* We define "registers" as things that can be renamed as needed, which with our infrastructure does not apply to memory. */ if (needs_to_live_in_memory (t)) return false; /* Hard register variables are an interesting case. For those that are call-clobbered, we don't know where all the calls are, since we don't (want to) take into account which operations will turn into libcalls at the rtl level. For those that are call-saved, we don't currently model the fact that calls may in fact change global hard registers, nor do we examine ASM_CLOBBERS at the tree level, and so miss variable changes that might imply. All around, it seems safest to not do too much optimization with these at the tree level at all. We'll have to rely on the rtl optimizers to clean this up, as there we've got all the appropriate bits exposed. */ if (TREE_CODE (t) == VAR_DECL && DECL_HARD_REGISTER (t)) return false; /* Complex values must have been put into ssa form. That is, no assignments to the individual components. */ if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE) return DECL_COMPLEX_GIMPLE_REG_P (t); /* Some compiler temporaries are created to be used exclusively in virtual operands (currently memory tags and sub-variables). These variables should never be considered GIMPLE registers. */ if (DECL_ARTIFICIAL (t) && (ann = var_ann (t)) != NULL) return ann->mem_tag_kind == NOT_A_TAG; return true; }