| Submitter | Martin Jambor |
|---|---|
| Date | Sept. 17, 2010, 4:13 p.m. |
| Message ID | <20100917161321.GH4049@virgil.arch.suse.de> |
| Download | mbox | patch |
| Permalink | /patch/65086/ |
| State | New |
| Headers | show |
Comments
On Fri, 17 Sep 2010, Martin Jambor wrote: > Hi, > > there is no reason why OBJ_TYPE_REF calls cannot be folded in-place. > This patch allows that. > > Bootstrapped and tested on x86_64-linux, OK for trunk? Ok. Thanks, Richard. > Thanks, > > Martin > > > > 2010-09-16 Martin Jambor <mjambor@suse.cz> > > * gimple-fold.c (fold_gimple_call): New parameter inplace, do not fold > builtins if it is true. > (fold_stmt_1): Call, fold_gimple_call always, pass inplace as a > parameter. > > Index: icln/gcc/gimple-fold.c > =================================================================== > --- icln.orig/gcc/gimple-fold.c > +++ icln/gcc/gimple-fold.c > @@ -1482,7 +1482,7 @@ gimple_fold_obj_type_ref (tree ref, tree > It is assumed that the operands have been previously folded. */ > > static bool > -fold_gimple_call (gimple_stmt_iterator *gsi) > +fold_gimple_call (gimple_stmt_iterator *gsi, bool inplace) > { > gimple stmt = gsi_stmt (*gsi); > > @@ -1490,7 +1490,7 @@ fold_gimple_call (gimple_stmt_iterator * > > /* Check for builtins that CCP can handle using information not > available in the generic fold routines. */ > - if (callee && DECL_BUILT_IN (callee)) > + if (!inplace && callee && DECL_BUILT_IN (callee)) > { > tree result = gimple_fold_builtin (stmt); > > @@ -1507,7 +1507,6 @@ fold_gimple_call (gimple_stmt_iterator * > there requires that we create a new CALL_EXPR, and that requires > copying EH region info to the new node. Easier to just do it > here where we can just smash the call operand. */ > - /* ??? Is there a good reason not to do this in fold_stmt_inplace? */ > callee = gimple_call_fn (stmt); > if (TREE_CODE (callee) == OBJ_TYPE_REF > && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR) > @@ -1574,9 +1573,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, > changed = true; > } > } > - /* The entire statement may be replaced in this case. */ > - if (!inplace) > - changed |= fold_gimple_call (gsi); > + changed |= fold_gimple_call (gsi, inplace); > break; > > case GIMPLE_ASM: > >
Patch
Index: icln/gcc/gimple-fold.c =================================================================== --- icln.orig/gcc/gimple-fold.c +++ icln/gcc/gimple-fold.c @@ -1482,7 +1482,7 @@ gimple_fold_obj_type_ref (tree ref, tree It is assumed that the operands have been previously folded. */ static bool -fold_gimple_call (gimple_stmt_iterator *gsi) +fold_gimple_call (gimple_stmt_iterator *gsi, bool inplace) { gimple stmt = gsi_stmt (*gsi); @@ -1490,7 +1490,7 @@ fold_gimple_call (gimple_stmt_iterator * /* Check for builtins that CCP can handle using information not available in the generic fold routines. */ - if (callee && DECL_BUILT_IN (callee)) + if (!inplace && callee && DECL_BUILT_IN (callee)) { tree result = gimple_fold_builtin (stmt); @@ -1507,7 +1507,6 @@ fold_gimple_call (gimple_stmt_iterator * there requires that we create a new CALL_EXPR, and that requires copying EH region info to the new node. Easier to just do it here where we can just smash the call operand. */ - /* ??? Is there a good reason not to do this in fold_stmt_inplace? */ callee = gimple_call_fn (stmt); if (TREE_CODE (callee) == OBJ_TYPE_REF && TREE_CODE (OBJ_TYPE_REF_OBJECT (callee)) == ADDR_EXPR) @@ -1574,9 +1573,7 @@ fold_stmt_1 (gimple_stmt_iterator *gsi, changed = true; } } - /* The entire statement may be replaced in this case. */ - if (!inplace) - changed |= fold_gimple_call (gsi); + changed |= fold_gimple_call (gsi, inplace); break; case GIMPLE_ASM: