This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/42614] FRE optimizes away valid code after IPA inlining
- From: "stubbs at icerasemi dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 5 Jan 2010 11:14:09 -0000
- Subject: [Bug tree-optimization/42614] FRE optimizes away valid code after IPA inlining
- References: <bug-42614-17160@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #2 from stubbs at icerasemi dot com 2010-01-05 11:14 -------
This code should do it:
---
extern void *malloc(int);
extern void abort(void);
extern void free(void *);
typedef struct SEntry
{
unsigned char num;
} TEntry;
typedef struct STable
{
TEntry data[2];
} TTable;
TTable *init ()
{
return malloc(sizeof(TTable));
}
void
expect_func (int a, unsigned char *b) __attribute__ ((noinline));
static inline void
inlined_wrong (TEntry *entry_p, int flag);
void
inlined_wrong (TEntry *entry_p, int flag)
{
unsigned char index;
entry_p->num = 0;
if (flag == 0)
abort();
for (index = 0; index < 1; index++)
entry_p->num++;
if (!entry_p->num)
{
abort();
}
}
void
expect_func (int a, unsigned char *b)
{
if (abs ((a == 0)))
abort ();
if (abs ((b == 0)))
abort ();
}
int
main ()
{
unsigned char index = 0;
TTable *table_p = init();
TEntry work;
inlined_wrong (&(table_p->data[1]), 1);
expect_func (1, &index);
inlined_wrong (&work, 1);
free (table_p);
return 1;
}
---
Built with the command line:
---
gcc -O2 -finline-functions-called-once fail.c
---
When built with GCC 4.4.1 the resultant executable incorrectly calls abort.
When built with GCC 3.4.6 the resultant executable doesn't abort.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42614