Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Richard Earnshaw
On 28/08/2020 16:36, Christophe Lyon via Gcc-patches wrote:
> On Fri, 28 Aug 2020 at 16:27, Richard Earnshaw
>  wrote:
>>
>> On 28/08/2020 14:24, Christophe Lyon via Gcc-patches wrote:
>>> On Fri, 28 Aug 2020 at 14:00, Richard Earnshaw
>>>  wrote:

 On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
> In comment 14 from PR94538, it was suggested to switch off jump tables
> on thumb-1 cores when using -mpure-code, like we already do for thumb-2.
>
> This is what this patch does, and also restores the previous value of
> CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
> this.
>
> It also adds a new test, since the existing no-casesi.c did not catch
> this problem.
>
> Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
> -mfloat-abi=soft, no regression and the new test passes (and fails
> without the fix).
>
> 2020-08-27  Christophe Lyon  
>
>   gcc/
>   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
>   -mpure-code.
>   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.
>
>   gcc/testsuite/
>   * gcc.target/arm/pure-code/pr96768.c: New test.
> ---
>  gcc/config/arm/arm.h |  5 ++---
>  gcc/config/arm/thumb1.md |  2 +-
>  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 
> +
>  3 files changed, 24 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
>
> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> index 3887c51..7d43721 100644
> --- a/gcc/config/arm/arm.h
> +++ b/gcc/config/arm/arm.h
> @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
> for the index in the tablejump instruction.  */
>  #define CASE_VECTOR_MODE Pmode
>
> -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2  
> \
> +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2   
> \
> || (TARGET_THUMB1 \
> -   && (optimize_size || flag_pic)))  \
> -  && (!target_pure_code))
> +   && (optimize_size || flag_pic)))
>
>
>  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
> diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
> index f0129db..602039e 100644
> --- a/gcc/config/arm/thumb1.md
> +++ b/gcc/config/arm/thumb1.md
> @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
>  (define_expand "tablejump"
>[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
> (use (label_ref (match_operand 1 "" "")))])]
> -  "TARGET_THUMB1"
> +  "TARGET_THUMB1 && !target_pure_code"
>"
>if (flag_pic)
>  {
> diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
> b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> new file mode 100644
> index 000..fd4cad5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mpure-code" } */
> +
> +int f2 (int x, int y)
> +{
> +  switch (x)
> +{
> +case 0: return y + 0;
> +case 1: return y + 1;
> +case 2: return y + 2;
> +case 3: return y + 3;
> +case 4: return y + 4;
> +case 5: return y + 5;
> +}
> +  return y;
> +}
> +
> +/* We do not want any load from literal pool, but accept loads from r7
> +   (frame pointer, used at -O0).  */
> +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } 
> */
> +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */
>

 Having switch tables is only a problem if they are embedded in the .text
 segment.  But the case you show in the PR has them in the .rodata
 segment, so is this really necessary?

>>>
>>> Well, in the original PR94538, comment #14, Wilco said this was the best 
>>> option.
>>>
>>
>> If the choice were not really a choice (ie pure code could not use
>> switch tables and still be pure) yes, it would be the case.  But that
>> isn't the case.
> 
> OK thanks, that was my initial impression.
> 
> So it seems this PR is actually not-a-bug/invalid?
> 
> 
>>
>> GCC already knows generally when using jump sequences is going to be
>> better than switch tables and when tables are likely to be better.  It
>> can even produce a meld of the two when appropriate, it can even take
>> into account whether or not we are optimizing for size.  So we shouldn't
>> be just ride rough-shod over those choices.  Pure code doesn't really
>> change the balance.
> 
> 
> ... or 

Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Christophe Lyon via Gcc-patches
On Fri, 28 Aug 2020 at 16:27, Richard Earnshaw
 wrote:
