This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Duplicate constraints in ipa-pta


On 28/10/15 12:10, Richard Biener wrote:
On Wed, 28 Oct 2015, Tom de Vries wrote:

Richard,

when compiling this testcase:
...
static int __attribute__((noinline, noclone))
foo (int *a, int *b)
{
   *b = 1;
   *a = 2;
   return *b;
}

int __attribute__((noinline, noclone))
bar (int *a, int *b)
{
   return foo (a, b);
}
...

with -O2 -fipa-pta we find in the pta dumpfile:
...
Generating constraints for bar (bar)

bar.arg0 = &NONLOCAL
bar.arg1 = &NONLOCAL
bar.arg1 = &NONLOCAL
...

The reason for the duplicate last two constraints is that with fipa-pta, in
create_function_info_for we link the function arguments in a next chain.

And in intra_create_variable_infos there are two iteration mechanism used:
- the loop over the function arguments
- the loop over the vi_next (p) for each function argument p

So when processing argument a, we generate constraints for both a and it's
next b.
And when processing argument b, we generate constraints for b again.

Is this a known issue? Should we fix this?

Didn't see that yet.  Yes, we should fix it.

Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c  (revision 229481)
+++ gcc/tree-ssa-structalias.c  (working copy)
@@ -5913,6 +6009,8 @@ intra_create_variable_infos (struct func
                 make_constraint_from_global_restrict (p, "PARM_RESTRICT");
               else if (p->may_have_pointers)
                 make_constraint_from (p, nonlocal_id);
+             if (p->is_full_var)
+               break;
             }
         }
      }

does for me.  Pre-approved if it passes testing.

Tested and committed. Posting with ChangeLog entry.

Thanks,
- Tom
Generate constraints only once in intra_create_variable_infos

2015-10-28  Tom de Vries  <tom@codesourcery.com>

	* tree-ssa-structalias.c (intra_create_variable_infos): Don't iterate
	into vi_next of a full_var.
---
 gcc/tree-ssa-structalias.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 07ec4a5..06415a2 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -5924,6 +5924,8 @@ intra_create_variable_infos (struct function *fn)
 		make_constraint_from_global_restrict (p, "PARM_RESTRICT", true);
 	      else if (p->may_have_pointers)
 		make_constraint_from (p, nonlocal_id);
+	      if (p->is_full_var)
+		break;
 	    }
 	}
     }
-- 
1.9.1


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]