Fix up swap peephole2 (PR target/92744)

Message ID 20191202090624.GV10088@tucnak
State New
Headers show
Series
  • Fix up swap peephole2 (PR target/92744)
Related show

Commit Message

Jakub Jelinek Dec. 2, 2019, 9:06 a.m.
On Mon, Dec 02, 2019 at 08:28:27AM +0100, Uros Bizjak wrote:
> > I'll have a look tomorrow.

> 

> general_reg_operand should be used in the pattern.


That indeed works, ok for trunk if it passes bootstrap/regtest?

2019-12-02  UroŇ° Bizjak  <ubizjak@gmail.com>
	    Jakub Jelinek  <jakub@redhat.com>

	PR target/92744
	* config/i386/i386.md (peephole2 for *swap<mode>): Use
	general_reg_operand predicates instead of register_operand.

	* g++.dg/dfp/pr92744.C: New test.



	Jakub

Comments

Uros Bizjak Dec. 2, 2019, 9:08 a.m. | #1
On Mon, Dec 2, 2019 at 10:06 AM Jakub Jelinek <jakub@redhat.com> wrote:
>

> On Mon, Dec 02, 2019 at 08:28:27AM +0100, Uros Bizjak wrote:

> > > I'll have a look tomorrow.

> >

> > general_reg_operand should be used in the pattern.

>

> That indeed works, ok for trunk if it passes bootstrap/regtest?

>

> 2019-12-02  UroŇ° Bizjak  <ubizjak@gmail.com>

>             Jakub Jelinek  <jakub@redhat.com>

>

>         PR target/92744

>         * config/i386/i386.md (peephole2 for *swap<mode>): Use

>         general_reg_operand predicates instead of register_operand.

>

>         * g++.dg/dfp/pr92744.C: New test.


OK.

Thanks,
Uros.

> --- gcc/config/i386/i386.md.jj  2019-11-19 10:28:18.187668272 +0100

> +++ gcc/config/i386/i386.md     2019-12-02 09:55:04.989644441 +0100

> @@ -2788,10 +2788,10 @@ (define_insn "*swap<mode>"

>     (set_attr "bdver1_decode" "double")])

>

>  (define_peephole2

> -  [(set (match_operand:SWI 0 "register_operand")

> -       (match_operand:SWI 1 "register_operand"))

> +  [(set (match_operand:SWI 0 "general_reg_operand")

> +       (match_operand:SWI 1 "general_reg_operand"))

>     (set (match_dup 1)

> -       (match_operand:SWI 2 "register_operand"))

> +       (match_operand:SWI 2 "general_reg_operand"))

>     (set (match_dup 2) (match_dup 0))]

>    "peep2_reg_dead_p (3, operands[0])

>     && optimize_insn_for_size_p ()"

> --- gcc/testsuite/g++.dg/dfp/pr92744.C.jj       2019-12-02 10:01:04.133064486 +0100

> +++ gcc/testsuite/g++.dg/dfp/pr92744.C  2019-12-02 10:00:31.577571093 +0100

> @@ -0,0 +1,20 @@

> +// PR target/92744

> +// { dg-do compile }

> +// { dg-options "-Os -fno-tree-ccp" }

> +

> +typedef float T __attribute__((mode(SD)));

> +struct A { T a; };

> +void foo ();

> +

> +bool

> +operator!= (A x, A y)

> +{

> +  return x.a != y.a;

> +}

> +

> +void

> +bar (A x, A y)

> +{

> +  if (x != y)

> +    foo ();

> +}

>

>

>         Jakub

>

Patch

--- gcc/config/i386/i386.md.jj	2019-11-19 10:28:18.187668272 +0100
+++ gcc/config/i386/i386.md	2019-12-02 09:55:04.989644441 +0100
@@ -2788,10 +2788,10 @@  (define_insn "*swap<mode>"
    (set_attr "bdver1_decode" "double")])
 
 (define_peephole2
-  [(set (match_operand:SWI 0 "register_operand")
-	(match_operand:SWI 1 "register_operand"))
+  [(set (match_operand:SWI 0 "general_reg_operand")
+	(match_operand:SWI 1 "general_reg_operand"))
    (set (match_dup 1)
-	(match_operand:SWI 2 "register_operand"))
+	(match_operand:SWI 2 "general_reg_operand"))
    (set (match_dup 2) (match_dup 0))]
   "peep2_reg_dead_p (3, operands[0])
    && optimize_insn_for_size_p ()"
--- gcc/testsuite/g++.dg/dfp/pr92744.C.jj	2019-12-02 10:01:04.133064486 +0100
+++ gcc/testsuite/g++.dg/dfp/pr92744.C	2019-12-02 10:00:31.577571093 +0100
@@ -0,0 +1,20 @@ 
+// PR target/92744
+// { dg-do compile }
+// { dg-options "-Os -fno-tree-ccp" }
+
+typedef float T __attribute__((mode(SD)));
+struct A { T a; };
+void foo ();
+
+bool
+operator!= (A x, A y)
+{
+  return x.a != y.a;
+}
+
+void
+bar (A x, A y)
+{
+  if (x != y)
+    foo ();
+}