Olga, Yes, I agree the "p" is global. But how p is going to be accessed if another file uses p? D.2215 represents the original "p", but it is not initialized as "p.0.4" and "p.0.3" do. It won't be correct if other file tried to use it. Am I right?
Cheers, Bingfeng > D.2215 = malloc (8000); > D.2240 = malloc (4000); > p.0.3 = (struct struct.0_sub.0 *) D.2240; > D.2242 = malloc (4000); > p.0.4 = (struct struct.0_sub.1 *) D.2242; > p = (struct str_t *) D.2215; > p.1 = p.0.4; > p.0 = p.0.3; -----Original Message----- From: Olga Golovanevsky [mailto:[EMAIL PROTECTED] Sent: 01 May 2008 13:19 To: Bingfeng Mei Cc: gcc@gcc.gnu.org; Kenneth Zadeck Subject: Re: Redundant malloc in structure optimization? (testsuite/gcc.dg/struct/wo_prof_global_var.c) [EMAIL PROTECTED] wrote on 28/04/2008 12:36:44: > Hello, > I am looking at a testsuite failure (wo_prof_global_var.c) in my > porting. Somehow, I found GCC 4.3.0 seems to generate unnecessary malloc > during structure optimization. In the code, the structure is split into > two individual fields (D.2240 and D.2242) and they are allocated > separately. But the original structure (D.2215) is still allocated, and > not used afterward. The following RTL-level optimization cannot > eliminate it. I think that p is global, and in my understanding right now we have no whole program dead code elimination optimization in gcc, but may be I am wrong. Kenny? Olga > > Cheers, > Bingfeng Mei > Broadcom UK > > Original C code: > > /* { dg-do compile } */ > /* { dg-do run } */ > > #include <stdlib.h> > typedef struct > { > int a; > float b; > }str_t; > > #define N 1000 > > str_t *p; > > int > main () > { > int i, sum; > > p = malloc (N * sizeof (str_t)); > for (i = 0; i < N; i++) > p[i].a = p[i].b + 1; > > for (i = 0; i < N; i++) > if (p[i].a != p[i].b + 1) > abort (); > > return 0; > } > > .final_cleanup > > /*---------------------------------------------------------------------- > ----*/ > /* { dg-final { scan-ipa-dump "Number of structures to transform is 1" > "ipa_struct_reorg" } } */ > /* { dg-final { cleanup-ipa-dump "*" } } */ > > > ;; Function main (main) > > main () > { > int i.43; > unsigned int D.2245; > unsigned int D.2243; > void * D.2242; > void * D.2240; > struct struct.0_sub.1 * p.0.4; > struct struct.0_sub.0 * p.0.3; > int i; > void * D.2215; > > <bb 2>: > D.2215 = malloc (8000); > D.2240 = malloc (4000); > p.0.3 = (struct struct.0_sub.0 *) D.2240; > D.2242 = malloc (4000); > p.0.4 = (struct struct.0_sub.1 *) D.2242; > p = (struct str_t *) D.2215; > p.1 = p.0.4; > p.0 = p.0.3; > i = 0; > > <bb 3>: > D.2243 = (unsigned int) i << 2; > (p.0.4 + D.2243)->a = (int) ((p.0.3 + D.2243)->b + 1.0e+0); > i = i + 1; > if (i != 1000) > goto <bb 3>; > else > goto <bb 4>; > > <bb 4>: > i.43 = 0; > > <bb 5>: > D.2245 = (unsigned int) i.43 << 2; > if ((float) (p.0.4 + D.2245)->a != (p.0.3 + D.2245)->b + 1.0e+0) > goto <bb 6>; > else > goto <bb 7>; > > <bb 6>: > abort (); > > <bb 7>: > i.43 = i.43 + 1; > if (i.43 != 1000) > goto <bb 5>; > else > goto <bb 8>; > > <bb 8>: > return 0; > > } > > > >