ping?

On Tue, 6 Oct 2020 at 10:30, Christophe Lyon <christophe.l...@linaro.org> wrote:
>
> ping?
>
> On Mon, 28 Sep 2020 at 11:09, Christophe Lyon
> <christophe.l...@linaro.org> wrote:
> >
> > With -mpure-code on v6m (thumb-1), to avoid a useless indirection when
> > building the address of a symbol, we want to consider SYMBOL_REF as a
> > legitimate constant. This way, we build the address using a series of
> > upper/lower relocations instead of loading the address from memory.
> >
> > This patch also fixes a missing "clob" conds attribute for
> > thumb1_movsi_insn, needed because that alternative clobbers the flags.
> >
> > 2020-09-28  Christophe Lyon  <christophe.l...@linaro.org>
> >
> >         gcc/
> >         * config/arm/arm.c (thumb_legitimate_constant_p): Add support for
> >         disabled literal pool in thumb-1.
> >         * config/arm/thumb1.md (thumb1_movsi_symbol_ref): Remove.
> >         (*thumb1_movsi_insn): Add support for SYMBOL_REF with -mpure-code.
> >
> >         gcc/testsuite
> >         * gcc.target/arm/pure-code/pr96767.c: New test.
> > ---
> >  gcc/config/arm/arm.c                             |   6 ++
> >  gcc/config/arm/thumb1.md                         | 102 
> > +++++++++++------------
> >  gcc/testsuite/gcc.target/arm/pure-code/pr96767.c |  10 +++
> >  3 files changed, 63 insertions(+), 55 deletions(-)
> >  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96767.c
> >
> > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > index 022ef6c..abe357e 100644
> > --- a/gcc/config/arm/arm.c
> > +++ b/gcc/config/arm/arm.c
> > @@ -9485,6 +9485,12 @@ thumb_legitimate_constant_p (machine_mode mode 
> > ATTRIBUTE_UNUSED, rtx x)
> >           || CONST_DOUBLE_P (x)
> >           || CONSTANT_ADDRESS_P (x)
> >           || (TARGET_HAVE_MOVT && GET_CODE (x) == SYMBOL_REF)
> > +         /* On Thumb-1 without MOVT/MOVW and literal pool disabled,
> > +            we build the symbol address with upper/lower
> > +            relocations.  */
> > +         || (TARGET_THUMB1
> > +             && GET_CODE (x) == SYMBOL_REF
> > +             && arm_disable_literal_pool)
> >           || flag_pic);
> >  }
> >
> > diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
> > index 4a59d87..3dedcae 100644
> > --- a/gcc/config/arm/thumb1.md
> > +++ b/gcc/config/arm/thumb1.md
> > @@ -43,27 +43,6 @@
> >
> >
> >
> > -(define_insn "thumb1_movsi_symbol_ref"
> > -  [(set (match_operand:SI 0 "register_operand" "=l")
> > -       (match_operand:SI 1 "general_operand" ""))
> > -   ]
> > -  "TARGET_THUMB1
> > -   && arm_disable_literal_pool
> > -   && GET_CODE (operands[1]) == SYMBOL_REF"
> > -  "*
> > -  output_asm_insn (\"movs\\t%0, #:upper8_15:%1\", operands);
> > -  output_asm_insn (\"lsls\\t%0, #8\", operands);
> > -  output_asm_insn (\"adds\\t%0, #:upper0_7:%1\", operands);
> > -  output_asm_insn (\"lsls\\t%0, #8\", operands);
> > -  output_asm_insn (\"adds\\t%0, #:lower8_15:%1\", operands);
> > -  output_asm_insn (\"lsls\\t%0, #8\", operands);
> > -  output_asm_insn (\"adds\\t%0, #:lower0_7:%1\", operands);
> > -  return \"\";
> > -  "
> > -  [(set_attr "length" "14")
> > -   (set_attr "conds" "clob")]
> > -)
> > -
> >  (define_insn "*thumb1_adddi3"
> >    [(set (match_operand:DI          0 "register_operand" "=l")
> >         (plus:DI (match_operand:DI 1 "register_operand" "%0")
> > @@ -696,40 +675,53 @@ (define_insn "*thumb1_movsi_insn"
> >        case 7:
> >        /* pure-code alternative: build the constant byte by byte,
> >          instead of loading it from a constant pool.  */
> > -       {
> > -         int i;
> > -         HOST_WIDE_INT op1 = INTVAL (operands[1]);
> > -         bool mov_done_p = false;
> > -         rtx ops[2];
> > -         ops[0] = operands[0];
> > -
> > -         /* Emit upper 3 bytes if needed.  */
> > -         for (i = 0; i < 3; i++)
> > -           {
> > -              int byte = (op1 >> (8 * (3 - i))) & 0xff;
> > -
> > -             if (byte)
> > -               {
> > -                 ops[1] = GEN_INT (byte);
> > -                 if (mov_done_p)
> > -                   output_asm_insn ("adds\t%0, %1", ops);
> > -                 else
> > -                   output_asm_insn ("movs\t%0, %1", ops);
> > -                 mov_done_p = true;
> > -               }
> > -
> > -             if (mov_done_p)
> > -               output_asm_insn ("lsls\t%0, #8", ops);
> > -           }
> > +       if (GET_CODE (operands[1]) == SYMBOL_REF)
> > +         {
> > +           output_asm_insn (\"movs\\t%0, #:upper8_15:%1\", operands);
> > +           output_asm_insn (\"lsls\\t%0, #8\", operands);
> > +           output_asm_insn (\"adds\\t%0, #:upper0_7:%1\", operands);
> > +           output_asm_insn (\"lsls\\t%0, #8\", operands);
> > +           output_asm_insn (\"adds\\t%0, #:lower8_15:%1\", operands);
> > +           output_asm_insn (\"lsls\\t%0, #8\", operands);
> > +           output_asm_insn (\"adds\\t%0, #:lower0_7:%1\", operands);
> > +           return \"\";
> > +         }
> > +       else
> > +         {
> > +           int i;
> > +           HOST_WIDE_INT op1 = INTVAL (operands[1]);
> > +           bool mov_done_p = false;
> > +           rtx ops[2];
> > +           ops[0] = operands[0];
> > +
> > +           /* Emit upper 3 bytes if needed.  */
> > +           for (i = 0; i < 3; i++)
> > +             {
> > +               int byte = (op1 >> (8 * (3 - i))) & 0xff;
> > +
> > +               if (byte)
> > +                 {
> > +                   ops[1] = GEN_INT (byte);
> > +                   if (mov_done_p)
> > +                     output_asm_insn ("adds\t%0, %1", ops);
> > +                   else
> > +                     output_asm_insn ("movs\t%0, %1", ops);
> > +                   mov_done_p = true;
> > +                 }
> > +
> > +               if (mov_done_p)
> > +                 output_asm_insn ("lsls\t%0, #8", ops);
> > +             }
> > +
> > +           /* Emit lower byte if needed.  */
> > +           ops[1] = GEN_INT (op1 & 0xff);
> > +           if (!mov_done_p)
> > +             output_asm_insn ("movs\t%0, %1", ops);
> > +           else if (op1 & 0xff)
> > +             output_asm_insn ("adds\t%0, %1", ops);
> > +           return "";
> > +         }
> >
> > -         /* Emit lower byte if needed.  */
> > -         ops[1] = GEN_INT (op1 & 0xff);
> > -         if (!mov_done_p)
> > -           output_asm_insn ("movs\t%0, %1", ops);
> > -         else if (op1 & 0xff)
> > -           output_asm_insn ("adds\t%0, %1", ops);
> > -         return "";
> > -       }
> >        case 8: return "ldr\t%0, %1";
> >        case 9: return "str\t%1, %0";
> >        case 10: return "mov\t%0, %1";
> > @@ -740,7 +732,7 @@ (define_insn "*thumb1_movsi_insn"
> >     (set_attr "pool_range" "*,*,*,*,*,*,*, *,1018,*,*")
> >     (set_attr "arch" "t1,t1,v8mb,t1,t1,t1,t1,t1,t1,t1,t1")
> >     (set_attr "required_for_purecode" "no,no,no,no,no,no,no,yes,no,no,no")
> > -   (set_attr "conds" 
> > "set,clob,nocond,*,*,nocond,nocond,nocond,nocond,nocond,nocond")])
> > +   (set_attr "conds" 
> > "set,clob,nocond,*,*,nocond,nocond,clob,nocond,nocond,nocond")])
> >
> >  ; Split the load of 64-bit constant into two loads for high and low 32-bit 
> > parts respectively
> >  ; to see if we can load them in fewer instructions or fewer cycles.
> > diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96767.c 
> > b/gcc/testsuite/gcc.target/arm/pure-code/pr96767.c
> > new file mode 100644
> > index 0000000..cb3ee68
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96767.c
> > @@ -0,0 +1,10 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-mpure-code" } */
> > +
> > +int x;
> > +int f1 (void) { return x; }
> > +
> > +/* We expect only one indirect load like ldr r3, [r3]. In some
> > +   configurations there is an additional ldr rX, [sp], #4 which is not
> > +   related to what we check here, so make sure not to match it.  */
> > +/* { dg-final { scan-assembler-times "ldr\tr\[0-9\]+, \\\[r\[0-9\]+\\\]" 1 
> > } } */
> > --
> > 2.7.4
> >

Reply via email to