[PATCH] Fix PR target/37483

Adam Nemet anemet@caviumnetworks.com
Tue Sep 16 20:28:00 GMT 2008


Jakub Jelinek writes:
> When you are already reshuffling the code, it might not be a bad idea
> to use if (!(t_unconditional
> 	     || rtx_cost (...) < COSTS_N_INSNS (2)))

Sure.  Here is the updated patch.

Bootstrapped on mips-linux-gnu and regtested on mips-elf.  Also bootstrapped
and regtested on x86_64-linux-gnu.

OK?

2008-09-16  Jakub Jelinek  <jakub@redhat.com>
	    Adam Nemet  <anemet@caviumnetworks.com>

	PR target/37483
	* ifcvt.c (noce_try_sign_mask): Use if_info->test_bb instead of
	if_info->insn_b's bb as argument to optimize_bb_for_speed_p.
	Rearrange code to better match the original comment.  Check
	t_unconditional first.  Improve comment.

testsuite/
	* gcc.c-torture/compile/pr37483.c: New test.
	* gcc.c-torture/compile/pr37395.c: New test.

Index: ifcvt.c
===================================================================
*** ifcvt.c	(revision 139918)
--- ifcvt.c	(working copy)
*************** noce_try_sign_mask (struct noce_if_info 
*** 1869,1875 ****
    rtx cond, t, m, c, seq;
    enum machine_mode mode;
    enum rtx_code code;
!   bool b_unconditional;
  
    cond = if_info->cond;
    code = GET_CODE (cond);
--- 1869,1875 ----
    rtx cond, t, m, c, seq;
    enum machine_mode mode;
    enum rtx_code code;
!   bool t_unconditional;
  
    cond = if_info->cond;
    code = GET_CODE (cond);
*************** noce_try_sign_mask (struct noce_if_info 
*** 1898,1913 ****
    if (GET_MODE (m) != mode)
      return FALSE;
  
!   /* This is only profitable if T is cheap, or T is unconditionally
!      executed/evaluated in the original insn sequence.  The latter
!      happens if INSN_B was taken from TEST_BB, or if there was no
!      INSN_B which can happen for e.g. conditional stores to memory.  */
!   b_unconditional = (if_info->insn_b == NULL_RTX
! 		     || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb);
!   if (rtx_cost (t, SET, optimize_bb_for_speed_p (BLOCK_FOR_INSN (if_info->insn_b)))
!       >= COSTS_N_INSNS (2)
!       && (!b_unconditional
!           || t != if_info->b))
      return FALSE;
  
    start_sequence ();
--- 1898,1916 ----
    if (GET_MODE (m) != mode)
      return FALSE;
  
!   /* This is only profitable if T is unconditionally executed/evaluated in the
!      original insn sequence or T is cheap.  The former happens if B is the
!      non-zero (T) value and if INSN_B was taken from TEST_BB, or there was no
!      INSN_B which can happen for e.g. conditional stores to memory.  For the
!      cost computation use the block TEST_BB where the evaluation will end up
!      after the transformation.  */
!   t_unconditional =
!     (t == if_info->b
!      && (if_info->insn_b == NULL_RTX
! 	 || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb));
!   if (!(t_unconditional
! 	|| (rtx_cost (t, SET, optimize_bb_for_speed_p (if_info->test_bb))
! 	    < COSTS_N_INSNS (2))))
      return FALSE;
  
    start_sequence ();
Index: testsuite/gcc.c-torture/compile/pr37483.c
===================================================================
*** testsuite/gcc.c-torture/compile/pr37483.c	(revision 0)
--- testsuite/gcc.c-torture/compile/pr37483.c	(revision 0)
***************
*** 0 ****
--- 1,10 ----
+ /* PR target/37483 */
+ 
+ unsigned long long
+ foo (unsigned count, int i)
+ {
+   unsigned long long value;
+   if (i == 0)
+     value = (value & 0xFFFFFFFF) >> count;
+   return value;
+ }
Index: testsuite/gcc.c-torture/compile/pr37395.c
===================================================================
*** testsuite/gcc.c-torture/compile/pr37395.c	(revision 0)
--- testsuite/gcc.c-torture/compile/pr37395.c	(revision 0)
***************
*** 0 ****
--- 1,11 ----
+ /* PR target/37395 */
+ 
+ int
+ f (int j)
+ {
+   int i;
+   asm volatile ("" : "=r"(i));
+   if (i >= 0)
+     j = 0;
+   return j;
+ }



More information about the Gcc-patches mailing list