tree-optimization/118817 - fix ICE with VN CTOR simplification
Checks
| Context |
Check |
Description |
| linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap |
success
|
Build passed
|
| linaro-tcwg-bot/tcwg_gcc_build--master-arm |
success
|
Build passed
|
| linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 |
fail
|
Patch failed to apply
|
| linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap |
success
|
Build passed
|
Commit Message
The representation of CONSTRUCTOR nodes in VN NARY and gimple_match_op
do not agree so do not attempt to marshal between them.
Bootstrap and regtest running on x86_64-unknown-linux-gnu.
PR tree-optimization/118817
* tree-ssa-sccvn.cc (vn_nary_simplify): Do not process
CONSTRUCTOR NARY or update from CONSTRUCTOR simplified
gimple_match_op.
* gcc.dg/pr118817.c: New testcase.
---
gcc/testsuite/gcc.dg/pr118817.c | 14 ++++++++++++++
gcc/tree-ssa-sccvn.cc | 9 +++++++--
2 files changed, 21 insertions(+), 2 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/pr118817.c
new file mode 100644
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+typedef int v4si __attribute__((vector_size (sizeof(int) * 4)));
+
+v4si x;
+
+void foo (int flag)
+{
+ v4si tem = (v4si) { 0, 0, 0, 0 };
+ if (flag)
+ tem = (v4si) { flag };
+ x = __builtin_shufflevector (tem, tem, 0, 0, 0, 0);
+}
@@ -2604,13 +2604,18 @@ vn_nary_build_or_lookup (gimple_match_op *res_op)
tree
vn_nary_simplify (vn_nary_op_t nary)
{
- if (nary->length > gimple_match_op::MAX_NUM_OPS)
+ if (nary->length > gimple_match_op::MAX_NUM_OPS
+ /* For CONSTRUCTOR the vn_nary_op_t and gimple_match_op representation
+ does not match. */
+ || nary->opcode == CONSTRUCTOR)
return NULL_TREE;
gimple_match_op op (gimple_match_cond::UNCOND, nary->opcode,
nary->type, nary->length);
memcpy (op.ops, nary->op, sizeof (tree) * nary->length);
tree res = vn_nary_build_or_lookup_1 (&op, false, true);
- if (op.code.is_tree_code () && op.num_ops <= nary->length)
+ if (op.code.is_tree_code ()
+ && op.num_ops <= nary->length
+ && (tree_code) op.code != CONSTRUCTOR)
{
nary->opcode = (tree_code) op.code;
nary->length = op.num_ops;