diff options
Diffstat (limited to 'gcc/explow.c')
-rw-r--r-- | gcc/explow.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/explow.c b/gcc/explow.c index bd342c106f1..6941f4e8ebc 100644 --- a/gcc/explow.c +++ b/gcc/explow.c @@ -842,6 +842,35 @@ promote_decl_mode (const_tree decl, int *punsignedp) return pmode; } +/* Return the promoted mode for name. If it is a named SSA_NAME, it + is the same as promote_decl_mode. Otherwise, it is the promoted + mode of a temp decl of same type as the SSA_NAME, if we had created + one. */ + +machine_mode +promote_ssa_mode (const_tree name, int *punsignedp) +{ + gcc_assert (TREE_CODE (name) == SSA_NAME); + + /* Partitions holding parms and results must be promoted as expected + by function.c. */ + if (SSA_NAME_VAR (name) + && (TREE_CODE (SSA_NAME_VAR (name)) == PARM_DECL + || TREE_CODE (SSA_NAME_VAR (name)) == RESULT_DECL)) + return promote_decl_mode (SSA_NAME_VAR (name), punsignedp); + + tree type = TREE_TYPE (name); + int unsignedp = TYPE_UNSIGNED (type); + machine_mode mode = TYPE_MODE (type); + + machine_mode pmode = promote_mode (type, mode, &unsignedp); + if (punsignedp) + *punsignedp = unsignedp; + + return pmode; +} + + /* Controls the behaviour of {anti_,}adjust_stack. */ static bool suppress_reg_args_size; |