diff options
author | Richard Biener <rguenther@suse.de> | 2022-03-25 08:43:45 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-05-04 13:58:04 +0200 |
commit | 3ae5cbff1ad958ddefc12010bf7e32a47741d331 (patch) | |
tree | 9e0878f6c65bdc8addc0fdb87a0cacbb3196e5c5 | |
parent | 8afcd148103b0467126483151b6fb5ac68920e72 (diff) | |
download | gcc-3ae5cbff1ad958ddefc12010bf7e32a47741d331.zip gcc-3ae5cbff1ad958ddefc12010bf7e32a47741d331.tar.gz gcc-3ae5cbff1ad958ddefc12010bf7e32a47741d331.tar.bz2 |
Fold more vector constants early
In PR105049 we had
return VIEW_CONVERT_EXPR<U>( VEC_PERM_EXPR < {<<< Unknown tree: compound_literal_expr
V D.1984 = { 0 }; >>>, { 0 }} , {<<< Unknown tree: compound_literal_expr
V D.1985 = { 0 }; >>>, { 0 }} , { 0, 0 } > & {(short int) SAVE_EXPR <c>, (short int) SAVE_EXPR <c>});
where we gimplify the init CTORs to
_1 = {{ 0 }, { 0 }};
_2 = {{ 0 }, { 0 }};
instead of to vector constants. The following makes sure to simplify the
CTORs to VECTOR_CSTs during gimplification by re-ordering the simplification
to after CTOR flag recomputation and gimplification of the elements.
2022-03-25 Richard Biener <rguenther@suse.de>
* gimplify.cc (gimplify_init_constructor): First gimplify,
then simplify the result to a VECTOR_CST.
-rw-r--r-- | gcc/gimplify.cc | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc index 2588824..f052d9f 100644 --- a/gcc/gimplify.cc +++ b/gcc/gimplify.cc @@ -5432,6 +5432,22 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, if (notify_temp_creation) return GS_OK; + /* Vector types use CONSTRUCTOR all the way through gimple + compilation as a general initializer. */ + FOR_EACH_VEC_SAFE_ELT (elts, ix, ce) + { + enum gimplify_status tret; + tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val, + fb_rvalue); + if (tret == GS_ERROR) + ret = GS_ERROR; + else if (TREE_STATIC (ctor) + && !initializer_constant_valid_p (ce->value, + TREE_TYPE (ce->value))) + TREE_STATIC (ctor) = 0; + } + recompute_constructor_flags (ctor); + /* Go ahead and simplify constant constructors to VECTOR_CST. */ if (TREE_CONSTANT (ctor)) { @@ -5454,25 +5470,8 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, TREE_OPERAND (*expr_p, 1) = build_vector_from_ctor (type, elts); break; } - - TREE_CONSTANT (ctor) = 0; } - /* Vector types use CONSTRUCTOR all the way through gimple - compilation as a general initializer. */ - FOR_EACH_VEC_SAFE_ELT (elts, ix, ce) - { - enum gimplify_status tret; - tret = gimplify_expr (&ce->value, pre_p, post_p, is_gimple_val, - fb_rvalue); - if (tret == GS_ERROR) - ret = GS_ERROR; - else if (TREE_STATIC (ctor) - && !initializer_constant_valid_p (ce->value, - TREE_TYPE (ce->value))) - TREE_STATIC (ctor) = 0; - } - recompute_constructor_flags (ctor); if (!is_gimple_reg (TREE_OPERAND (*expr_p, 0))) TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (ctor, pre_p); } |