diff mbox

[PATCHv2,0/7] ARC: Add support for nps400 variant

Message ID 20160503105601.GB9646@embecosm.com
State New
Headers show

Commit Message

Andrew Burgess May 3, 2016, 10:56 a.m. UTC
* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2016-05-02 09:02:16 +0000]:

> Please also consider to address also the following warnings introduced:
> 
> mainline/gcc/gcc/config/arc/arc.md:888: warning: source missing a mode?
> mainline/gcc/gcc/config/arc/arc.md:906: warning: source missing a mode?
> mainline/gcc/gcc/config/arc/arc.md:921: warning: source missing a mode?
> mainline/gcc/gcc/config/arc/arc.md:6146: warning: source missing a mode?
> 

Here's a revised fixup patch that includes addressing these 4
warnings.

Thanks,
Andrew

---

gcc/arc: New peephole2 and little endian arc test fixes

Resolve some test failures introduced for little endian arc as a result
of the recent arc/nps400 additions.

There's a new peephole2 optimisation to merge together two zero_extracts
in order that the movb instruction can be used.

Source operand modes filled in for 3 instruction patterns and a
peephole2 optimisation, to silence build warnings.

One of the test cases is extended so that the test does something
meaningful in both big and little endian arc mode.

Other tests have their expected results updated to reflect improvements
in other areas of GCC.

gcc/ChangeLog:

	* config/arc/arc.md (movb peephole2): New peephole2 to merge two
	zero_extract operations to allow a movb to occur.
	(*tst_bitfield_tst): Add mode to source operand.
	(*tst_bitfield_asr): Likewise.
	(*tst_bitfield): Likewise.
	(bitops peephole2): Likewise.

gcc/testsuite/ChangeLog:

	* gcc.target/arc/movb-1.c: Update little endian arc results.
	* gcc.target/arc/movb-2.c: Likewise.
	* gcc.target/arc/movb-5.c: Likewise.
	* gcc.target/arc/movh_cl-1.c: Extend test to cover little endian
	arc.
---
 gcc/ChangeLog                            |  9 +++++++++
 gcc/config/arc/arc.md                    | 22 ++++++++++++++++++----
 gcc/testsuite/ChangeLog                  |  8 ++++++++
 gcc/testsuite/gcc.target/arc/movb-1.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movb-2.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movb-5.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movh_cl-1.c | 11 +++++++++++
 7 files changed, 49 insertions(+), 7 deletions(-)

Comments

