diff options
author | Adam Nemet <anemet@caviumnetworks.com> | 2009-10-08 17:54:24 +0000 |
---|---|---|
committer | Adam Nemet <nemet@gcc.gnu.org> | 2009-10-08 17:54:24 +0000 |
commit | e3104f55001fa42614c49cab274e078978d64e5a (patch) | |
tree | 4323ef63762199cb09a4a81657f966f46ad50f0f /gcc | |
parent | a020110e54d48068eb9c958a7f248715a534bb37 (diff) | |
download | gcc-e3104f55001fa42614c49cab274e078978d64e5a.zip gcc-e3104f55001fa42614c49cab274e078978d64e5a.tar.gz gcc-e3104f55001fa42614c49cab274e078978d64e5a.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/combine.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/mips/truncate-6.c | 12 |
4 files changed, 43 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b21fbc2..2a11001 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-10-08 Adam Nemet <anemet@caviumnetworks.com> + + * 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 <matz@suse.de> PR middle-end/41573 diff --git a/gcc/combine.c b/gcc/combine.c index 60c4059..af9cea2 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 2e0e705..4212a36 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2009-10-08 Adam Nemet <anemet@caviumnetworks.com> + + * gcc.target/mips/truncate-6.c: New test. + 2009-10-08 Jason Merrill <jason@redhat.com> * 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 0000000..1ccd6c5 --- /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); +} |