[RFC, ARM] later split of symbol_refs

Georg-Johann Lay gjl@gcc.gnu.org
Sat Jun 30 10:29:00 GMT 2012


Dmitry Melnik schrieb:
> On 06/27/2012 07:53 PM, Richard Earnshaw wrote:
>> Please update the ChangeLog entry (it's not appropriate to mention
>> Sourcery G++) and add a comment as Steven has suggested.
>>
>> Otherwise OK.
>>
> 
> Updated.
> Ok to commit now?
> 
> -- 
> Best regards,
>   Dmitry
> 
> 2009-05-29  Julian Brown  <julian@codesourcery.com>
> 
> gcc/
> 	* config/arm/arm.md (movsi): Don't split symbol refs here.
> 	(define_split): New.
> 
> diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md
> index 0654564..98ff382 100644
> --- a/gcc/config/arm/arm.md
> +++ b/gcc/config/arm/arm.md
> @@ -5472,14 +5472,6 @@
>  			       optimize && can_create_pseudo_p ());
>            DONE;
>          }
> -
> -      if (TARGET_USE_MOVT && !target_word_relocations
> -	  && GET_CODE (operands[1]) == SYMBOL_REF
> -	  && !flag_pic && !arm_tls_referenced_p (operands[1]))
> -	{
> -	  arm_emit_movpair (operands[0], operands[1]);
> -	  DONE;
> -	}
>      }
>    else /* TARGET_THUMB1...  */
>      {
> @@ -5588,6 +5580,23 @@
>    "
>  )
>  
> +;; Split symbol_refs at the later stage (after cprop), instead of generating
> +;; movt/movw pair directly at expand.  Otherwise corresponding high_sum
> +;; and lo_sum would be merged back into memory load at cprop.  However,
> +;; movt/movw is preferable, because it usually executes faster than a load.
> +(define_split
> +  [(set (match_operand:SI 0 "arm_general_register_operand" "")
> +       (match_operand:SI 1 "general_operand" ""))]
> +  "TARGET_32BIT
> +   && TARGET_USE_MOVT && GET_CODE (operands[1]) == SYMBOL_REF

Is there a special reason to restrict it to SYMBOL_REF?
Doesn't the same issue occur with, e.g.
(const (plus (symbol_ref const_int))) or label_ref?

Johann

> +   && !flag_pic && !target_word_relocations
> +   && !arm_tls_referenced_p (operands[1])"
> +  [(clobber (const_int 0))]
> +{
> +  arm_emit_movpair (operands[0], operands[1]);
> +  DONE;
> +})
> +
>  (define_insn "*thumb1_movsi_insn"
>    [(set (match_operand:SI 0 "nonimmediate_operand" "=l,l,l,l,l,>,l, m,*l*h*k")
>  	(match_operand:SI 1 "general_operand"      "l, I,J,K,>,l,mi,l,*l*h*k"))]



More information about the Gcc-patches mailing list