>
> On 28/08/2020 14:24, Christophe Lyon via Gcc-patches wrote:
> > On Fri, 28 Aug 2020 at 14:00, Richard Earnshaw
> >  wrote:
> >>
> >> On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
> >>> In comment 14 from PR94538, it was suggested to switch off jump tables
> >>> on thumb-1 cores when using -mpure-code, like we already do for thumb-2.
> >>>
> >>> This is what this patch does, and also restores the previous value of
> >>> CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
> >>> this.
> >>>
> >>> It also adds a new test, since the existing no-casesi.c did not catch
> >>> this problem.
> >>>
> >>> Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
> >>> -mfloat-abi=soft, no regression and the new test passes (and fails
> >>> without the fix).
> >>>
> >>> 2020-08-27  Christophe Lyon  
> >>>
> >>>   gcc/
> >>>   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
> >>>   -mpure-code.
> >>>   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.
> >>>
> >>>   gcc/testsuite/
> >>>   * gcc.target/arm/pure-code/pr96768.c: New test.
> >>> ---
> >>>  gcc/config/arm/arm.h |  5 ++---
> >>>  gcc/config/arm/thumb1.md |  2 +-
> >>>  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 
> >>> +
> >>>  3 files changed, 24 insertions(+), 4 deletions(-)
> >>>  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> >>>
> >>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> >>> index 3887c51..7d43721 100644
> >>> --- a/gcc/config/arm/arm.h
> >>> +++ b/gcc/config/arm/arm.h
> >>> @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
> >>> for the index in the tablejump instruction.  */
> >>>  #define CASE_VECTOR_MODE Pmode
> >>>
> >>> -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2  
> >>> \
> >>> +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2   
> >>> \
> >>> || (TARGET_THUMB1 \
> >>> -   && (optimize_size || flag_pic)))  \
> >>> -  && (!target_pure_code))
> >>> +   && (optimize_size || flag_pic)))
> >>>
> >>>
> >>>  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
> >>> diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
> >>> index f0129db..602039e 100644
> >>> --- a/gcc/config/arm/thumb1.md
> >>> +++ b/gcc/config/arm/thumb1.md
> >>> @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
> >>>  (define_expand "tablejump"
> >>>[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
> >>> (use (label_ref (match_operand 1 "" "")))])]
> >>> -  "TARGET_THUMB1"
> >>> +  "TARGET_THUMB1 && !target_pure_code"
> >>>"
> >>>if (flag_pic)
> >>>  {
> >>> diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
> >>> b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> >>> new file mode 100644
> >>> index 000..fd4cad5
> >>> --- /dev/null
> >>> +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> >>> @@ -0,0 +1,21 @@
> >>> +/* { dg-do compile } */
> >>> +/* { dg-options "-mpure-code" } */
> >>> +
> >>> +int f2 (int x, int y)
> >>> +{
> >>> +  switch (x)
> >>> +{
> >>> +case 0: return y + 0;
> >>> +case 1: return y + 1;
> >>> +case 2: return y + 2;
> >>> +case 3: return y + 3;
> >>> +case 4: return y + 4;
> >>> +case 5: return y + 5;
> >>> +}
> >>> +  return y;
> >>> +}
> >>> +
> >>> +/* We do not want any load from literal pool, but accept loads from r7
> >>> +   (frame pointer, used at -O0).  */
> >>> +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } 
> >>> */
> >>> +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */
> >>>
> >>
> >> Having switch tables is only a problem if they are embedded in the .text
> >> segment.  But the case you show in the PR has them in the .rodata
> >> segment, so is this really necessary?
> >>
> >
> > Well, in the original PR94538, comment #14, Wilco said this was the best 
> > option.
> >
>
> If the choice were not really a choice (ie pure code could not use
> switch tables and still be pure) yes, it would be the case.  But that
> isn't the case.

OK thanks, that was my initial impression.

So it seems this PR is actually not-a-bug/invalid?


>
> GCC already knows generally when using jump sequences is going to be
> better than switch tables and when tables are likely to be better.  It
> can even produce a meld of the two when appropriate, it can even take
> into account whether or not we are optimizing for size.  So we shouldn't
> be just ride rough-shod over those choices.  Pure code doesn't really
> change the balance.


... or should the PR be the other way around and request to improve how such
cases are handled for 

Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Richard Earnshaw
On 28/08/2020 15:27, Richard Earnshaw wrote:
> On 28/08/2020 14:24, Christophe Lyon via Gcc-patches wrote:
>> On Fri, 28 Aug 2020 at 14:00, Richard Earnshaw
>>  wrote:
>>>
>>> On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
 In comment 14 from PR94538, it was suggested to switch off jump tables
 on thumb-1 cores when using -mpure-code, like we already do for thumb-2.

 This is what this patch does, and also restores the previous value of
 CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
 this.

 It also adds a new test, since the existing no-casesi.c did not catch
 this problem.

 Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
 -mfloat-abi=soft, no regression and the new test passes (and fails
 without the fix).

 2020-08-27  Christophe Lyon  

   gcc/
   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
   -mpure-code.
   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.

   gcc/testsuite/
   * gcc.target/arm/pure-code/pr96768.c: New test.
 ---
  gcc/config/arm/arm.h |  5 ++---
  gcc/config/arm/thumb1.md |  2 +-
  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 
 +
  3 files changed, 24 insertions(+), 4 deletions(-)
  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c

 diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
 index 3887c51..7d43721 100644
 --- a/gcc/config/arm/arm.h
 +++ b/gcc/config/arm/arm.h
 @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
 for the index in the tablejump instruction.  */
  #define CASE_VECTOR_MODE Pmode

 -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2   
\
 +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2
\
 || (TARGET_THUMB1 \
 -   && (optimize_size || flag_pic)))  \
 -  && (!target_pure_code))
 +   && (optimize_size || flag_pic)))


  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
 diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
 index f0129db..602039e 100644
 --- a/gcc/config/arm/thumb1.md
 +++ b/gcc/config/arm/thumb1.md
 @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
  (define_expand "tablejump"
[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
 (use (label_ref (match_operand 1 "" "")))])]
 -  "TARGET_THUMB1"
 +  "TARGET_THUMB1 && !target_pure_code"
"
if (flag_pic)
  {
 diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
 b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
 new file mode 100644
 index 000..fd4cad5
 --- /dev/null
 +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
 @@ -0,0 +1,21 @@
 +/* { dg-do compile } */
 +/* { dg-options "-mpure-code" } */
 +
 +int f2 (int x, int y)
 +{
 +  switch (x)
 +{
 +case 0: return y + 0;
 +case 1: return y + 1;
 +case 2: return y + 2;
 +case 3: return y + 3;
 +case 4: return y + 4;
 +case 5: return y + 5;
 +}
 +  return y;
 +}
 +
 +/* We do not want any load from literal pool, but accept loads from r7
 +   (frame pointer, used at -O0).  */
 +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } 
 */
 +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */

>>>
>>> Having switch tables is only a problem if they are embedded in the .text
>>> segment.  But the case you show in the PR has them in the .rodata
>>> segment, so is this really necessary?
>>>
>>
>> Well, in the original PR94538, comment #14, Wilco said this was the best 
>> option.
>>
> 
> If the choice were not really a choice (ie pure code could not use
> switch tables and still be pure) yes, it would be the case.  But that
> isn't the case.
> 
> GCC already knows generally when using jump sequences is going to be
> better than switch tables and when tables are likely to be better.  It
> can even produce a meld of the two when appropriate, it can even take
> into account whether or not we are optimizing for size.  So we shouldn't
> be just ride rough-shod over those choices.  Pure code doesn't really
> change the balance.
> 
> R.
> 
>>> R.
> 

Also note that it would be possible to compress the data tables in a
similar way to the aarch64 port; there's no need for the entries to be
32 bits most of the time.  It just needs someone to do the work.

R.


Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Richard Earnshaw
On 28/08/2020 14:24, Christophe Lyon via Gcc-patches wrote:
> On Fri, 28 Aug 2020 at 14:00, Richard Earnshaw
>  wrote:
>>
>> On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
>>> In comment 14 from PR94538, it was suggested to switch off jump tables
>>> on thumb-1 cores when using -mpure-code, like we already do for thumb-2.
>>>
>>> This is what this patch does, and also restores the previous value of
>>> CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
>>> this.
>>>
>>> It also adds a new test, since the existing no-casesi.c did not catch
>>> this problem.
>>>
>>> Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
>>> -mfloat-abi=soft, no regression and the new test passes (and fails
>>> without the fix).
>>>
>>> 2020-08-27  Christophe Lyon  
>>>
>>>   gcc/
>>>   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
>>>   -mpure-code.
>>>   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.
>>>
>>>   gcc/testsuite/
>>>   * gcc.target/arm/pure-code/pr96768.c: New test.
>>> ---
>>>  gcc/config/arm/arm.h |  5 ++---
>>>  gcc/config/arm/thumb1.md |  2 +-
>>>  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 +
>>>  3 files changed, 24 insertions(+), 4 deletions(-)
>>>  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
>>>
>>> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
>>> index 3887c51..7d43721 100644
>>> --- a/gcc/config/arm/arm.h
>>> +++ b/gcc/config/arm/arm.h
>>> @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
>>> for the index in the tablejump instruction.  */
>>>  #define CASE_VECTOR_MODE Pmode
>>>
>>> -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2
>>>   \
>>> +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 
>>>   \
>>> || (TARGET_THUMB1 \
>>> -   && (optimize_size || flag_pic)))  \
>>> -  && (!target_pure_code))
>>> +   && (optimize_size || flag_pic)))
>>>
>>>
>>>  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
>>> diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
>>> index f0129db..602039e 100644
>>> --- a/gcc/config/arm/thumb1.md
>>> +++ b/gcc/config/arm/thumb1.md
>>> @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
>>>  (define_expand "tablejump"
>>>[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
>>> (use (label_ref (match_operand 1 "" "")))])]
>>> -  "TARGET_THUMB1"
>>> +  "TARGET_THUMB1 && !target_pure_code"
>>>"
>>>if (flag_pic)
>>>  {
>>> diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
>>> b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
>>> new file mode 100644
>>> index 000..fd4cad5
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
>>> @@ -0,0 +1,21 @@
>>> +/* { dg-do compile } */
>>> +/* { dg-options "-mpure-code" } */
>>> +
>>> +int f2 (int x, int y)
>>> +{
>>> +  switch (x)
>>> +{
>>> +case 0: return y + 0;
>>> +case 1: return y + 1;
>>> +case 2: return y + 2;
>>> +case 3: return y + 3;
>>> +case 4: return y + 4;
>>> +case 5: return y + 5;
>>> +}
>>> +  return y;
>>> +}
>>> +
>>> +/* We do not want any load from literal pool, but accept loads from r7
>>> +   (frame pointer, used at -O0).  */
>>> +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } */
>>> +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */
>>>
>>
>> Having switch tables is only a problem if they are embedded in the .text
>> segment.  But the case you show in the PR has them in the .rodata
>> segment, so is this really necessary?
>>
> 
> Well, in the original PR94538, comment #14, Wilco said this was the best 
> option.
> 

