expr.c: don't assume MUL for scaling pointers

DJ Delorie dj@redhat.com
Thu Nov 3 03:33:00 GMT 2011


GCC assumes the target has a multiply insn, but better code is
generated using shifts if it doesn't (vs a libcall).  Found with the
rl78-elf port.

	* expr.c (expand_expr_real_2): Don't try to emit a MUL-based
	expression if the target doesn't have a multiply pattern.  Fall
	back to shifts instead of using libgcc calls.

Index: gcc/expr.c
===================================================================
--- gcc/expr.c	(revision 180758)
+++ gcc/expr.c	(working copy)
@@ -8289,12 +8289,13 @@ expand_expr_real_2 (sepops ops, rtx targ
 	}
 
       /* Attempt to return something suitable for generating an
 	 indexed address, for machines that support that.  */
 
       if (modifier == EXPAND_SUM && mode == ptr_mode
+	  && optab_handler (smul_optab, mode) != CODE_FOR_nothing
 	  && host_integerp (treeop1, 0))
 	{
 	  tree exp1 = treeop1;
 
 	  op0 = expand_expr (treeop0, subtarget, VOIDmode,
 			     EXPAND_SUM);



More information about the Gcc-patches mailing list