This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Inner-loop optimization regression from 3.3 to 3.4


Richard Henderson <rth@redhat.com> writes:

> On Fri, Oct 17, 2003 at 04:10:02PM +0200, Jan Hubicka wrote:
> > + 	/* Convert (a >= 0) into (a >> (bits_per_mode - 1)) != -1.  */
> 
> Comment's wrong.
> 
> > + 	if (op1 == const0_rtx && BRANCH_COST > 1)
> > + 	  {
> > + 	  nonnegative:
> > + 	    return expand_simple_binop (GET_MODE (op0), ASHIFTRT, op0,
> > + 				        GEN_INT (GET_MODE_BITSIZE
> > + 						 (GET_MODE (op0)) - 1),
> > + 					NULL_RTX, 1, OPTAB_DIRECT);
> 
> Overall this looks reasonable.  It does however need to check rtx
> costs a lot more.  On Alpha for instance, LT is 2 to 6 times cheaper
> than ASHIFTRT, depending on how you count costs.

Maybe it's easier to do that in the machine description, that way it
gets also optimized if the user explicitely specified x >> 63. For
example:

Index: alpha.md
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/config/alpha/alpha.md,v
retrieving revision 1.213
diff -u -p -r1.213 alpha.md
--- alpha.md	27 Sep 2003 04:48:12 -0000	1.213
+++ alpha.md	19 Oct 2003 09:52:21 -0000
@@ -1421,6 +1421,14 @@ fadd,fmul,fcpys,fdiv,fsqrt,misc,mvi,ftoi
 }
   [(set_attr "type" "iadd")])
 
+(define_insn "*lshrdi3_63"
+  [(set (match_operand:DI 0 "register_operand" "=r")
+	(lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")
+		     (const_int 63)))]
+  ""
+  "cmplt %r1,0,%0"
+  [(set_attr "type" "icmp")])
+
 (define_insn "lshrdi3"
   [(set (match_operand:DI 0 "register_operand" "=r")
 	(lshiftrt:DI (match_operand:DI 1 "reg_or_0_operand" "rJ")

-- 
	Falk


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]