But how can a function outside of the file use "p" here after struct_reorg optmization. It isn't correct.
p = malloc (N * sizeof (str_t)); for (i = 0; i < N; i++) p[i].a = p[i].b + 1; foo(); <-- Assume foo() in another file access p here. It will either access uninitialized memory chunk (D.2215), or access two split substructures, then make the first allocated memory useless. -----Original Message----- From: Kenneth Zadeck [mailto:[EMAIL PROTECTED] Sent: 01 May 2008 15:09 To: Bingfeng Mei Cc: Olga Golovanevsky; gcc@gcc.gnu.org Subject: Re: Redundant malloc in structure optimization? (testsuite/gcc.dg/struct/wo_prof_global_var.c) Bingfeng Mei wrote: > 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 > > I would be surprised if we could remove a dead malloc (assuming that we could determine that p was dead, which is another issue). It would not be hard to add this but p is the hardest problem. kenny >> 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; >> >> } >> >> >> >> >> > > > >