[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;
>
> }
>
>
>
>

Reply via email to