]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
* ipa-inline-analysis.c (eliminated_by_inlining_prob): Handle
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Oct 2012 23:59:31 +0000 (23:59 +0000)
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Oct 2012 23:59:31 +0000 (23:59 +0000)
&this->field expressions.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192899 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/ipa-inline-analysis.c

index e3119c22a52da5d8cf59002ea0ecd4af92acb00e..8f4ca6c7da2399c332ebcbc44ed438deb31cf735 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-28  Jan Hubicka  <jh@suse.cz>
+
+       * ipa-inline-analysis.c (eliminated_by_inlining_prob): Handle
+       &this->field expressions.
+
 2012-10-28  Vladimir Makarov  <vmakarov@redhat.com>
 
        * rtl.h (struct rtx_def): Add a comment for member unchanging.
index 3b56e7ae0a0265095941269865d74eeeac8388cb..a8d16a8c8c6dcaf084df138b91d871d9759b717f 100644 (file)
@@ -1567,6 +1567,7 @@ eliminated_by_inlining_prob (gimple stmt)
        if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR
            || gimple_assign_rhs_code (stmt) == NOP_EXPR
            || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
+           || gimple_assign_rhs_code (stmt) == ADDR_EXPR
            || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
          {
            tree rhs = gimple_assign_rhs1 (stmt);
@@ -1584,6 +1585,20 @@ eliminated_by_inlining_prob (gimple stmt)
            /* Reads of parameter are expected to be free.  */
            if (unmodified_parm (stmt, inner_rhs))
              rhs_free = true;
+           /* Match expressions of form &this->field. Those will most likely
+              combine with something upstream after inlining.  */
+           else if (TREE_CODE (inner_rhs) == ADDR_EXPR)
+             {
+               tree op = get_base_address (TREE_OPERAND (inner_rhs, 0));
+               if (TREE_CODE (op) == PARM_DECL)
+                 rhs_free = true;
+               else if (TREE_CODE (op) == MEM_REF)
+                 {
+                   op = get_base_address (TREE_OPERAND (op, 0));
+                   if (unmodified_parm (stmt, op))
+                     rhs_free = true;
+                 }
+             }
 
            /* When parameter is not SSA register because its address is taken
               and it is just copied into one, the statement will be completely