combine.c (label_tick_ebb_start): Fix comment.
authorAdam Nemet <anemet@caviumnetworks.com>
Thu, 8 Oct 2009 17:54:24 +0000 (17:54 +0000)
committerAdam Nemet <nemet@gcc.gnu.org>
Thu, 8 Oct 2009 17:54:24 +0000 (17:54 +0000)
* 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
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/truncate-6.c [new file with mode: 0644]

index b21fbc2b4beedd32e6b12f1022ed6e73122dbefb..2a11001a74bd795d5ff36a9e42c9a82ae7f6a540 100644 (file)
@@ -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
index 60c4059cecb47859ee1507f5f3d811f2691a2c33..af9cea2fe2a779c9523726a60f324a1cd8f3d56f 100644 (file)
@@ -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));
 }
-
-
-
 \f
 /* 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));
index 2e0e705c157a0aa92a5ab216b9ee20466d35c9f0..4212a36e1e10c762c2f56f4b9a62fefb242989cb 100644 (file)
@@ -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 (file)
index 0000000..1ccd6c5
--- /dev/null
@@ -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);
+}