From: Andrew Pinski <apin...@marvell.com>

Since match_simplify_replacement uses gimple_simplify, there is a new
ssa name created sometimes and then we go and replace the phi edge with
this new ssa name, the range information on the phi is lost.
I don't have a testcase right now where we lose the range information
though but it does show up when enhancing match.pd to handle
some min/max patterns and g++.dg/warn/Wstringop-overflow-1.C starts
to fail.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

        * tree-ssa-phiopt.c (match_simplify_replacement): Duplicate range
        info if we're the only things setting the target PHI.
---
 gcc/tree-ssa-phiopt.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index 24cbce9955a..feb8ca8d0d1 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -894,6 +894,14 @@ match_simplify_replacement (basic_block cond_bb, 
basic_block middle_bb,
       gsi_move_before (&gsi1, &gsi);
       reset_flow_sensitive_info (gimple_assign_lhs (stmt_to_move));
     }
+  /* Duplicate range info if we're the only things setting the target PHI.  */
+  tree phi_result = PHI_RESULT (phi);
+  if (!gimple_seq_empty_p (seq)
+      && EDGE_COUNT (gimple_bb (phi)->preds) == 2
+      && !POINTER_TYPE_P (TREE_TYPE (phi_result))
+      && SSA_NAME_RANGE_INFO (phi_result))
+    duplicate_ssa_name_range_info (result, SSA_NAME_RANGE_TYPE (phi_result),
+                                  SSA_NAME_RANGE_INFO (phi_result));
   if (seq)
     gsi_insert_seq_before (&gsi, seq, GSI_SAME_STMT);
 
-- 
2.27.0

Reply via email to