[Patch] [arm] Fix 88714, Arm LDRD/STRD peepholes

Kyrill Tkachov kyrylo.tkachov@foss.arm.com
Mon Feb 18 12:47:00 GMT 2019


On 2/17/19 7:29 AM, Jakub Jelinek wrote:
> On Mon, Feb 11, 2019 at 12:08:32PM +0100, Jakub Jelinek wrote:
>> So like the patch below (though, I have only limited possibilities to test
>> this, can throw it in armv7hl-linux-gnueabi distro build).
> Actually, that patch was bad, I misread the CORE_REGS vs. GENERAL_REGS
> hardregset difference, it is actually sp that is not GENERAL_REGS but is
> CORE_REGS, not ip.  So here is an updated patch, same except that in
> ldrdstrd.md the q constraints are kept in the right spot.
> To repeat, I don't think the q constraints on movdi are now needed, because
> ldrdstrd doesn't use those DImode patterns and RA will not allocate a DImode hard
> reg starting at ip because sp is a fixed register.
>
> Bootstrapped/regtested on armv7hl-linux-gnueabi (distro build), ok for
> trunk?

Ok.

Thanks for working on this.

Kyrill

> 2019-02-17  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR bootstrap/88714
> 	* config/arm/arm.md (*arm_movdi, *movdf_soft_insn): Use "r" instead of
> 	"q" constraint.
> 	* config/arm/vfp.md (*movdi_vfp): Likewise.
> 	* config/arm/ldrdstrd.md (*arm_ldrd, *arm_strd): Use "r" instead of
> 	"q" constraint for operands[0].
>
> --- gcc/config/arm/arm.md.jj	2019-01-31 00:26:04.417738975 +0100
> +++ gcc/config/arm/arm.md	2019-02-11 12:02:32.778707056 +0100
> @@ -5817,8 +5817,8 @@ (define_expand "movdi"
>   )
>   
>   (define_insn "*arm_movdi"
> -  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, q, m")
> -	(match_operand:DI 1 "di_operand"              "rDa,Db,Dc,mi,q"))]
> +  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r, r, r, r, m")
> +	(match_operand:DI 1 "di_operand"              "rDa,Db,Dc,mi,r"))]
>     "TARGET_32BIT
>      && !(TARGET_HARD_FLOAT)
>      && !TARGET_IWMMXT
> @@ -7102,8 +7102,8 @@ (define_expand "reload_outdf"
>   )
>   
>   (define_insn "*movdf_soft_insn"
> -  [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,q,m")
> -	(match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,q"))]
> +  [(set (match_operand:DF 0 "nonimmediate_soft_df_operand" "=r,r,r,r,m")
> +	(match_operand:DF 1 "soft_df_operand" "rDa,Db,Dc,mF,r"))]
>     "TARGET_32BIT && TARGET_SOFT_FLOAT
>      && (   register_operand (operands[0], DFmode)
>          || register_operand (operands[1], DFmode))"
> --- gcc/config/arm/vfp.md.jj	2019-01-31 00:26:04.312740661 +0100
> +++ gcc/config/arm/vfp.md	2019-02-11 12:03:13.232045976 +0100
> @@ -307,8 +307,8 @@ (define_insn "*thumb2_movsi_vfp"
>   ;; DImode moves
>   
>   (define_insn "*movdi_vfp"
> -  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,q,q,m,w,!r,w,w, Uv")
> -	(match_operand:DI 1 "di_operand"	      "r,rDa,Db,Dc,mi,mi,q,r,w,w,UvTu,w"))]
> +  [(set (match_operand:DI 0 "nonimmediate_di_operand" "=r,r,r,r,r,r,m,w,!r,w,w, Uv")
> +	(match_operand:DI 1 "di_operand"	      "r,rDa,Db,Dc,mi,mi,r,r,w,w,UvTu,w"))]
>     "TARGET_32BIT && TARGET_HARD_FLOAT
>      && (   register_operand (operands[0], DImode)
>          || register_operand (operands[1], DImode))
> --- gcc/config/arm/ldrdstrd.md.jj	2019-02-11 11:39:39.977125795 +0100
> +++ gcc/config/arm/ldrdstrd.md	2019-02-11 12:03:57.978314745 +0100
> @@ -157,7 +157,7 @@
>   ;; We use gen_operands_ldrd_strd() with a modify argument as false so that the
>   ;; operands are not changed.
>   (define_insn "*arm_ldrd"
> -  [(parallel [(set (match_operand:SI 0 "s_register_operand" "=q")
> +  [(parallel [(set (match_operand:SI 0 "s_register_operand" "=r")
>   		   (match_operand:SI 2 "memory_operand" "m"))
>   	      (set (match_operand:SI 1 "s_register_operand" "=q")
>   		   (match_operand:SI 3 "memory_operand" "m"))])]
> @@ -178,7 +178,7 @@
>   
>   (define_insn "*arm_strd"
>     [(parallel [(set (match_operand:SI 2 "memory_operand" "=m")
> -		   (match_operand:SI 0 "s_register_operand" "q"))
> +		   (match_operand:SI 0 "s_register_operand" "r"))
>   	      (set (match_operand:SI 3 "memory_operand" "=m")
>   		   (match_operand:SI 1 "s_register_operand" "q"))])]
>     "TARGET_LDRD && TARGET_ARM && reload_completed
>
>
> 	Jakub



More information about the Gcc-patches mailing list