Message ID | 87wpb5alq1.fsf@e105548-lin.cambridge.arm.com |
---|---|
State | New |
Headers | show |
On 31/03/17 09:34, Richard Sandiford wrote: > The movsi and movdi constraints allowed the source to be any > absolute symbolic expression ("S"). That's OK for operands that > have already been vetted by the aarch64_mov_operand predicate but > causes problems if the register allocator substitutes an equivalence > (the usual "the constraints can't accept more than the predicates" > restriction). > > Although all other uses of "S" in the backend are redundant and could > in principle be removed, "S" itself is a publicly-documented constraint > and so we'd have to keep its definition. This patch therefore adds a > new "Usa" constraint for legitimate absolute address operands. > > I saw this for a large testcase in which an equivalence was used > for a label_ref jump table. It's not something that can be cut > down easily or that would give a robust regression test. > > I don't think this is a regression, so maybe we don't want it for GCC 7. > > Tested on aarch64-linux-gnu. OK to install? > OK. R. > Thanks, > Richard > > > gcc/ > * config/aarch64/constraints.md (Usa): New constraint. > * config/aarch64/aarch64.md (*movsi_aarch64, *movdi_aarch64): Use it. > > diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md > index 3717edf..260bd64 100644 > --- a/gcc/config/aarch64/aarch64.md > +++ b/gcc/config/aarch64/aarch64.md > @@ -1074,7 +1074,7 @@ > > (define_insn_and_split "*movsi_aarch64" > [(set (match_operand:SI 0 "nonimmediate_operand" "=r,k,r,r,r,r ,r,*w,m, m,r,r ,*w, r,*w") > - (match_operand:SI 1 "aarch64_mov_operand" " r,r,k,M,n,Dv,m, m,rZ,*w,S,Ush,rZ,*w,*w"))] > + (match_operand:SI 1 "aarch64_mov_operand" " r,r,k,M,n,Dv,m, m,rZ,*w,Usa,Ush,rZ,*w,*w"))] > "(register_operand (operands[0], SImode) > || aarch64_reg_or_zero (operands[1], SImode))" > "@ > @@ -1108,7 +1108,7 @@ > > (define_insn_and_split "*movdi_aarch64" > [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,r ,r,*w,m, m,r,r, *w, r,*w,w") > - (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,n,Dv,m, m,rZ,*w,S,Ush,rZ,*w,*w,Dd"))] > + (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,n,Dv,m, m,rZ,*w,Usa,Ush,rZ,*w,*w,Dd"))] > "(register_operand (operands[0], DImode) > || aarch64_reg_or_zero (operands[1], DImode))" > "@ > diff --git a/gcc/config/aarch64/constraints.md b/gcc/config/aarch64/constraints.md > index b77e096..5852a42 100644 > --- a/gcc/config/aarch64/constraints.md > +++ b/gcc/config/aarch64/constraints.md > @@ -104,6 +104,14 @@ > (and (match_code "high") > (match_test "aarch64_valid_symref (XEXP (op, 0), GET_MODE (XEXP (op, 0)))"))) > > +(define_constraint "Usa" > + "@internal > + A constraint that matches an absolute symbolic address that can be > + loaded by a single ADR." > + (and (match_code "const,symbol_ref,label_ref") > + (match_test "aarch64_symbolic_address_p (op)") > + (match_test "aarch64_mov_operand_p (op, GET_MODE (op))"))) > + > (define_constraint "Uss" > "@internal > A constraint that matches an immediate shift constant in SImode." >
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 3717edf..260bd64 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -1074,7 +1074,7 @@ (define_insn_and_split "*movsi_aarch64" [(set (match_operand:SI 0 "nonimmediate_operand" "=r,k,r,r,r,r ,r,*w,m, m,r,r ,*w, r,*w") - (match_operand:SI 1 "aarch64_mov_operand" " r,r,k,M,n,Dv,m, m,rZ,*w,S,Ush,rZ,*w,*w"))] + (match_operand:SI 1 "aarch64_mov_operand" " r,r,k,M,n,Dv,m, m,rZ,*w,Usa,Ush,rZ,*w,*w"))] "(register_operand (operands[0], SImode) || aarch64_reg_or_zero (operands[1], SImode))" "@ @@ -1108,7 +1108,7 @@ (define_insn_and_split "*movdi_aarch64" [(set (match_operand:DI 0 "nonimmediate_operand" "=r,k,r,r,r,r ,r,*w,m, m,r,r, *w, r,*w,w") - (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,n,Dv,m, m,rZ,*w,S,Ush,rZ,*w,*w,Dd"))] + (match_operand:DI 1 "aarch64_mov_operand" " r,r,k,N,n,Dv,m, m,rZ,*w,Usa,Ush,rZ,*w,*w,Dd"))] "(register_operand (operands[0], DImode) || aarch64_reg_or_zero (operands[1], DImode))" "@ diff --git a/gcc/config/aarch64/constraints.md b/gcc/config/aarch64/constraints.md index b77e096..5852a42 100644 --- a/gcc/config/aarch64/constraints.md +++ b/gcc/config/aarch64/constraints.md @@ -104,6 +104,14 @@ (and (match_code "high") (match_test "aarch64_valid_symref (XEXP (op, 0), GET_MODE (XEXP (op, 0)))"))) +(define_constraint "Usa" + "@internal + A constraint that matches an absolute symbolic address that can be + loaded by a single ADR." + (and (match_code "const,symbol_ref,label_ref") + (match_test "aarch64_symbolic_address_p (op)") + (match_test "aarch64_mov_operand_p (op, GET_MODE (op))"))) + (define_constraint "Uss" "@internal A constraint that matches an immediate shift constant in SImode."