tree-ssa-forwprop.c (pass_forwprop::execute): Propagate into PHIs and update the...
authorRichard Biener <rguenther@suse.de>
Sat, 13 Aug 2016 08:04:46 +0000 (08:04 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 13 Aug 2016 08:04:46 +0000 (08:04 +0000)
2016-08-13  Richard Biener  <rguenther@suse.de>

* tree-ssa-forwprop.c (pass_forwprop::execute): Propagate
into PHIs and update the lattice for its def.

From-SVN: r239444

gcc/ChangeLog
gcc/tree-ssa-forwprop.c

index db6138d9aa7614da7cea2962511137cf081231cb..a3ffe871b410c286aa6ef41d80191d1cdf19c70b 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-13  Richard Biener  <rguenther@suse.de>
+
+       * tree-ssa-forwprop.c (pass_forwprop::execute): Propagate
+       into PHIs and update the lattice for its def.
+
 2016-08-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/71512
index c40f9e20d22cb1ce5da5ba2008230b07fac63701..736b841bc90207ae5900b9dc80e9edad0f446ed4 100644 (file)
@@ -2107,6 +2107,35 @@ pass_forwprop::execute (function *fun)
       gimple_stmt_iterator gsi;
       basic_block bb = BASIC_BLOCK_FOR_FN (fun, postorder[i]);
 
+      /* Propagate into PHIs and record degenerate ones in the lattice.  */
+      for (gphi_iterator si = gsi_start_phis (bb); !gsi_end_p (si);
+          gsi_next (&si))
+       {
+         gphi *phi = si.phi ();
+         tree res = gimple_phi_result (phi);
+         if (virtual_operand_p (res))
+           continue;
+
+         use_operand_p use_p;
+         ssa_op_iter it;
+         tree first = NULL_TREE;
+         bool all_same = true;
+         FOR_EACH_PHI_ARG (use_p, phi, it, SSA_OP_USE)
+           {
+             tree use = USE_FROM_PTR (use_p);
+             tree tem = fwprop_ssa_val (use);
+             if (! first)
+               first = tem;
+             else if (! operand_equal_p (first, tem, 0))
+               all_same = false;
+             if (tem != use
+                 && may_propagate_copy (use, tem))
+               propagate_value (use_p, tem);
+           }
+         if (all_same)
+           fwprop_set_lattice_val (res, first);
+       }
+
       /* Apply forward propagation to all stmts in the basic-block.
         Note we update GSI within the loop as necessary.  */
       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); )