diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-10-08 11:15:23 +0200 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-10-08 11:17:08 +0200 |
commit | 214d514fafcd78cd54e4a4aa9ae08c89abf9cc57 (patch) | |
tree | d207b0af3077b6c43d93a6da69924d29f8bda249 | |
parent | 273b30c8e93f043f65a04e0ff2ec305b311e98fa (diff) | |
download | gcc-214d514fafcd78cd54e4a4aa9ae08c89abf9cc57.zip gcc-214d514fafcd78cd54e4a4aa9ae08c89abf9cc57.tar.gz gcc-214d514fafcd78cd54e4a4aa9ae08c89abf9cc57.tar.bz2 |
Fix PR97315 (part 1 of 2)
gcc/ChangeLog:
PR tree-optimization/97315
* gimple-ssa-evrp.c (hybrid_folder::choose_value): Removes the
trap and instead annotates the listing.
gcc/testsuite/ChangeLog:
* gcc.dg/pr97315-1.c: New test.
-rw-r--r-- | gcc/gimple-ssa-evrp.c | 48 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr97315-1.c | 27 |
2 files changed, 54 insertions, 21 deletions
diff --git a/gcc/gimple-ssa-evrp.c b/gcc/gimple-ssa-evrp.c index 363e2ab..7688e4a 100644 --- a/gcc/gimple-ssa-evrp.c +++ b/gcc/gimple-ssa-evrp.c @@ -258,37 +258,43 @@ hybrid_folder::value_of_stmt (gimple *stmt, tree op) tree hybrid_folder::choose_value (tree evrp_val, tree ranger_val) { - if (!ranger_val) - { - // If neither returned a value, return NULL_TREE. - if (!evrp_val) - return NULL_TREE; + // If both found the same value, just return it. + if (evrp_val && ranger_val && !compare_values (evrp_val, ranger_val)) + return evrp_val; + + // If neither returned a value, return NULL_TREE. + if (!ranger_val && !evrp_val) + return NULL_TREE; - // Otherwise EVRP found something. - if (dump_file) + // Otherwise there is a discrepancy to flag. + if (dump_file) + { + if (evrp_val && ranger_val) + fprintf (dump_file, "EVRP:hybrid: Disagreement\n"); + if (evrp_val) { fprintf (dump_file, "EVRP:hybrid: EVRP found singleton "); print_generic_expr (dump_file, evrp_val); fprintf (dump_file, "\n"); } - return evrp_val; + if (ranger_val) + { + fprintf (dump_file, "EVRP:hybrid: RVRP found singleton "); + print_generic_expr (dump_file, ranger_val); + fprintf (dump_file, "\n"); + } } - // Otherwise ranger found a value, if they match we're good. - if (evrp_val && !compare_values (evrp_val, ranger_val)) + // If one value was found, return it. + if (!evrp_val) + return ranger_val; + if (!ranger_val) return evrp_val; - // We should never get different singletons. - gcc_checking_assert (!evrp_val); - - // Now ranger has found a value, but EVRP did not. - if (dump_file) - { - fprintf (dump_file, "EVRP:hybrid: RVRP found singleton "); - print_generic_expr (dump_file, ranger_val); - fprintf (dump_file, "\n"); - } - return ranger_val; + // If values are different, return the first calculated value. + if ((param_evrp_mode & EVRP_MODE_RVRP_FIRST) == EVRP_MODE_RVRP_FIRST) + return ranger_val; + return evrp_val; } /* Main entry point for the early vrp pass which is a simplified non-iterative diff --git a/gcc/testsuite/gcc.dg/pr97315-1.c b/gcc/testsuite/gcc.dg/pr97315-1.c new file mode 100644 index 0000000..250e0e9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97315-1.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O3" } */ + +typedef struct tree_node *tree; +enum tree_code { RECORD_TYPE, QUAL_UNION_TYPE }; +enum tree_code_class {}; +struct tree_base { + tree_code code : 16; +}; +struct tree_node { + tree_base base; +}; +extern tree_code_class tree_code_type[]; +void tree_check_failed() __attribute__((__noreturn__)); +tree tree_check3(tree __t, tree_code __c1, tree_code __c3) { + if (__t->base.code != __c1 && __t->base.code != __c3) + tree_check_failed(); + return __t; +} +tree add_type_duplicate_type; +void add_type_duplicate() { + if (tree_code_type[add_type_duplicate_type->base.code]) + if (add_type_duplicate_type->base.code == RECORD_TYPE) + for (; + tree_check3(add_type_duplicate_type, RECORD_TYPE, QUAL_UNION_TYPE);) + tree_check3(add_type_duplicate_type, RECORD_TYPE, QUAL_UNION_TYPE); +} |