Commit 0676c393 by Mark Mitchell Committed by Mark Mitchell

final.c (shorten_branches): Do not align labels for jump tables.

	* final.c (shorten_branches): Do not align labels for jump tables.
	(final_scan_insn): Use JUMP_TABLE_DATA_P.

	* gcc.dg/falign-labels-1.c: New test.

Co-Authored-By: Maxim Kuvyrkov <maxim@codesourcery.com>

From-SVN: r147824
parent 94324dae
2009-05-23 Mark Mitchell <mark@codesourcery.com>
* final.c (shorten_branches): Do not align labels for jump tables.
(final_scan_insn): Use JUMP_TABLE_DATA_P.
2009-05-23 Eric Botcazou <ebotcazou@adacore.com> 2009-05-23 Eric Botcazou <ebotcazou@adacore.com>
* doc/passes.texi: Standardize spelling of RTL, Tree and Tree SSA. * doc/passes.texi: Standardize spelling of RTL, Tree and Tree SSA.
......
...@@ -901,6 +901,7 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) ...@@ -901,6 +901,7 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED)
if (LABEL_P (insn)) if (LABEL_P (insn))
{ {
rtx next; rtx next;
bool next_is_jumptable;
/* Merge in alignments computed by compute_alignments. */ /* Merge in alignments computed by compute_alignments. */
log = LABEL_TO_ALIGNMENT (insn); log = LABEL_TO_ALIGNMENT (insn);
...@@ -910,31 +911,30 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED) ...@@ -910,31 +911,30 @@ shorten_branches (rtx first ATTRIBUTE_UNUSED)
max_skip = LABEL_TO_MAX_SKIP (insn); max_skip = LABEL_TO_MAX_SKIP (insn);
} }
log = LABEL_ALIGN (insn); next = next_nonnote_insn (insn);
if (max_log < log) next_is_jumptable = next && JUMP_TABLE_DATA_P (next);
if (!next_is_jumptable)
{ {
max_log = log; log = LABEL_ALIGN (insn);
max_skip = LABEL_ALIGN_MAX_SKIP; if (max_log < log)
{
max_log = log;
max_skip = LABEL_ALIGN_MAX_SKIP;
}
} }
next = next_nonnote_insn (insn);
/* ADDR_VECs only take room if read-only data goes into the text /* ADDR_VECs only take room if read-only data goes into the text
section. */ section. */
if (JUMP_TABLES_IN_TEXT_SECTION if ((JUMP_TABLES_IN_TEXT_SECTION
|| readonly_data_section == text_section) || readonly_data_section == text_section)
if (next && JUMP_P (next)) && next_is_jumptable)
{ {
rtx nextbody = PATTERN (next); log = ADDR_VEC_ALIGN (next);
if (GET_CODE (nextbody) == ADDR_VEC if (max_log < log)
|| GET_CODE (nextbody) == ADDR_DIFF_VEC) {
{ max_log = log;
log = ADDR_VEC_ALIGN (next); max_skip = LABEL_ALIGN_MAX_SKIP;
if (max_log < log) }
{ }
max_log = log;
max_skip = LABEL_ALIGN_MAX_SKIP;
}
}
}
LABEL_TO_ALIGNMENT (insn) = max_log; LABEL_TO_ALIGNMENT (insn) = max_log;
LABEL_TO_MAX_SKIP (insn) = max_skip; LABEL_TO_MAX_SKIP (insn) = max_skip;
max_log = 0; max_log = 0;
...@@ -2023,48 +2023,41 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED, ...@@ -2023,48 +2023,41 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
app_disable (); app_disable ();
next = next_nonnote_insn (insn); next = next_nonnote_insn (insn);
if (next != 0 && JUMP_P (next)) /* If this label is followed by a jump-table, make sure we put
the label in the read-only section. Also possibly write the
label and jump table together. */
if (next != 0 && JUMP_TABLE_DATA_P (next))
{ {
rtx nextbody = PATTERN (next);
/* If this label is followed by a jump-table,
make sure we put the label in the read-only section. Also
possibly write the label and jump table together. */
if (GET_CODE (nextbody) == ADDR_VEC
|| GET_CODE (nextbody) == ADDR_DIFF_VEC)
{
#if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC) #if defined(ASM_OUTPUT_ADDR_VEC) || defined(ASM_OUTPUT_ADDR_DIFF_VEC)
/* In this case, the case vector is being moved by the /* In this case, the case vector is being moved by the
target, so don't output the label at all. Leave that target, so don't output the label at all. Leave that
to the back end macros. */ to the back end macros. */
#else #else
if (! JUMP_TABLES_IN_TEXT_SECTION) if (! JUMP_TABLES_IN_TEXT_SECTION)
{ {
int log_align; int log_align;
switch_to_section (targetm.asm_out.function_rodata_section switch_to_section (targetm.asm_out.function_rodata_section
(current_function_decl)); (current_function_decl));
#ifdef ADDR_VEC_ALIGN #ifdef ADDR_VEC_ALIGN
log_align = ADDR_VEC_ALIGN (next); log_align = ADDR_VEC_ALIGN (next);
#else #else
log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT); log_align = exact_log2 (BIGGEST_ALIGNMENT / BITS_PER_UNIT);
#endif #endif
ASM_OUTPUT_ALIGN (file, log_align); ASM_OUTPUT_ALIGN (file, log_align);
} }
else else
switch_to_section (current_function_section ()); switch_to_section (current_function_section ());
#ifdef ASM_OUTPUT_CASE_LABEL #ifdef ASM_OUTPUT_CASE_LABEL
ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn), ASM_OUTPUT_CASE_LABEL (file, "L", CODE_LABEL_NUMBER (insn),
next); next);
#else #else
targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn)); targetm.asm_out.internal_label (file, "L", CODE_LABEL_NUMBER (insn));
#endif #endif
#endif #endif
break; break;
}
} }
if (LABEL_ALT_ENTRY_P (insn)) if (LABEL_ALT_ENTRY_P (insn))
output_alternate_entry_point (file, insn); output_alternate_entry_point (file, insn);
......
2009-05-23 Mark Mitchell <mark@codesourcery.com>
Maxim Kuvyrkov <maxim@codesourcery.com>
* gcc.dg/falign-labels-1.c: New test.
2009-05-23 Eric Botcazou <ebotcazou@adacore.com> 2009-05-23 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/rep_clause3.ads: New test. * gnat.dg/specs/rep_clause3.ads: New test.
......
/* { dg-do run } */
/* { dg-options "-falign-labels=8" { target { ! { m68k*-*-* || fido*-*-* } } } } */
/* On ARMv7-A CPUs, this test resulted in incorrect code generation.
The code generated for the switch statement expected the jump table
to immediately follow the jump instruction, but -falign-labels
caused the label preceding the table to be aligned. */
/* M68K and fido only support -falign-labels argument <= 2. */
volatile int x;
int main(void)
{
int y;
x = 0;
switch(x)
{
case 0:
y = 2 * x;
break;
case 1:
y = -3 * x;
break;
case 2:
y = x + 5;
break;
case 3:
y = x - 7;
break;
default:
break;
}
x = y;
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment