On Thu, 28 Jul 2016, Prathamesh Kulkarni wrote: > On 28 July 2016 at 15:58, Andreas Schwab <sch...@suse.de> wrote: > > On Mo, Jul 25 2016, Prathamesh Kulkarni <prathamesh.kulka...@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. > 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. Richard. > Thanks, > Prathamesh > > > > Andreas. > > > > -- > > Andreas Schwab, SUSE Labs, sch...@suse.de > > GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 > > "And now for something completely different." > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)