If the choice were not really a choice (ie pure code could not use
switch tables and still be pure) yes, it would be the case.  But that
isn't the case.

GCC already knows generally when using jump sequences is going to be
better than switch tables and when tables are likely to be better.  It
can even produce a meld of the two when appropriate, it can even take
into account whether or not we are optimizing for size.  So we shouldn't
be just ride rough-shod over those choices.  Pure code doesn't really
change the balance.

R.

>> R.



Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Christophe Lyon via Gcc-patches
On Fri, 28 Aug 2020 at 14:00, Richard Earnshaw
 wrote:
>
> On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
> > In comment 14 from PR94538, it was suggested to switch off jump tables
> > on thumb-1 cores when using -mpure-code, like we already do for thumb-2.
> >
> > This is what this patch does, and also restores the previous value of
> > CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
> > this.
> >
> > It also adds a new test, since the existing no-casesi.c did not catch
> > this problem.
> >
> > Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
> > -mfloat-abi=soft, no regression and the new test passes (and fails
> > without the fix).
> >
> > 2020-08-27  Christophe Lyon  
> >
> >   gcc/
> >   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
> >   -mpure-code.
> >   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.
> >
> >   gcc/testsuite/
> >   * gcc.target/arm/pure-code/pr96768.c: New test.
> > ---
> >  gcc/config/arm/arm.h |  5 ++---
> >  gcc/config/arm/thumb1.md |  2 +-
> >  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 +
> >  3 files changed, 24 insertions(+), 4 deletions(-)
> >  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> >
> > diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> > index 3887c51..7d43721 100644
> > --- a/gcc/config/arm/arm.h
> > +++ b/gcc/config/arm/arm.h
> > @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
> > for the index in the tablejump instruction.  */
> >  #define CASE_VECTOR_MODE Pmode
> >
> > -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2
> >   \
> > +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2 
> >   \
> > || (TARGET_THUMB1 \
> > -   && (optimize_size || flag_pic)))  \
> > -  && (!target_pure_code))
> > +   && (optimize_size || flag_pic)))
> >
> >
> >  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
> > diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
> > index f0129db..602039e 100644
> > --- a/gcc/config/arm/thumb1.md
> > +++ b/gcc/config/arm/thumb1.md
> > @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
> >  (define_expand "tablejump"
> >[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
> > (use (label_ref (match_operand 1 "" "")))])]
> > -  "TARGET_THUMB1"
> > +  "TARGET_THUMB1 && !target_pure_code"
> >"
> >if (flag_pic)
> >  {
> > diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
> > b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> > new file mode 100644
> > index 000..fd4cad5
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> > @@ -0,0 +1,21 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-mpure-code" } */
> > +
> > +int f2 (int x, int y)
> > +{
> > +  switch (x)
> > +{
> > +case 0: return y + 0;
> > +case 1: return y + 1;
> > +case 2: return y + 2;
> > +case 3: return y + 3;
> > +case 4: return y + 4;
> > +case 5: return y + 5;
> > +}
> > +  return y;
> > +}
> > +
> > +/* We do not want any load from literal pool, but accept loads from r7
> > +   (frame pointer, used at -O0).  */
> > +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } */
> > +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */
> >
>
> Having switch tables is only a problem if they are embedded in the .text
> segment.  But the case you show in the PR has them in the .rodata
> segment, so is this really necessary?
>

