public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Handle POINTER_PLUS_EXPR in jump functions
@ 2020-10-14 13:40 Jan Hubicka
  2020-10-15  8:24 ` Jakub Jelinek
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Hubicka @ 2020-10-14 13:40 UTC (permalink / raw)
  To: gcc-patches

Hi,
this patch adds logic to handle POINTER_PLUS_EXPR in compute_parm_map
that I originally did not since I tought that all such adjustments are
done by ancestor function.

Bootstrapped/regtested x86_64-linux, will commit it shortly.
Honza

gcc/ChangeLog:

2020-10-14  Jan Hubicka  <hubicka@ucw.cz>

	* ipa-modref.c (compute_parm_map): Handle POINTER_PLUS_EXPR in
	PASSTHROUGH.

gcc/testsuite/ChangeLog:

2020-10-14  Jan Hubicka  <hubicka@ucw.cz>

	* gcc.dg/ipa/modref-1.c: New test.
	* gcc.dg/tree-ssa/modref-4.c: New test.

diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c
index a6dfe1fc401..8e6a87643ec 100644
--- a/gcc/ipa-modref.c
+++ b/gcc/ipa-modref.c
@@ -1682,9 +1682,18 @@ compute_parm_map (cgraph_edge *callee_edge, vec<modref_parm_map> *parm_map)
 	    {
 	      (*parm_map)[i].parm_index
 		= ipa_get_jf_pass_through_formal_id (jf);
-	      (*parm_map)[i].parm_offset_known
-		= ipa_get_jf_pass_through_operation (jf) == NOP_EXPR;
-	      (*parm_map)[i].parm_offset = 0;
+	      if (ipa_get_jf_pass_through_operation (jf) == NOP_EXPR)
+		{
+		  (*parm_map)[i].parm_offset_known = true;
+		  (*parm_map)[i].parm_offset = 0;
+		}
+	      else if (ipa_get_jf_pass_through_operation (jf)
+		       == POINTER_PLUS_EXPR
+		       && ptrdiff_tree_p (ipa_get_jf_pass_through_operand (jf),
+					  &(*parm_map)[i].parm_offset))
+		(*parm_map)[i].parm_offset_known = true;
+	      else
+		(*parm_map)[i].parm_offset_known = false;
 	      continue;
 	    }
 	  if (jf && jf->type == IPA_JF_ANCESTOR)
diff --git a/gcc/testsuite/gcc.dg/ipa/modref-1.c b/gcc/testsuite/gcc.dg/ipa/modref-1.c
new file mode 100644
index 00000000000..46eb78ccebf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/ipa/modref-1.c
@@ -0,0 +1,23 @@
+/* { dg-options "-O2 -fdump-ipa-modref"  } */
+/* { dg-do compile } */
+__attribute__((noinline))
+void a(char *ptr, char *ptr2)
+{
+  (*ptr)++;
+  (*ptr2)++;
+}
+
+__attribute__((noinline))
+b(char *ptr)
+{
+  a(ptr+1,&ptr[2]);
+}
+main()
+{
+  char c[2]={0,1,0};
+  b(c);
+  return c[0]+c[2];
+}
+/* Check that both param offsets are determined correctly.  */
+/* { dg-final { scan-ipa-dump "param offset: 1" "modref"  } } */
+/* { dg-final { scan-ipa-dump "param offset: 2" "modref"  } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c
new file mode 100644
index 00000000000..776f46ed687
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c
@@ -0,0 +1,25 @@
+/* { dg-options "-O2 -fdump-tree-modref1"  } */
+/* { dg-do compile } */
+__attribute__((noinline))
+void a(char *ptr, char *ptr2)
+{
+  (*ptr)++;
+  (*ptr2)++;
+}
+
+__attribute__((noinline))
+b(char *ptr)
+{
+  a(ptr+1,&ptr[2]);
+}
+main()
+{
+  char c[2]={0,1,0};
+  b(c);
+  return c[0]+c[2];
+}
+/* Check that both param offsets are determined correctly and the computation
+   is optimized out.  */
+/* { dg-final { scan-tree-dump "param offset: 1" "modref1"  } } */
+/* { dg-final { scan-tree-dump "param offset: 2" "modref2"  } } */
+/* { dg-final { scan-tree-dump "return 0" "modref2"  } } */

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Handle POINTER_PLUS_EXPR in jump functions
  2020-10-14 13:40 Handle POINTER_PLUS_EXPR in jump functions Jan Hubicka
@ 2020-10-15  8:24 ` Jakub Jelinek
  2020-10-15 12:39   ` Jan Hubicka
  0 siblings, 1 reply; 5+ messages in thread
From: Jakub Jelinek @ 2020-10-15  8:24 UTC (permalink / raw)
  To: Jan Hubicka; +Cc: gcc-patches

On Wed, Oct 14, 2020 at 03:40:33PM +0200, Jan Hubicka wrote:
> this patch adds logic to handle POINTER_PLUS_EXPR in compute_parm_map
> that I originally did not since I tought that all such adjustments are
> done by ancestor function.
> 
> Bootstrapped/regtested x86_64-linux, will commit it shortly.
> Honza
> 
> gcc/ChangeLog:
> 
> 2020-10-14  Jan Hubicka  <hubicka@ucw.cz>
> 
> 	* ipa-modref.c (compute_parm_map): Handle POINTER_PLUS_EXPR in
> 	PASSTHROUGH.
> 
> gcc/testsuite/ChangeLog:
> 
> 2020-10-14  Jan Hubicka  <hubicka@ucw.cz>
> 
> 	* gcc.dg/ipa/modref-1.c: New test.
> 	* gcc.dg/tree-ssa/modref-4.c: New test.

Both of these tests FAIL everywhere:
FAIL: gcc.dg/ipa/modref-1.c (test for excess errors)
FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 1"
FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 2"
FAIL: gcc.dg/tree-ssa/modref-4.c (test for excess errors)
FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "param offset: 1"
UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "param offset: 2"
UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "return 0"

I've tried to fix most of things, but
FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "return 0"
remains (it isn't even optimized in optimized dump).

Committed to trunk as obvious anyway, but please tweak the modref-4.c
test according to what you meant.

2020-10-15  Jakub Jelinek  <jakub@redhat.com>

	* gcc.dg/ipa/modref-1.c: Remove space between param offset: and number
	in scan-ipa-dump.
	(b): Declare return type to void.
	(main): Declare return type to int.  Change c to array of 3 chars.
	* gcc.dg/tree-ssa/modref-4.c: Remove space between param offset: and
	number in scan-ipa-dump.  Use modref1 instead of modref2.
	(b): Declare return type to void.
	(main): Declare return type to int.  Change c to array of 3 chars.

--- gcc/testsuite/gcc.dg/ipa/modref-1.c.jj	2020-10-14 17:03:00.302245922 +0200
+++ gcc/testsuite/gcc.dg/ipa/modref-1.c	2020-10-15 10:13:43.044535887 +0200
@@ -8,16 +8,17 @@ void a(char *ptr, char *ptr2)
 }
 
 __attribute__((noinline))
-b(char *ptr)
+void b(char *ptr)
 {
   a(ptr+1,&ptr[2]);
 }
-main()
+
+int main()
 {
-  char c[2]={0,1,0};
+  char c[3]={0,1,0};
   b(c);
   return c[0]+c[2];
 }
 /* Check that both param offsets are determined correctly.  */
-/* { dg-final { scan-ipa-dump "param offset: 1" "modref"  } } */
-/* { dg-final { scan-ipa-dump "param offset: 2" "modref"  } } */
+/* { dg-final { scan-ipa-dump "param offset:1" "modref"  } } */
+/* { dg-final { scan-ipa-dump "param offset:2" "modref"  } } */
--- gcc/testsuite/gcc.dg/tree-ssa/modref-4.c.jj	2020-10-14 17:03:00.333245482 +0200
+++ gcc/testsuite/gcc.dg/tree-ssa/modref-4.c	2020-10-15 10:12:14.039825998 +0200
@@ -8,18 +8,19 @@ void a(char *ptr, char *ptr2)
 }
 
 __attribute__((noinline))
-b(char *ptr)
+void b(char *ptr)
 {
   a(ptr+1,&ptr[2]);
 }
-main()
+
+int main()
 {
-  char c[2]={0,1,0};
+  char c[3]={0,1,0};
   b(c);
   return c[0]+c[2];
 }
 /* Check that both param offsets are determined correctly and the computation
    is optimized out.  */
-/* { dg-final { scan-tree-dump "param offset: 1" "modref1"  } } */
-/* { dg-final { scan-tree-dump "param offset: 2" "modref2"  } } */
-/* { dg-final { scan-tree-dump "return 0" "modref2"  } } */
+/* { dg-final { scan-tree-dump "param offset:1" "modref1"  } } */
+/* { dg-final { scan-tree-dump "param offset:2" "modref1"  } } */
+/* { dg-final { scan-tree-dump "return 0" "modref1"  } } */

	Jakub


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Handle POINTER_PLUS_EXPR in jump functions
  2020-10-15  8:24 ` Jakub Jelinek
@ 2020-10-15 12:39   ` Jan Hubicka
  2020-10-15 12:49     ` Jakub Jelinek
  0 siblings, 1 reply; 5+ messages in thread
From: Jan Hubicka @ 2020-10-15 12:39 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

> On Wed, Oct 14, 2020 at 03:40:33PM +0200, Jan Hubicka wrote:
> > this patch adds logic to handle POINTER_PLUS_EXPR in compute_parm_map
> > that I originally did not since I tought that all such adjustments are
> > done by ancestor function.
> > 
> > Bootstrapped/regtested x86_64-linux, will commit it shortly.
> > Honza
> > 
> > gcc/ChangeLog:
> > 
> > 2020-10-14  Jan Hubicka  <hubicka@ucw.cz>
> > 
> > 	* ipa-modref.c (compute_parm_map): Handle POINTER_PLUS_EXPR in
> > 	PASSTHROUGH.
> > 
> > gcc/testsuite/ChangeLog:
> > 
> > 2020-10-14  Jan Hubicka  <hubicka@ucw.cz>
> > 
> > 	* gcc.dg/ipa/modref-1.c: New test.
> > 	* gcc.dg/tree-ssa/modref-4.c: New test.
> 
> Both of these tests FAIL everywhere:
> FAIL: gcc.dg/ipa/modref-1.c (test for excess errors)
> FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 1"
> FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 2"
> FAIL: gcc.dg/tree-ssa/modref-4.c (test for excess errors)
> FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "param offset: 1"
> UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "param offset: 2"
> UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "return 0"
> 
> I've tried to fix most of things, but
> FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "return 0"
> remains (it isn't even optimized in optimized dump).
> 
> Committed to trunk as obvious anyway, but please tweak the modref-4.c
> test according to what you meant.
> 
> 2020-10-15  Jakub Jelinek  <jakub@redhat.com>
> 
> 	* gcc.dg/ipa/modref-1.c: Remove space between param offset: and number
> 	in scan-ipa-dump.
> 	(b): Declare return type to void.
> 	(main): Declare return type to int.  Change c to array of 3 chars.
> 	* gcc.dg/tree-ssa/modref-4.c: Remove space between param offset: and
> 	number in scan-ipa-dump.  Use modref1 instead of modref2.
> 	(b): Declare return type to void.
> 	(main): Declare return type to int.  Change c to array of 3 chars.
Sorry for that - I had fixed versions of the testcases but must have
mixed the up.   I will look at the reutrn 0 case.

Honza

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Handle POINTER_PLUS_EXPR in jump functions
  2020-10-15 12:39   ` Jan Hubicka
@ 2020-10-15 12:49     ` Jakub Jelinek
  2020-10-16 10:27       ` Jan Hubicka
  0 siblings, 1 reply; 5+ messages in thread
From: Jakub Jelinek @ 2020-10-15 12:49 UTC (permalink / raw)
  To: Jan Hubicka; +Cc: gcc-patches

On Thu, Oct 15, 2020 at 02:39:26PM +0200, Jan Hubicka wrote:
> > Both of these tests FAIL everywhere:
> > FAIL: gcc.dg/ipa/modref-1.c (test for excess errors)
> > FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 1"
> > FAIL: gcc.dg/ipa/modref-1.c scan-ipa-dump modref "param offset: 2"
> > FAIL: gcc.dg/tree-ssa/modref-4.c (test for excess errors)
> > FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "param offset: 1"
> > UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "param offset: 2"
> > UNRESOLVED: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref2 "return 0"
> > 
> > I've tried to fix most of things, but
> > FAIL: gcc.dg/tree-ssa/modref-4.c scan-tree-dump modref1 "return 0"
> > remains (it isn't even optimized in optimized dump).
> > 
> > Committed to trunk as obvious anyway, but please tweak the modref-4.c
> > test according to what you meant.
> > 
> > 2020-10-15  Jakub Jelinek  <jakub@redhat.com>
> > 
> > 	* gcc.dg/ipa/modref-1.c: Remove space between param offset: and number
> > 	in scan-ipa-dump.
> > 	(b): Declare return type to void.
> > 	(main): Declare return type to int.  Change c to array of 3 chars.
> > 	* gcc.dg/tree-ssa/modref-4.c: Remove space between param offset: and
> > 	number in scan-ipa-dump.  Use modref1 instead of modref2.
> > 	(b): Declare return type to void.
> > 	(main): Declare return type to int.  Change c to array of 3 chars.
> Sorry for that - I had fixed versions of the testcases but must have
> mixed the up.   I will look at the reutrn 0 case.

Note that even if it optimized as much as it ever could, return 0 is not the
correct value, while c[0] is unmodified and the optimization
correctly proves that it isn't and optimizes it into 0, c[2] is modified -
it is changed from 0 to 1.  Perhaps you meant c[4]={0,1,0,0}; and check
if c[0]+c[3] is optimized into 0?

	Jakub


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Handle POINTER_PLUS_EXPR in jump functions
  2020-10-15 12:49     ` Jakub Jelinek
@ 2020-10-16 10:27       ` Jan Hubicka
  0 siblings, 0 replies; 5+ messages in thread
From: Jan Hubicka @ 2020-10-16 10:27 UTC (permalink / raw)
  To: Jakub Jelinek; +Cc: gcc-patches

> > > 
> > > 2020-10-15  Jakub Jelinek  <jakub@redhat.com>
> > > 
> > > 	* gcc.dg/ipa/modref-1.c: Remove space between param offset: and number
> > > 	in scan-ipa-dump.
> > > 	(b): Declare return type to void.
> > > 	(main): Declare return type to int.  Change c to array of 3 chars.
> > > 	* gcc.dg/tree-ssa/modref-4.c: Remove space between param offset: and
> > > 	number in scan-ipa-dump.  Use modref1 instead of modref2.
> > > 	(b): Declare return type to void.
> > > 	(main): Declare return type to int.  Change c to array of 3 chars.
> > Sorry for that - I had fixed versions of the testcases but must have
> > mixed the up.   I will look at the reutrn 0 case.
> 
> Note that even if it optimized as much as it ever could, return 0 is not the
> correct value, while c[0] is unmodified and the optimization
> correctly proves that it isn't and optimizes it into 0, c[2] is modified -
> it is changed from 0 to 1.  Perhaps you meant c[4]={0,1,0,0}; and check
> if c[0]+c[3] is optimized into 0?
Yep, I was trying to check that both offset and size are correctly
determined.  I applied the folowing:

	* gcc.dg/tree-ssa/modref-4.c: Fix return test.

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c b/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c
index 97fe5307a1c..3ac217bafb8 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/modref-4.c
@@ -15,9 +15,9 @@ void b(char *ptr)
 
 int main()
 {
-  char c[3]={0,1,0};
+  char c[4]={0,1,2,0};
   b(c);
-  return c[0]+c[2];
+  return c[0]+c[3];
 }
 /* Check that both param offsets are determined correctly and the computation
    is optimized out.  */

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-10-16 10:27 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-14 13:40 Handle POINTER_PLUS_EXPR in jump functions Jan Hubicka
2020-10-15  8:24 ` Jakub Jelinek
2020-10-15 12:39   ` Jan Hubicka
2020-10-15 12:49     ` Jakub Jelinek
2020-10-16 10:27       ` Jan Hubicka

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).