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