Well, in the original PR94538, comment #14, Wilco said this was the best option.

> R.


Re: [PATCH] arm: Fix switch tables for thumb-1 with -mpure-code [PR96768]

2020-08-28 Thread Richard Earnshaw
On 27/08/2020 14:27, Christophe Lyon via Gcc-patches wrote:
> In comment 14 from PR94538, it was suggested to switch off jump tables
> on thumb-1 cores when using -mpure-code, like we already do for thumb-2.
> 
> This is what this patch does, and also restores the previous value of
> CASE_VECTOR_PC_RELATIVE since it was not the right way of handling
> this.
> 
> It also adds a new test, since the existing no-casesi.c did not catch
> this problem.
> 
> Tested by running the whole testsuite with -mpure-code -mcpu=cortex-m0
> -mfloat-abi=soft, no regression and the new test passes (and fails
> without the fix).
> 
> 2020-08-27  Christophe Lyon  
> 
>   gcc/
>   * config/arm/arm.h (CASE_VECTOR_PC_RELATIVE): Remove condition on
>   -mpure-code.
>   * config/arm/thumb1.md (tablejump): Disable when -mpure-code.
> 
>   gcc/testsuite/
>   * gcc.target/arm/pure-code/pr96768.c: New test.
> ---
>  gcc/config/arm/arm.h |  5 ++---
>  gcc/config/arm/thumb1.md |  2 +-
>  gcc/testsuite/gcc.target/arm/pure-code/pr96768.c | 21 +
>  3 files changed, 24 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> 
> diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
> index 3887c51..7d43721 100644
> --- a/gcc/config/arm/arm.h
> +++ b/gcc/config/arm/arm.h
> @@ -1975,10 +1975,9 @@ enum arm_auto_incmodes
> for the index in the tablejump instruction.  */
>  #define CASE_VECTOR_MODE Pmode
>  
> -#define CASE_VECTOR_PC_RELATIVE ((TARGET_THUMB2  
> \
> +#define CASE_VECTOR_PC_RELATIVE (TARGET_THUMB2   
> \
> || (TARGET_THUMB1 \
> -   && (optimize_size || flag_pic)))  \
> -  && (!target_pure_code))
> +   && (optimize_size || flag_pic)))
>  
>  
>  #define CASE_VECTOR_SHORTEN_MODE(min, max, body) \
> diff --git a/gcc/config/arm/thumb1.md b/gcc/config/arm/thumb1.md
> index f0129db..602039e 100644
> --- a/gcc/config/arm/thumb1.md
> +++ b/gcc/config/arm/thumb1.md
> @@ -2012,7 +2012,7 @@ (define_insn "*epilogue_insns"
>  (define_expand "tablejump"
>[(parallel [(set (pc) (match_operand:SI 0 "register_operand"))
> (use (label_ref (match_operand 1 "" "")))])]
> -  "TARGET_THUMB1"
> +  "TARGET_THUMB1 && !target_pure_code"
>"
>if (flag_pic)
>  {
> diff --git a/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c 
> b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> new file mode 100644
> index 000..fd4cad5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arm/pure-code/pr96768.c
> @@ -0,0 +1,21 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mpure-code" } */
> +
> +int f2 (int x, int y)
> +{
> +  switch (x)
> +{
> +case 0: return y + 0;
> +case 1: return y + 1;
> +case 2: return y + 2;
> +case 3: return y + 3;
> +case 4: return y + 4;
> +case 5: return y + 5;
> +}
> +  return y;
> +}
> +
> +/* We do not want any load from literal pool, but accept loads from r7
> +   (frame pointer, used at -O0).  */
> +/* { dg-final { scan-assembler-not "ldr\tr\\d+, \\\[r\[0-689\]+\\\]" } } */
> +/* { dg-final { scan-assembler "text,\"0x2006\"" } } */
> 

Having switch tables is only a problem if they are embedded in the .text
segment.  But the case you show in the PR has them in the .rodata
segment, so is this really necessary?

R.