aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2020-04-22 11:05:59 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2020-04-22 11:05:59 +0100
commit413232a55b960c9b207abf14eea4a8dd247c3e90 (patch)
treee1a363d936f81df4d2655ffc24f93287f3aa39c5 /gcc/tree-ssa-forwprop.c
parent56b15072aa41633235be57851ab342114e0bacba (diff)
downloadgcc-413232a55b960c9b207abf14eea4a8dd247c3e90.zip
gcc-413232a55b960c9b207abf14eea4a8dd247c3e90.tar.gz
gcc-413232a55b960c9b207abf14eea4a8dd247c3e90.tar.bz2
forwprop: Fix ICE when building an identity constructor [PR94700]
This is really PR94683 part 2, handling the case in which the vector is an identity and so doesn't need a VEC_PERM_EXPR. I should have realised at the time that the other arm of the "if" would need the same fix. 2020-04-22 Richard Sandiford <richard.sandiford@arm.com> gcc/ PR tree-optimization/94700 * tree-ssa-forwprop.c (simplify_vector_constructor): When processing an identity constructor, use a VIEW_CONVERT_EXPR to handle mixtures of similarly-structured but distinct vector types. gcc/testsuite/ PR tree-optimization/94700 * gcc.target/aarch64/sve/acle/general/pr94700.c: New test.
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 1a50045..8ee5450 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -2475,7 +2475,18 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
orig[0] = gimple_assign_lhs (lowpart);
}
if (conv_code == ERROR_MARK)
- gimple_assign_set_rhs_from_tree (gsi, orig[0]);
+ {
+ tree src_type = TREE_TYPE (orig[0]);
+ if (!useless_type_conversion_p (type, src_type))
+ {
+ gcc_assert (!targetm.compatible_vector_types_p (type, src_type));
+ tree rhs = build1 (VIEW_CONVERT_EXPR, type, orig[0]);
+ orig[0] = make_ssa_name (type);
+ gassign *assign = gimple_build_assign (orig[0], rhs);
+ gsi_insert_before (gsi, assign, GSI_SAME_STMT);
+ }
+ gimple_assign_set_rhs_from_tree (gsi, orig[0]);
+ }
else
gimple_assign_set_rhs_with_ops (gsi, conv_code, orig[0],
NULL_TREE, NULL_TREE);