From e3104f55001fa42614c49cab274e078978d64e5a Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Thu, 8 Oct 2009 17:54:24 +0000 Subject: [PATCH] combine.c (label_tick_ebb_start): Fix comment. * combine.c (label_tick_ebb_start): Fix comment. (combine_instructions): Set label_tick and label_tick_ebb_start before calling setup_incoming_promotions. Start them from 1. Increment label_tick instead of deriving it from the BB index. Rather than comparing ticks use the block from the previous iteration to decide whether to start a new EBB. Remove empty lines before function. testsuite/ * gcc.target/mips/truncate-6.c: New test. From-SVN: r152567 --- gcc/ChangeLog | 9 +++++++ gcc/combine.c | 29 ++++++++++++++-------- gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gcc.target/mips/truncate-6.c | 12 +++++++++ 4 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.target/mips/truncate-6.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b21fbc2b4bee..2a11001a74bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-10-08 Adam Nemet + + * combine.c (label_tick_ebb_start): Fix comment. + (combine_instructions): Set label_tick and label_tick_ebb_start before + calling setup_incoming_promotions. Start them from 1. Increment + label_tick instead of deriving it from the BB index. Rather than + comparing ticks use the block from the previous iteration to decide + whether to start a new EBB. Remove empty lines before function. + 2009-10-08 Michael Matz PR middle-end/41573 diff --git a/gcc/combine.c b/gcc/combine.c index 60c4059cecb4..af9cea2fe2a7 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -321,7 +321,7 @@ static rtx *uid_log_links; static int label_tick; -/* Reset to label_tick for each label. */ +/* Reset to label_tick for each extended basic block in scanning order. */ static int label_tick_ebb_start; @@ -1010,9 +1010,6 @@ clear_log_links (void) if (INSN_P (insn)) free_INSN_LIST_list (&LOG_LINKS (insn)); } - - - /* Main entry point for combiner. F is the first insn of the function. NREGS is the first unused pseudo-reg number. @@ -1028,6 +1025,7 @@ combine_instructions (rtx f, unsigned int nregs) #endif rtx links, nextlinks; rtx first; + basic_block last_bb; int new_direct_jump_p = 0; @@ -1058,6 +1056,7 @@ combine_instructions (rtx f, unsigned int nregs) problems when, for example, we have j <<= 1 in a loop. */ nonzero_sign_valid = 0; + label_tick = label_tick_ebb_start = 1; /* Scan all SETs and see if we can deduce anything about what bits are known to be zero for some registers and how many copies @@ -1067,18 +1066,23 @@ combine_instructions (rtx f, unsigned int nregs) for what bits are known to be set. */ setup_incoming_promotions (first); + /* Allow the entry block and the first block to fall into the same EBB. + Conceptually the incoming promotions are assigned to the entry block. */ + last_bb = ENTRY_BLOCK_PTR; create_log_links (); - label_tick_ebb_start = ENTRY_BLOCK_PTR->index; FOR_EACH_BB (this_basic_block) { optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block); last_call_luid = 0; mem_last_set = -1; - label_tick = this_basic_block->index; + + label_tick++; if (!single_pred_p (this_basic_block) - || single_pred (this_basic_block)->index != label_tick - 1) + || single_pred (this_basic_block) != last_bb) label_tick_ebb_start = label_tick; + last_bb = this_basic_block; + FOR_BB_INSNS (this_basic_block, insn) if (INSN_P (insn) && BLOCK_FOR_INSN (insn)) { @@ -1109,20 +1113,23 @@ combine_instructions (rtx f, unsigned int nregs) nonzero_sign_valid = 1; /* Now scan all the insns in forward order. */ - - label_tick_ebb_start = ENTRY_BLOCK_PTR->index; + label_tick = label_tick_ebb_start = 1; init_reg_last (); setup_incoming_promotions (first); + last_bb = ENTRY_BLOCK_PTR; FOR_EACH_BB (this_basic_block) { optimize_this_for_speed_p = optimize_bb_for_speed_p (this_basic_block); last_call_luid = 0; mem_last_set = -1; - label_tick = this_basic_block->index; + + label_tick++; if (!single_pred_p (this_basic_block) - || single_pred (this_basic_block)->index != label_tick - 1) + || single_pred (this_basic_block) != last_bb) label_tick_ebb_start = label_tick; + last_bb = this_basic_block; + rtl_profile_for_bb (this_basic_block); for (insn = BB_HEAD (this_basic_block); insn != NEXT_INSN (BB_END (this_basic_block)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e0e705c157a..4212a36e1e10 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-10-08 Adam Nemet + + * gcc.target/mips/truncate-6.c: New test. + 2009-10-08 Jason Merrill * g++.dg/cpp0x/rv-deduce.C: New. diff --git a/gcc/testsuite/gcc.target/mips/truncate-6.c b/gcc/testsuite/gcc.target/mips/truncate-6.c new file mode 100644 index 000000000000..1ccd6c59c3d6 --- /dev/null +++ b/gcc/testsuite/gcc.target/mips/truncate-6.c @@ -0,0 +1,12 @@ +/* setup_incoming_promotions should detect x to be already sign-extended due + to PROMOTE_MODE. Thus the truncation should be removed by combine. Based + on gcc.c-torture/execute/pr34070-2.c. */ +/* { dg-options "-O -mgp64" } */ +/* { dg-final { scan-assembler-not "\tsll\t\[^\n\]*,0" } } */ + +NOMIPS16 int f(unsigned int x, int n, int *p) +{ + if (p) + *p = 1; + return ((int)x) / (1 << n); +} -- 2.47.2