diff mbox

[PR70920] transform (intptr_t) x eq/ne CST to x eq/ne (typeof x) cst

Message ID CAAgBjMm6-Z77jxER9TLNC1O5YQCaSy7mu-itUFPFe2wobEGNDg@mail.gmail.com
State Superseded
Headers show

Commit Message

Prathamesh Kulkarni July 29, 2016, 1:01 a.m. UTC
On 28 July 2016 at 19:18, Richard Biener <rguenther@suse.de> wrote:
> On Thu, 28 Jul 2016, Prathamesh Kulkarni wrote:

>

>> On 28 July 2016 at 15:58, Andreas Schwab <schwab@suse.de> wrote:

>> > On Mo, Jul 25 2016, Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> wrote:

>> >

>> >> diff --git a/gcc/testsuite/gcc.dg/pr70920-4.c b/gcc/testsuite/gcc.dg/pr70920-4.c

>> >> new file mode 100644

>> >> index 0000000..dedb895

>> >> --- /dev/null

>> >> +++ b/gcc/testsuite/gcc.dg/pr70920-4.c

>> >> @@ -0,0 +1,21 @@

>> >> +/* { dg-do compile } */

>> >> +/* { dg-options "-O2 -fdump-tree-ccp-details -Wno-int-to-pointer-cast" } */

>> >> +

>> >> +#include <stdint.h>

>> >> +

>> >> +void f1();

>> >> +void f2();

>> >> +

>> >> +void

>> >> +foo (int a)

>> >> +{

>> >> +  void *cst = 0;

>> >> +  if ((int *) a == cst)

>> >> +    {

>> >> +      f1 ();

>> >> +      if (a)

>> >> +     f2 ();

>> >> +    }

>> >> +}

>> >> +

>> >> +/* { dg-final { scan-tree-dump "gimple_simplified to if \\(_\[0-9\]* == 0\\)" "ccp1" } } */

>> >

>> > This fails on all ilp32 platforms.

>> Oops, sorry for the breakage.

>> With -m32, the pattern is applied during forwprop1 rather than ccp1.

>> I wonder though why ccp1 fails to fold the pattern with -m32 ?

>> Looking at the dumps:

>>

>> without -m32:

>> input to ccp1 pass:

>>   <bb 2>:

>>   cst_4 = 0B;

>>   _1 = (long int) a_5(D);

>>   _2 = (void *) _1;

>>   if (cst_4 == _2)

>>     goto <bb 3>;

>>   else

>>     goto <bb 5>;

>>

>> cc1 pass dump shows:

>> Substituting values and folding statements

>>

>> Folding statement: _1 = (long int) a_5(D);

>> Not folded

>> Folding statement: _2 = (void *) _1;

>> Not folded

>> Folding statement: if (cst_4 == _2)

>> which is likely CONSTANT

>> Applying pattern match.pd:2537, gimple-match.c:6530

>> gimple_simplified to if (_1 == 0)

>> Folded into: if (_1 == 0)

>>

>> with -m32:

>> input to ccp1 pass:

>>  <bb 2>:

>>   cst_3 = 0B;

>>   a.0_1 = (void *) a_4(D);

>>   if (cst_3 == a.0_1)

>>     goto <bb 3>;

>>   else

>>     goto <bb 5>;

>>

>> ccp1 pass dump shows:

>> Substituting values and folding statements

>>

>> Folding statement: a.0_1 = (void *) a_4(D);

>> Not folded

>> Folding statement: if (cst_3 == a.0_1)

>> which is likely CONSTANT

>> Folded into: if (a.0_1 == 0B)

>>

>> I am not able to understand why it doesn't fold it to

>> if (a_4(D) == 0) ?

>> forwprop1 folds a.0_1 == 0B to a_4(D) == 0.

>

> It's because CCP folds with follow-single-use edges but the

> match-and-simplify code uses a single callback to valueize and

> decide whether its valid to follow the SSA edge.  I did have some

> old patches trying to fix that but never followed up on those.

Thanks for the explanation.
>

>> I suppose the test-case would need to scan ccp1 for non-ilp targets

>> and forwprop1 for

>> ilp targets. How do update the test-case to reflect this ?

>

> It's simpler to verify that at some point (forwprop) we have the

> expected IL rather than testing for the match debug prints.

In forwprop dump,
For m32, we have if (a_4(D) == 0)
and without m32: if (_1 == 0)
So need to match either a default def or anonymous name
in the test-case, which I am having a bit of trouble writing regex for.
In the patch i simply chose to match "== 0\\)", not sure if that's a good idea.
Also how do I update the test-case so that it gets tested twice, once with -m32
and once without ?

Thanks,
Prathamesh
>

> Richard.

>

>> Thanks,

>> Prathamesh

>> >

>> > Andreas.

>> >

>> > --

>> > Andreas Schwab, SUSE Labs, schwab@suse.de

>> > GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7

>> > "And now for something completely different."

>>

>>

>

> --

> Richard Biener <rguenther@suse.de>

> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)
diff mbox

Patch

diff --git a/gcc/testsuite/gcc.dg/pr70920-4.c b/gcc/testsuite/gcc.dg/pr70920-4.c
index dedb895..035c3cb 100644
--- a/gcc/testsuite/gcc.dg/pr70920-4.c
+++ b/gcc/testsuite/gcc.dg/pr70920-4.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fdump-tree-ccp-details -Wno-int-to-pointer-cast" } */
+/* { dg-options "-O2 -fdump-tree-forwprop-details -Wno-int-to-pointer-cast" } */
 
 #include <stdint.h>
 
@@ -18,4 +18,4 @@  foo (int a)
     }
 }
 
-/* { dg-final { scan-tree-dump "gimple_simplified to if \\(_\[0-9\]* == 0\\)" "ccp1" } } */
+/* { dg-final { scan-tree-dump "== 0\\)" "forwprop1" } } */