Claudiu Zissulescu May 12, 2016, 11:30 a.m. UTC | #1
On 03/05/16 12:56, Andrew Burgess wrote:
> * Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2016-05-02 09:02:16 +0000]:
>
>> Please also consider to address also the following warnings introduced:
>>
>> mainline/gcc/gcc/config/arc/arc.md:888: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:906: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:921: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:6146: warning: source missing a mode?
>>
>
> Here's a revised fixup patch that includes addressing these 4
> warnings.
>
> Thanks,
> Andrew
>
> ---
>
> gcc/arc: New peephole2 and little endian arc test fixes
>
> Resolve some test failures introduced for little endian arc as a result
> of the recent arc/nps400 additions.
>
> There's a new peephole2 optimisation to merge together two zero_extracts
> in order that the movb instruction can be used.
>
> Source operand modes filled in for 3 instruction patterns and a
> peephole2 optimisation, to silence build warnings.
>
> One of the test cases is extended so that the test does something
> meaningful in both big and little endian arc mode.
>
> Other tests have their expected results updated to reflect improvements
> in other areas of GCC.
>
> gcc/ChangeLog:
>
> 	* config/arc/arc.md (movb peephole2): New peephole2 to merge two
> 	zero_extract operations to allow a movb to occur.
> 	(*tst_bitfield_tst): Add mode to source operand.
> 	(*tst_bitfield_asr): Likewise.
> 	(*tst_bitfield): Likewise.
> 	(bitops peephole2): Likewise.
>
> gcc/testsuite/ChangeLog:
>
> 	* gcc.target/arc/movb-1.c: Update little endian arc results.
> 	* gcc.target/arc/movb-2.c: Likewise.
> 	* gcc.target/arc/movb-5.c: Likewise.
> 	* gcc.target/arc/movh_cl-1.c: Extend test to cover little endian
> 	arc.
> ---
>   gcc/ChangeLog                            |  9 +++++++++
>   gcc/config/arc/arc.md                    | 22 ++++++++++++++++++----
>   gcc/testsuite/ChangeLog                  |  8 ++++++++
>   gcc/testsuite/gcc.target/arc/movb-1.c    |  2 +-
>   gcc/testsuite/gcc.target/arc/movb-2.c    |  2 +-
>   gcc/testsuite/gcc.target/arc/movb-5.c    |  2 +-
>   gcc/testsuite/gcc.target/arc/movh_cl-1.c | 11 +++++++++++
>   7 files changed, 49 insertions(+), 7 deletions(-)
>
> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
> index c61107f..96c1e77 100644
> --- a/gcc/config/arc/arc.md
> +++ b/gcc/config/arc/arc.md
> @@ -879,7 +879,7 @@
>   ; since this is about constants, reload shouldn't care.
>   (define_insn "*tst_bitfield_tst"
>     [(set (match_operand:CC_ZN 0 "cc_set_register" "")
> -	(match_operator 4 "zn_compare_operator"
> +	(match_operator:CC_ZN 4 "zn_compare_operator"
>   	  [(zero_extract:SI
>   	     (match_operand:SI 1 "register_operand"  "c")
>   	     (match_operand:SI 2 "const_int_operand" "n")
> @@ -897,7 +897,7 @@
>   ; Likewise for asr.f.
>   (define_insn "*tst_bitfield_asr"
>     [(set (match_operand:CC_ZN 0 "cc_set_register" "")
> -	(match_operator 4 "zn_compare_operator"
> +	(match_operator:CC_ZN 4 "zn_compare_operator"
>   	  [(zero_extract:SI
>   	     (match_operand:SI 1 "register_operand"  "c")
>   	     (match_operand:SI 2 "const_int_operand" "n")
> @@ -912,7 +912,7 @@
>
>   (define_insn "*tst_bitfield"
>     [(set (match_operand:CC_ZN 0 "cc_set_register" "")
> -	(match_operator 5 "zn_compare_operator"
> +	(match_operator:CC_ZN 5 "zn_compare_operator"
>   	  [(zero_extract:SI
>   	     (match_operand:SI 1 "register_operand" "%Rcqq,c,  c,Rrq,c")
>   	     (match_operand:SI 2 "const_int_operand"    "N,N,  n,Cbn,n")
> @@ -6128,7 +6128,7 @@
>   	(zero_extract:SI (match_dup 1)
>   			 (match_dup 2)
>   			 (match_operand:SI 4 "const_int_operand" "")))
> -   (set (match_dup 1) (match_operand 8))
> +   (set (match_dup 1) (match_operand:SI 8))
>      (set (zero_extract:SI (match_dup 0)
>   			 (match_operand:SI 5 "const_int_operand" "")
>   			 (match_operand:SI 6 "const_int_operand" ""))
> @@ -6144,6 +6144,20 @@
>   		   (zero_extract:SI (match_dup 1) (match_dup 5) (match_dup 7)))])
>      (match_dup 1)])
>
> +(define_peephole2
> +  [(set (match_operand:SI 0 "register_operand" "")
> +        (zero_extract:SI (match_dup 0)
> +			 (match_operand:SI 1 "const_int_operand" "")
> +			 (match_operand:SI 2 "const_int_operand" "")))
> +   (set (zero_extract:SI (match_operand:SI 3 "register_operand" "")
> +			 (match_dup 1)
> +                         (match_dup 2))
> +	(match_dup 0))]
> +  "TARGET_NPS_BITOPS
> +   && !reg_overlap_mentioned_p (operands[0], operands[3])"
> +  [(set (zero_extract:SI (match_dup 3) (match_dup 1) (match_dup 2))
> +        (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2)))])
> +
>   ;; include the arc-FPX instructions
>   (include "fpx.md")
>
> diff --git a/gcc/testsuite/gcc.target/arc/movb-1.c b/gcc/testsuite/gcc.target/arc/movb-1.c
> index 65d4ba4..94d9f5f 100644
> --- a/gcc/testsuite/gcc.target/arc/movb-1.c
> +++ b/gcc/testsuite/gcc.target/arc/movb-1.c
> @@ -10,4 +10,4 @@ f (void)
>     bar.b = foo.b;
>   }
>   /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *5, *3, *8" { target arceb-*-* } } } */
> -/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *19, *21, *8" { target arc-*-* } } } */
> +/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *3, *5, *8" { target arc-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/arc/movb-2.c b/gcc/testsuite/gcc.target/arc/movb-2.c
> index 1ba9976..708f393 100644
> --- a/gcc/testsuite/gcc.target/arc/movb-2.c
> +++ b/gcc/testsuite/gcc.target/arc/movb-2.c
> @@ -9,5 +9,5 @@ f (void)
>   {
>     bar.b = foo.b;
>   }
> -/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *23, *23, *9" { target arc-*-* } } } */
> +/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *7, *7, *9" { target arc-*-* } } } */
>   /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *0, *0, *9" { target arceb-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/arc/movb-5.c b/gcc/testsuite/gcc.target/arc/movb-5.c
> index 9dbe8a1..d285888 100644
> --- a/gcc/testsuite/gcc.target/arc/movb-5.c
> +++ b/gcc/testsuite/gcc.target/arc/movb-5.c
> @@ -9,5 +9,5 @@ f (void)
>   {
>     bar.b = foo.b;
>   }
> -/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *23, *(23|7), *9" { target arc-*-* } } } */
> +/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *7, *7, *9" { target arc-*-* } } } */
>   /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *0, *0, *9" { target arceb-*-* } } } */
> diff --git a/gcc/testsuite/gcc.target/arc/movh_cl-1.c b/gcc/testsuite/gcc.target/arc/movh_cl-1.c
> index 220cd9d..c643481 100644
> --- a/gcc/testsuite/gcc.target/arc/movh_cl-1.c
> +++ b/gcc/testsuite/gcc.target/arc/movh_cl-1.c
> @@ -10,6 +10,9 @@ struct thing
>       {
>         unsigned a : 1;
>         unsigned b : 1;
> +      unsigned c : 28;
> +      unsigned d : 1;
> +      unsigned e : 1;
>       };
>     };
>   };
> @@ -24,4 +27,12 @@ blah ()
>     func (xx.raw);
>   }
>
> +void
> +woof ()
> +{
> +  struct thing xx;
> +  xx.d = xx.e = 1;
> +  func (xx.raw);
> +}
> +
>   /* { dg-final { scan-assembler "movh\.cl r\[0-9\]+,0xc0000000>>16" } } */
>

It seems alright to me, but you need to get Joern approval on this,
Claudiu
Joern Wolfgang Rennecke June 14, 2016, 6:46 p.m. UTC | #2
On 03/05/16 11:56, Andrew Burgess wrote:
> * Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2016-05-02 09:02:16 +0000]:
>
>> Please also consider to address also the following warnings introduced:
>>
>> mainline/gcc/gcc/config/arc/arc.md:888: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:906: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:921: warning: source missing a mode?
>> mainline/gcc/gcc/config/arc/arc.md:6146: warning: source missing a mode?
>>
> Here's a revised fixup patch that includes addressing these 4
> warnings.

This the the wrong approach.

zn_compare_operator is a special predicate that accepts CC_ZNmode as 
well as CC_Zmode.
The point is that some comparison uses need Z and N set, while other are 
OK with just Z.
Not accepting CC_Zmode would cause spurious recognition rejections.

A generator program complaining about a missing mode for an operand with 
a special predicate
is wrong.

from md.texi:
: Predicates written with @code{define_special_predicate} do not get any
: automatic mode checks, and are treated as having special mode handling
: by @command{genrecog}.
Andrew Burgess June 14, 2016, 11:38 p.m. UTC | #3
Joern,

Thanks for taking the time to review the previous patch.

I've revised the original fix-up patch to remove the addition of the
MODE in the zn_compare_operator case as you suggest, this is patch #1.

Patch #2 is an attempt to address you comment:

  A generator program complaining about a missing mode for an operand
  with a special predicate is wrong.

I'm hoping you'll review (and if you like it) merge patch #1.  I'd
appreciate you feedback on patch #2.  I can always repost patch #2 as
a top-level post to the mailing list if you think this is the right
fix, but should get a wider audience.

Thanks,
Andrew

---

Andrew Burgess (2):
  gcc/arc: New peephole2 and little endian arc test fixes
  gcc/genrecog: Don't warn for missing mode on special predicates

 gcc/ChangeLog                            | 11 +++++++++++
 gcc/config/arc/arc.md                    | 16 +++++++++++++++-
 gcc/genrecog.c                           | 22 +++++++++++++++++++---
 gcc/testsuite/ChangeLog                  |  8 ++++++++
 gcc/testsuite/gcc.target/arc/movb-1.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movb-2.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movb-5.c    |  2 +-
 gcc/testsuite/gcc.target/arc/movh_cl-1.c | 11 +++++++++++
 8 files changed, 67 insertions(+), 7 deletions(-)
diff mbox

Patch

diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
index c61107f..96c1e77 100644
--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -879,7 +879,7 @@ 
 ; since this is about constants, reload shouldn't care.
 (define_insn "*tst_bitfield_tst"
   [(set (match_operand:CC_ZN 0 "cc_set_register" "")
-	(match_operator 4 "zn_compare_operator"
+	(match_operator:CC_ZN 4 "zn_compare_operator"
 	  [(zero_extract:SI
 	     (match_operand:SI 1 "register_operand"  "c")
 	     (match_operand:SI 2 "const_int_operand" "n")
@@ -897,7 +897,7 @@ 
 ; Likewise for asr.f.
 (define_insn "*tst_bitfield_asr"
   [(set (match_operand:CC_ZN 0 "cc_set_register" "")
-	(match_operator 4 "zn_compare_operator"
+	(match_operator:CC_ZN 4 "zn_compare_operator"
 	  [(zero_extract:SI
 	     (match_operand:SI 1 "register_operand"  "c")
 	     (match_operand:SI 2 "const_int_operand" "n")
@@ -912,7 +912,7 @@ 
 
 (define_insn "*tst_bitfield"
   [(set (match_operand:CC_ZN 0 "cc_set_register" "")
-	(match_operator 5 "zn_compare_operator"
+	(match_operator:CC_ZN 5 "zn_compare_operator"
 	  [(zero_extract:SI
 	     (match_operand:SI 1 "register_operand" "%Rcqq,c,  c,Rrq,c")
 	     (match_operand:SI 2 "const_int_operand"    "N,N,  n,Cbn,n")
@@ -6128,7 +6128,7 @@ 
 	(zero_extract:SI (match_dup 1)
 			 (match_dup 2)
 			 (match_operand:SI 4 "const_int_operand" "")))
-   (set (match_dup 1) (match_operand 8))
+   (set (match_dup 1) (match_operand:SI 8))
    (set (zero_extract:SI (match_dup 0)
 			 (match_operand:SI 5 "const_int_operand" "")
 			 (match_operand:SI 6 "const_int_operand" ""))
@@ -6144,6 +6144,20 @@ 
 		   (zero_extract:SI (match_dup 1) (match_dup 5) (match_dup 7)))])
    (match_dup 1)])
 
+(define_peephole2
+  [(set (match_operand:SI 0 "register_operand" "")
+        (zero_extract:SI (match_dup 0)
+			 (match_operand:SI 1 "const_int_operand" "")
+			 (match_operand:SI 2 "const_int_operand" "")))
+   (set (zero_extract:SI (match_operand:SI 3 "register_operand" "")
+			 (match_dup 1)
+                         (match_dup 2))
+	(match_dup 0))]
+  "TARGET_NPS_BITOPS
+   && !reg_overlap_mentioned_p (operands[0], operands[3])"
+  [(set (zero_extract:SI (match_dup 3) (match_dup 1) (match_dup 2))
+        (zero_extract:SI (match_dup 0) (match_dup 1) (match_dup 2)))])
+
 ;; include the arc-FPX instructions
 (include "fpx.md")
 
diff --git a/gcc/testsuite/gcc.target/arc/movb-1.c b/gcc/testsuite/gcc.target/arc/movb-1.c
index 65d4ba4..94d9f5f 100644
--- a/gcc/testsuite/gcc.target/arc/movb-1.c
+++ b/gcc/testsuite/gcc.target/arc/movb-1.c
@@ -10,4 +10,4 @@  f (void)
   bar.b = foo.b;
 }
 /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *5, *3, *8" { target arceb-*-* } } } */
-/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *19, *21, *8" { target arc-*-* } } } */
+/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *3, *5, *8" { target arc-*-* } } } */
diff --git a/gcc/testsuite/gcc.target/arc/movb-2.c b/gcc/testsuite/gcc.target/arc/movb-2.c
index 1ba9976..708f393 100644
--- a/gcc/testsuite/gcc.target/arc/movb-2.c
+++ b/gcc/testsuite/gcc.target/arc/movb-2.c
@@ -9,5 +9,5 @@  f (void)
 {
   bar.b = foo.b;
 }
-/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *23, *23, *9" { target arc-*-* } } } */
+/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *7, *7, *9" { target arc-*-* } } } */
 /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *0, *0, *9" { target arceb-*-* } } } */
diff --git a/gcc/testsuite/gcc.target/arc/movb-5.c b/gcc/testsuite/gcc.target/arc/movb-5.c
index 9dbe8a1..d285888 100644
--- a/gcc/testsuite/gcc.target/arc/movb-5.c
+++ b/gcc/testsuite/gcc.target/arc/movb-5.c
@@ -9,5 +9,5 @@  f (void)
 {
   bar.b = foo.b;
 }
-/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *23, *(23|7), *9" { target arc-*-* } } } */
+/* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *7, *7, *9" { target arc-*-* } } } */
 /* { dg-final { scan-assembler "movb\[ \t\]+r\[0-5\]+, *r\[0-5\]+, *r\[0-5\]+, *0, *0, *9" { target arceb-*-* } } } */
diff --git a/gcc/testsuite/gcc.target/arc/movh_cl-1.c b/gcc/testsuite/gcc.target/arc/movh_cl-1.c
index 220cd9d..c643481 100644
--- a/gcc/testsuite/gcc.target/arc/movh_cl-1.c
+++ b/gcc/testsuite/gcc.target/arc/movh_cl-1.c
@@ -10,6 +10,9 @@  struct thing
     {
       unsigned a : 1;
       unsigned b : 1;
+      unsigned c : 28;
+      unsigned d : 1;
+      unsigned e : 1;
     };
   };
 };
@@ -24,4 +27,12 @@  blah ()
   func (xx.raw);
 }
 
+void
+woof ()
+{
+  struct thing xx;
+  xx.d = xx.e = 1;
+  func (xx.raw);
+}
+
 /* { dg-final { scan-assembler "movh\.cl r\[0-9\]+,0xc0000000>>16" } } */