From 2b00c489070afb0d4891d5ba41d8847aa2cb3db1 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 11 Mar 2020 17:29:50 +0100 Subject: Disable generic ignoring of narrowing casts in favor of finer grained. --- gcc/gimple-ssa-evrp-analyze.c | 23 ----------------------- gcc/tree-vrp.c | 9 +++++++++ 2 files changed, 9 insertions(+), 23 deletions(-) (limited to 'gcc') diff --git a/gcc/gimple-ssa-evrp-analyze.c b/gcc/gimple-ssa-evrp-analyze.c index 0f14713..cbcee21 100644 --- a/gcc/gimple-ssa-evrp-analyze.c +++ b/gcc/gimple-ssa-evrp-analyze.c @@ -197,29 +197,6 @@ vr_gori_comparison::compare (tree name, edge e, vr_values *vr) dump_improvements (dump_file); return; } - // Ignore known discrepancies. - widest_irange tmp; - gimple *stmt = gimple_outgoing_edge_range_p (tmp, m_edge); - if (stmt && is_a (stmt)) - { - gcond *gc = as_a (stmt); - tree lhs = gimple_cond_lhs (gc); - if (TREE_CODE (lhs) == SSA_NAME) - { - // Ignore problematic casts for which evrp lies and ignores - // the upper bits. - // - // SMALLER = (cast) NAME - // if (SMALLER == 0) - gimple *def = SSA_NAME_DEF_STMT (lhs); - if (def - && gimple_assign_cast_p (def) - && gimple_assign_rhs1 (def) == name - && (TYPE_PRECISION (TREE_TYPE (name)) - > TYPE_PRECISION (TREE_TYPE (lhs)))) - return; - } - } dump_differences_and_trap (); } diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index a9d85ed..ead8552 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -2188,6 +2188,7 @@ register_edge_assert_for_2 (tree name, edge e, names[0] = NULL_TREE; names[1] = NULL_TREE; cst2 = NULL_TREE; + bool problematic_cast = false; if (rhs_code == BIT_AND_EXPR || (CONVERT_EXPR_CODE_P (rhs_code) && INTEGRAL_TYPE_P (TREE_TYPE (val)) @@ -2195,6 +2196,13 @@ register_edge_assert_for_2 (tree name, edge e, && TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt))) > prec)) { + // This catches problematic truncating casts. + // + // Trigger is c-c++-common/torture/builtin-arith-overflow-p-19.c + // and gimple.c. + if (CONVERT_EXPR_CODE_P (rhs_code)) + problematic_cast = true; + name2 = gimple_assign_rhs1 (def_stmt); if (rhs_code == BIT_AND_EXPR) cst2 = gimple_assign_rhs2 (def_stmt); @@ -2381,6 +2389,7 @@ register_edge_assert_for_2 (tree name, edge e, if (valid_p && (maxv - minv) != -1) { + gori_computable set_gori_computable (!problematic_cast); tree tmp, new_val, type; int i; -- cgit v1.1