> Since this commit (r249013), I've noticed a regression on arm targets:
> FAIL: gcc.target/arm/cold-lc.c scan-assembler-not bl[^\n]*dump_stack
I think that is because we optimize the testcase:
/* { dg-do compile } */
/* { dg-options "-O2 -mlong-calls" } */
/* { dg-final { scan-assembler-not "bl\[^\n\]*dump_stack" } } */
extern void dump_stack (void) __attribute__ ((__cold__)) __attribute__
((noinline));
struct thread_info {
struct task_struct *task;
};
extern struct thread_info *current_thread_info (void);
extern int show_stack (struct task_struct *, unsigned long *);
void dump_stack (void)
{
unsigned long stack;
show_stack ((current_thread_info ()->task), &stack);
}
void die (char *str, void *fp, int nr)
{
dump_stack ();
while (1);
}
the new logic will move die() into cold section (because it unavoidably leads
to cold
code and thus allow using the bl instruction.
I guess just modifying die to call dump_stack conditionally should fix the
testcase.
Honza
>
>
> >>+ if (!n->analyzed
> >>+ || n->decl == current_function_decl)
> >>+ return false;
> >>+ return n->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED;
> >>+}
> >